: L: ~. R0 Y* v6 P9 a. |7 barrayCenter = [setup.roomDim(1:2)/2;1]; $ |& E" [ n# l ' F% X4 ~- Z3 [9 }2 ]arrayToSrcDistInt = [1,1]; 7 ^/ o. B( C8 d" y. J3 i; N 7 R3 g: V' V K- T& [6 `. ]; Isetup.srcPoint = [1.5;1;1]; . c7 [" [: }5 T* [/ c 3 k6 ?' f7 p, C e' L \setup.micPoints = generateUlaCoords(arrayCenter,setup.nSensors,setup.sensorDistance,0,arrayHeight);9 ~# v4 N. z8 J
; l' e- D0 [; q
: Z4 f% U+ o/ x# u$ ~
[cleanSignal,setup.sampFreq] = audioread('..\data\twoMaleTwoFemale20Seconds.wav'); ' N" Z1 d' ]5 B1 m# I ' l+ V# O' H( B' L; J%---------------------------------------------------initial end----------------------------------------4 u, g( j) v+ w3 E4 M) v9 K( {
9 ~ Y; s! M- b
0 d- H( f! y' {+ t$ r( f$ x8 c ! s0 b! F! k" O4 U5 M%-------------------------------algorithm processing-------------------------------------------------- ! @, V, A9 ~+ [- M) z* ^. f5 U' ]" @' w% N- n
if setup.reverbTime == 0,3 H# s* c! q' _( m' R
setup.reverbTime = 0.2; & i5 e. i N; g* f" P reflectionOrder = 0;; {1 H/ x: ^" D; D
else2 Y8 T& I& r6 i. ?/ O0 S
reflectionOrder = -1; . N1 Q' u2 Y, W& ?; D% nend2 ]( n$ { i' Z+ Y
: B3 M. r/ u5 ]; t: G) \rirMatrix = rir_generator(setup.speedOfSound,setup.sampFreq,setup.micPoints',setup.srcPoint',setup.roomDim',... ) O; w8 Y, ]4 @. r* W; u& H7 K setup.reverbTime,setup.nRirLength,setup.micType,setup.reflectionOrder,[],[],setup.hpFilterFlag);( T) l& V [7 M1 |% ]6 p. u/ @
2 d1 n1 I, X# p, z1 P J pfor iSens = 1:setup.nSensors,. N) A* S& c! X! b& p! z2 w
tmpCleanSignal(:,iSens) = fftfilt(rirMatrix(iSens,',cleanSignal);& q/ {& {; j Q# i4 V8 U4 X# m
end & u5 f$ @0 l' o! N+ qmcSignals.clean = tmpCleanSignal(setup.nRirLength:end,; ) D) K/ j5 S; w) X; [setup.nSamples = length(mcSignals.clean);, s' N8 F- O' s
; b* O! I7 G0 Y. j( \) g. m5 {mcSignals.clean = mcSignals.clean - ones(setup.nSamples,1)*mean(mcSignals.clean); ) e, t% i# \ w' {- R6 |+ j + o0 k/ `6 \0 `3 A; X5 u/ \%-------produce the microphone recieved clean signals--------------------------------------------- ( f1 r) I. A5 T- e Q. C" L/ v& D$ U R3 r# e B' K s
mic_clean1=10*mcSignals.clean(:,1); %Because of the attenuation of the recievd signals,Amplify the signals recieved by Mics with tenfold 8 j% z% Y1 [2 C6 l7 cmic_clean2=10*mcSignals.clean(:,2);" v( [" d1 g: h) u
mic_clean3=10*mcSignals.clean(:,3); R2 w) v: l' {2 G" _" b+ F
mic_clean4=10*mcSignals.clean(:,4);! _" g( [$ A3 i& @" u* M
audiowrite('mic_clean1.wav' ,mic_clean1,setup.sampFreq); 9 S1 |+ \) a2 V( L2 {& zaudiowrite('mic_clean2.wav' ,mic_clean2,setup.sampFreq);3 Y" C3 X) \$ d ^0 Y+ h
audiowrite('mic_clean3.wav' ,mic_clean3,setup.sampFreq);& A7 ^$ x* v0 ]0 I5 b
audiowrite('mic_clean4.wav' ,mic_clean4,setup.sampFreq); 6 I& G9 j: L/ z! C% R) O1 f, C5 u/ o7 P+ a6 P
%----------------------------------end-------------------------------------------------- & D. t3 v% J5 S0 n/ [" c ' ]* _, J- y" v% d3 w4 \7 qaddpath([cd,'\..\nonstationaryMultichanNoiseGenerator\']); T, X# D* Z1 U' q * e4 {$ |" n4 v6 q" q# j) hcleanSignalPowerMeas = var(mcSignals.clean);: Y. O# Q4 M/ u7 ]1 b
2 ]1 W3 @$ N$ Y! H+ N - d/ Y& s0 _7 L. BmcSignals.diffNoise = generateMultichanBabbleNoise(setup.nSamples,setup.nSensors,setup.sensorDistance,...& q' T; T6 X b# J Y' M+ o
setup.speedOfSound,setup.noiseField);8 s7 Y9 k& Z) U% z: u1 h
diffNoisePowerMeas = var(mcSignals.diffNoise); 9 v+ U8 F" C) ^+ a' wdiffNoisePowerTrue = cleanSignalPowerMeas/10^(setup.sdnr/10); 1 I* k( u6 E$ e5 O7 J4 CmcSignals.diffNoise = mcSignals.diffNoise*...( c3 J, o d& a$ c# N/ Y/ O
diag(sqrt(diffNoisePowerTrue)./sqrt(diffNoisePowerMeas)); 8 ?7 H2 @4 n" n8 R( v9 N% Q: H. A: m/ e4 `7 N. P* h
mcSignals.sensNoise = randn(setup.nSamples,setup.nSensors);# u* I) D! f5 X# l. B, Q" K
sensNoisePowerMeas = var(mcSignals.sensNoise);' ?4 E2 W7 r9 t, P$ {
sensNoisePowerTrue = cleanSignalPowerMeas/10^(setup.ssnr/10);8 s% A5 W, Y; s% q
mcSignals.sensNoise = mcSignals.sensNoise*...: i% S! z- A" T8 v" x/ n' {* i
diag(sqrt(sensNoisePowerTrue)./sqrt(sensNoisePowerMeas)); - s h( i; ^, W2 W$ c" I, C! k & m, p% _1 [7 C# J8 G. OmcSignals.noise = mcSignals.diffNoise + mcSignals.sensNoise;% j9 o S2 D% m% ?- q
mcSignals.observed = mcSignals.clean + mcSignals.noise; # A$ @) D x$ M& p3 H$ P& ^4 N 7 o e1 B1 [0 e$ M2 H5 C3 t' R9 _%------------------------------processing end-----------------------------------------------------------6 H% D) |+ p+ v. H
' k8 i0 S2 A! q7 }9 M
& v! X: H. L9 g& F# a6 K % s3 B a+ F" i/ Z8 V) b* S s3 p. R# d/ ^* t+ u+ H%----------------produce the noisy speech of MIc in the specific ervironment sets------------------------ : P2 {; x; v" m& k; t. ?' J6 k9 i* }3 D/ c: D T/ a
noisy_mix1=10*mcSignals.observed(:,1); %Amplify the signals recieved by Mics with tenfold& Q% q- l ?8 O8 }
noisy_mix2=10*mcSignals.observed(:,2);0 }4 p, J% }+ y! s' K7 T
noisy_mix3=10*mcSignals.observed(:,3);; a3 Y" ^- w9 F( e. k2 r
noisy_mix4=10*mcSignals.observed(:,4); / ~- _' a4 d$ ]( Z: _3 l/ Q1 i( Pl1=size(noisy_mix1); 2 X% f+ R. j/ S% A% L* Zl2=size(noisy_mix2);( a( z2 J9 t2 Y- t
l3=size(noisy_mix3); ) W3 F C/ c/ n+ ?* C3 u w& u2 dl4=size(noisy_mix4);- i; J5 z" d/ J/ J- E
audiowrite('diffused_babble_noise1_20dB.wav' ,noisy_mix1,setup.sampFreq);( F1 O( n. L$ S% l) L& m
audiowrite('diffused_babble_noise2_20dB.wav' ,noisy_mix2,setup.sampFreq);8 Q! A0 b. \# y, P, r
audiowrite('diffused_babble_noise3_20dB.wav' ,noisy_mix3,setup.sampFreq);* M; a# u! k4 Y; b5 ^9 s" F
audiowrite('diffused_babble_noise4_20dB.wav' ,noisy_mix4,setup.sampFreq);. g, m1 x S2 U8 A5 b
% ~2 d W3 B$ B ) G2 p# B3 `% o" [5 H1 n" ^%-----------------------------end------------------------------------------------------------------------- 1 B! z' d2 \4 `) B5 B, N o: d& \这个是主函数,直接运行尽可以得到想要的音频文件,但是你需要先给出你的纯净音频文件和噪声音频,分别对应着:multichannelSignalGenerator()函数中的语句:[cleanSignal,setup.sampFreq] = audioread('..\data\twoMaleTwoFemale20Seconds.wav'),和generateMultichanBabbleNoise()函数中的语句:[singleChannelData,samplingFreq] = audioread('babble_8kHz.wav') 。5 w+ c( c \7 {
直接把它们替换成你想要处理的音频文件即可。. O, I) [' F' z
* j& M6 a' W) c& Q3 t/ O, s
除此之外,还有一些基本实验环境参数设置,包括:麦克风的形状为线性麦克风阵列(该代码只能对线性阵列进行仿真建模,并且还是均匀线性阵列,这个不需要设置);麦克风的类型(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)。9 l8 `" C( p/ N
* f, M5 U6 c8 v% Y. C & Y1 Q e0 A. g- P0 ^' @6 S
9 S0 i9 k( ]) J图1 麦克风类型图 : ?* j+ y2 O; v; C. [2 o9 R2 Y0 h2 p' K5 a! l0 Y
图二 房间的坐标系7 x! Q" D( E. C, b& {5 F y+ Q& k