. d( U' C4 O' K# Z, \setup.roomDim = [3;4;3]; 9 X6 G8 d, a7 X2 ~& x7 V. z8 X2 S2 z X$ K+ b( H
srcHeight = 1; ; W; l9 O7 O' w/ }: TarrayHeight = 1; + W% h/ X) `( f6 S/ A Y: o @5 M5 e+ U* D) }) Y' s4 N
arrayCenter = [setup.roomDim(1:2)/2;1]; : s$ {! T7 P: ~ 7 c) Q7 N+ K, }8 qarrayToSrcDistInt = [1,1]; * y. [# m |% {9 n/ Y2 D" k8 W: h- F+ y* B+ I
setup.srcPoint = [1.5;1;1];0 }3 o F) u$ `) R" S$ B- m
! v, S# ]. v6 I- A
setup.micPoints = generateUlaCoords(arrayCenter,setup.nSensors,setup.sensorDistance,0,arrayHeight);6 x' r5 Q' e1 z" \' h" s
. ~! I6 e- z( y& Q6 o s2 Z9 V' y' s% b, F' O {# r
[cleanSignal,setup.sampFreq] = audioread('..\data\twoMaleTwoFemale20Seconds.wav'); 1 _8 H4 M% z. Z: L 2 o# w1 ^$ A, u- X3 b%---------------------------------------------------initial end---------------------------------------- ; V9 g2 }3 m6 ?. x* K s# k6 h1 e7 ?3 _) {; b+ D
6 U7 f3 T! f4 V& X9 i
# Q/ ?9 _: U z* @6 j%-------------------------------algorithm processing--------------------------------------------------: k: q# R' p7 L3 m1 V
+ l. h( _ s0 y" |% y' L
if setup.reverbTime == 0, ; O* J, Y8 }8 m7 H% T0 [ setup.reverbTime = 0.2; ( B1 I0 |. r! }# H' u9 { reflectionOrder = 0;, b6 c d' ~$ t. ]
else - s8 ]( k* v& u& [$ d. `$ X2 J/ p reflectionOrder = -1; 0 J+ C$ k$ G; j3 _' L! send ( ]9 ]6 A* }/ N3 j3 d9 [, p Q" z% y + t& x0 c f9 e7 l4 |! M- L- DrirMatrix = rir_generator(setup.speedOfSound,setup.sampFreq,setup.micPoints',setup.srcPoint',setup.roomDim',.../ S' n7 d) g0 n) f. ~# m1 K9 t
setup.reverbTime,setup.nRirLength,setup.micType,setup.reflectionOrder,[],[],setup.hpFilterFlag);: o2 r& d. z4 u8 m# {7 r
$ ` o( ]0 V9 w2 R: e
for iSens = 1:setup.nSensors,9 o( @0 d V7 ?8 M# i4 C
tmpCleanSignal(:,iSens) = fftfilt(rirMatrix(iSens,',cleanSignal);# g1 s! C9 S6 I; _' H8 [
end2 |. {. L$ \" n# w9 J$ c
mcSignals.clean = tmpCleanSignal(setup.nRirLength:end,;9 g. I9 j' p! v. z
setup.nSamples = length(mcSignals.clean);5 w& A* s0 v) s; N
/ n& o, W1 p$ A+ ^* c
mcSignals.clean = mcSignals.clean - ones(setup.nSamples,1)*mean(mcSignals.clean);8 o8 ?" R2 C- Z* d6 q* [
4 b9 ~4 r) b7 n* R% t% A% Y; M
%-------produce the microphone recieved clean signals--------------------------------------------- " j8 S) Z2 v4 H% }/ x; M6 \' W; Q, N* l5 z
mic_clean1=10*mcSignals.clean(:,1); %Because of the attenuation of the recievd signals,Amplify the signals recieved by Mics with tenfold, N6 P& g1 j' ]6 B1 O& i- L
mic_clean2=10*mcSignals.clean(:,2); , e. Q4 J4 L5 n3 h2 m4 emic_clean3=10*mcSignals.clean(:,3);% b1 ?3 T: L0 L! z3 R0 e
mic_clean4=10*mcSignals.clean(:,4);: r6 S' L) J, F L5 S% d
audiowrite('mic_clean1.wav' ,mic_clean1,setup.sampFreq); B [. F, u; k2 C) u) y
audiowrite('mic_clean2.wav' ,mic_clean2,setup.sampFreq);' S4 l7 X/ h+ `# p
audiowrite('mic_clean3.wav' ,mic_clean3,setup.sampFreq);7 V S+ `$ d2 r& y
audiowrite('mic_clean4.wav' ,mic_clean4,setup.sampFreq); ( h; H) n3 N& B8 ~% {: g7 f5 U# q. o0 A) I# B
%----------------------------------end-------------------------------------------------- / ]5 U6 B8 K8 t- X5 ~* |9 t, f' B+ b \# `5 Y1 h3 r. l) u6 d
addpath([cd,'\..\nonstationaryMultichanNoiseGenerator\']); % M+ v E5 v! w8 K7 `' u! T3 \2 g8 h9 m; H/ f( n- H8 R* J
cleanSignalPowerMeas = var(mcSignals.clean); ; g0 e! l4 N4 D$ k. K1 j$ y' I & U$ m0 f7 m! V9 F" Z0 [ 4 l0 s2 F1 M- a/ Q( L$ zmcSignals.diffNoise = generateMultichanBabbleNoise(setup.nSamples,setup.nSensors,setup.sensorDistance,...( k% s% W, T3 J# P: r" Z, U* `" z
setup.speedOfSound,setup.noiseField);2 P' q, Z( v9 v$ S2 f
diffNoisePowerMeas = var(mcSignals.diffNoise); ! R( f3 Z. [+ z) gdiffNoisePowerTrue = cleanSignalPowerMeas/10^(setup.sdnr/10);9 Y3 w$ H0 c) _: h6 G- j, Q$ K9 z
mcSignals.diffNoise = mcSignals.diffNoise*...' C4 [% C1 @1 F
diag(sqrt(diffNoisePowerTrue)./sqrt(diffNoisePowerMeas));! {) V1 E$ c% _- s2 d
4 S/ L$ d3 Y% P/ n7 @$ CmcSignals.sensNoise = randn(setup.nSamples,setup.nSensors); , d+ i: m( ~9 T; h$ f+ K! T# D msensNoisePowerMeas = var(mcSignals.sensNoise);2 c. n+ I4 @ ?: }6 h
sensNoisePowerTrue = cleanSignalPowerMeas/10^(setup.ssnr/10); 8 B7 }2 q% C: r9 I5 I" amcSignals.sensNoise = mcSignals.sensNoise*... : z# @5 i+ V! ^0 h diag(sqrt(sensNoisePowerTrue)./sqrt(sensNoisePowerMeas)); ) A. \5 ~/ }1 T7 R! }. H; O . M5 ~ l9 B6 K) _; ?mcSignals.noise = mcSignals.diffNoise + mcSignals.sensNoise; 0 y+ r5 M3 Z0 u# g$ J) {: A4 q) d( f1 wmcSignals.observed = mcSignals.clean + mcSignals.noise; # L" N' V) V5 W1 N- }3 i# a. _3 V" V; m, {. ]
%------------------------------processing end-----------------------------------------------------------) C* P. u2 m6 K
1 A. P7 S8 W0 m
3 O# h1 n! \6 F, q2 X, p4 ^
* {+ H0 Z+ u) i4 q1 C- G0 J7 P n C5 V$ s3 ^ { D
%----------------produce the noisy speech of MIc in the specific ervironment sets------------------------0 M3 i8 b: a; h) l4 O+ V @* ?
' z6 W8 @- R2 F. h- Y2 pnoisy_mix1=10*mcSignals.observed(:,1); %Amplify the signals recieved by Mics with tenfold# E' ?0 l% l! V' F' y5 f
noisy_mix2=10*mcSignals.observed(:,2);( i2 {) `7 O0 |2 @( s
noisy_mix3=10*mcSignals.observed(:,3);7 q" d' w* a1 z. R' ?
noisy_mix4=10*mcSignals.observed(:,4); 7 y( t& {( f+ @5 F* Jl1=size(noisy_mix1); $ b( H# K6 G' G- A9 @l2=size(noisy_mix2); * i: {& `& `; m z. m+ h5 }l3=size(noisy_mix3); " ~6 O8 L9 k P- j+ z! {l4=size(noisy_mix4);- {' J6 W* f7 P( h3 V$ K0 W
audiowrite('diffused_babble_noise1_20dB.wav' ,noisy_mix1,setup.sampFreq);% o& v( F$ Y! e8 a8 Y, Q
audiowrite('diffused_babble_noise2_20dB.wav' ,noisy_mix2,setup.sampFreq); $ n& v, Y7 r% |& [! saudiowrite('diffused_babble_noise3_20dB.wav' ,noisy_mix3,setup.sampFreq);" y" y- H' O$ y' N8 q1 ~* V
audiowrite('diffused_babble_noise4_20dB.wav' ,noisy_mix4,setup.sampFreq); * \! W6 @1 O: j: X# a0 T; k$ v 8 s* S! Q% J8 P; j4 h: e6 f+ s9 h2 J: g; r5 i
%-----------------------------end------------------------------------------------------------------------- / n% D2 O+ p# b" }' d# e; ]* W6 r这个是主函数,直接运行尽可以得到想要的音频文件,但是你需要先给出你的纯净音频文件和噪声音频,分别对应着:multichannelSignalGenerator()函数中的语句:[cleanSignal,setup.sampFreq] = audioread('..\data\twoMaleTwoFemale20Seconds.wav'),和generateMultichanBabbleNoise()函数中的语句:[singleChannelData,samplingFreq] = audioread('babble_8kHz.wav') 。 9 E w' k( G. l! P直接把它们替换成你想要处理的音频文件即可。% O7 B' z1 r3 [2 _; M* Z
5 e: D3 ]& k+ g% z
除此之外,还有一些基本实验环境参数设置,包括:麦克风的形状为线性麦克风阵列(该代码只能对线性阵列进行仿真建模,并且还是均匀线性阵列,这个不需要设置);麦克风的类型(micType),有全指向型(omnidirectional),心型指向(cardioid),亚心型指向(subcardioid,不知道咋翻译,请见谅) , 超心型(hypercardioid), 双向型(bidirectional),一般默认是全指向型,如下图1所示;麦克风的数量(nSensors);各麦克风之间的间距(sensorDistance);麦克风阵列的中心位置(arrayCenter),用(x,y,z)坐标来表示;麦克风阵列的高度(arrayHeight),感觉和前面的arrayCenter有所重复,不知道为什么还要设置这么一个参数;目标声源的位置(srcPoint),也是用(x,y,z)坐标来表示;目标声源的高度(srcHeight);麦克风阵列距离目标声源的距离(arrayToSrcDistInt),是在xy平面上的投影距离;房间的大小(roomDim),另外房间的(x,y,z)坐标系如图2所示;房间的混响时间(reverbTime);散漫噪声场的类型(noiseField),分为球形场(spherical)和圆柱形场(cylindrical)。1 Z2 j( G9 ]- K
c9 X; j3 T* L7 S0 s3 P 9 j5 @6 z1 C! C0 f! C+ p2 A6 G# {9 ^' r) ]
图1 麦克风类型图 4 x4 |8 Y9 a2 l% g( x M* r& i, u3 Q$ E& C/ U
图二 房间的坐标系+ \. N# M' D& [9 E
( m1 t+ e- y! U8 I* X& `& E 以上便是整个仿真实验环境的参数配置,虽然只能对均匀线性的麦克风阵列进行实验测试,但是这对满足我们进行线阵阵列算法的测试是有很大的帮助。说到底,这种麦克风阵列环境的音频数据产生方法还是基于数学模型的仿真,并不可能取代实际的硬件实验环境测试,所以要想在工程上实现麦克风阵列的一些算法,仍然避免不了在实际的环境中进行测试。最后,希望分享的这套代码对大家进行麦克风阵列算法的入门提供帮助。, v8 S# K3 e: T! i( @
———————————————— , F0 p3 ~5 `% P. u S' z0 p6 @版权声明:本文为CSDN博主「Mr_Researcher」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 8 C7 p" e* o5 T5 {/ l" }% f原文链接:https://blog.csdn.net/zhanglu_wind/article/details/79674998' x; L8 I$ @, [$ {- Q& }
2 @1 X. U' R& x0 w8 A
& |+ z0 R5 ?9 V1 K1 ] K& F. V