c4 x, L4 d u, s& _mic_clean1=10*mcSignals.clean(:,1); %Because of the attenuation of the recievd signals,Amplify the signals recieved by Mics with tenfold $ Q& K5 e0 z' b+ I! Q qmic_clean2=10*mcSignals.clean(:,2);4 N' ~- P `; Z; V k
mic_clean3=10*mcSignals.clean(:,3);" O: C" `' d, D$ h% [6 K5 h3 `
mic_clean4=10*mcSignals.clean(:,4);7 I6 n5 R2 ^% W9 Q; P$ h! u
audiowrite('mic_clean1.wav' ,mic_clean1,setup.sampFreq); ; e* I* v$ `# L9 g. U( Raudiowrite('mic_clean2.wav' ,mic_clean2,setup.sampFreq);0 U6 M, F! O1 A4 q
audiowrite('mic_clean3.wav' ,mic_clean3,setup.sampFreq);- @+ a5 e; T6 f7 i) i- y9 r8 K
audiowrite('mic_clean4.wav' ,mic_clean4,setup.sampFreq);7 _( [3 `$ H1 P$ Y& R( G @
e! i1 y/ z5 O u# w0 T5 d
%----------------------------------end--------------------------------------------------9 d0 F( F3 z. d' ?7 V4 ^# A0 Q
, O5 H; i( D) t. c3 J; A
addpath([cd,'\..\nonstationaryMultichanNoiseGenerator\']);# b% \% F" H3 o; M ]) o5 a
. q# g# l4 h7 z9 P; HcleanSignalPowerMeas = var(mcSignals.clean);' Y E- }4 x/ C _# \
! B0 }% R+ g3 k & Z4 B5 K% q3 ?& X( M: j. {. P. `mcSignals.diffNoise = generateMultichanBabbleNoise(setup.nSamples,setup.nSensors,setup.sensorDistance,..." U) t6 l- Q" M' {
setup.speedOfSound,setup.noiseField); . t4 Y. I% C( Z( X3 } M$ SdiffNoisePowerMeas = var(mcSignals.diffNoise); $ f$ {) o) c8 [0 w3 p' y( {0 \5 WdiffNoisePowerTrue = cleanSignalPowerMeas/10^(setup.sdnr/10); 3 f3 b! v: f* i! s) BmcSignals.diffNoise = mcSignals.diffNoise*.../ B* v7 Q2 D- w9 K& ?' \) c
diag(sqrt(diffNoisePowerTrue)./sqrt(diffNoisePowerMeas)); 6 f3 \1 h j# C W c0 J' X0 x( T/ ? |3 w3 A bmcSignals.sensNoise = randn(setup.nSamples,setup.nSensors); " I8 I) w4 Y/ G& |sensNoisePowerMeas = var(mcSignals.sensNoise); 8 p5 d u5 [2 {8 B- V2 wsensNoisePowerTrue = cleanSignalPowerMeas/10^(setup.ssnr/10); ! P. |* H7 b) V! ~$ L3 @mcSignals.sensNoise = mcSignals.sensNoise*... / I6 n* N, Z7 s diag(sqrt(sensNoisePowerTrue)./sqrt(sensNoisePowerMeas)); x$ j& _* n& T3 b! H" t 1 m" `6 H1 x0 j |mcSignals.noise = mcSignals.diffNoise + mcSignals.sensNoise;& m% N! r$ P/ W, e0 \0 | D! F
mcSignals.observed = mcSignals.clean + mcSignals.noise; 1 t$ A3 w( w9 ?: K& F+ v% ^' A. v. z& K" @0 j4 s- |4 I/ P
%------------------------------processing end-----------------------------------------------------------! V8 r( c. v; b* C0 A: q
2 o- ^2 i4 W2 c& L n4 R/ ?9 ?4 I+ h1 Y; F2 c8 I3 c, s
, ^: T j! r. Y% ]6 ?# A
3 J$ ~: a6 Q. B* Y%----------------produce the noisy speech of MIc in the specific ervironment sets------------------------3 w' P7 U* E# C4 A/ e, n& I$ s
m* k$ Q. O9 z5 q3 Dnoisy_mix1=10*mcSignals.observed(:,1); %Amplify the signals recieved by Mics with tenfold7 D- w) y$ t! V8 R
noisy_mix2=10*mcSignals.observed(:,2); 2 w0 z$ e6 M8 P' h( Cnoisy_mix3=10*mcSignals.observed(:,3); ) M1 u9 Q7 J; O/ K& I7 u1 W4 lnoisy_mix4=10*mcSignals.observed(:,4); ) M+ o/ | z/ Y/ X. E# Fl1=size(noisy_mix1);# Y+ z! q" U' w% h8 f
l2=size(noisy_mix2);8 F s( \1 a" J
l3=size(noisy_mix3); , `/ z! ^1 i! \l4=size(noisy_mix4);9 u. q; C6 q- g2 t N
audiowrite('diffused_babble_noise1_20dB.wav' ,noisy_mix1,setup.sampFreq);) I) n, j- N7 [* o& k
audiowrite('diffused_babble_noise2_20dB.wav' ,noisy_mix2,setup.sampFreq);7 i O( r5 m: u4 O8 R
audiowrite('diffused_babble_noise3_20dB.wav' ,noisy_mix3,setup.sampFreq);" a- y. V( e; C# E, q) W
audiowrite('diffused_babble_noise4_20dB.wav' ,noisy_mix4,setup.sampFreq);& r6 _5 |. g' ]: g
6 {* A W5 F Y. E( a
- s: h6 i- i3 K* ^
%-----------------------------end------------------------------------------------------------------------- 7 d( b* ~6 j6 A( j5 o+ ~这个是主函数,直接运行尽可以得到想要的音频文件,但是你需要先给出你的纯净音频文件和噪声音频,分别对应着:multichannelSignalGenerator()函数中的语句:[cleanSignal,setup.sampFreq] = audioread('..\data\twoMaleTwoFemale20Seconds.wav'),和generateMultichanBabbleNoise()函数中的语句:[singleChannelData,samplingFreq] = audioread('babble_8kHz.wav') 。 % \6 E6 X* j( @直接把它们替换成你想要处理的音频文件即可。 5 C# H* v% q5 _, Q' E1 C1 i# M- ]! N9 B% Q) \5 g
除此之外,还有一些基本实验环境参数设置,包括:麦克风的形状为线性麦克风阵列(该代码只能对线性阵列进行仿真建模,并且还是均匀线性阵列,这个不需要设置);麦克风的类型(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 U$ A1 E1 {- q3 A/ V3 v% _8 [+ O- G/ t9 Y # ^; k0 A! w- [5 F7 ~ * r# I- K% m0 h! h/ s! j图1 麦克风类型图 & b( F, ^$ I, g6 x! K& z7 x7 w7 O5 A# e- t" ^: G" s v
图二 房间的坐标系7 C) y3 o+ |, p& ]% D0 g& E
2 x5 {% ^8 H/ f& A 以上便是整个仿真实验环境的参数配置,虽然只能对均匀线性的麦克风阵列进行实验测试,但是这对满足我们进行线阵阵列算法的测试是有很大的帮助。说到底,这种麦克风阵列环境的音频数据产生方法还是基于数学模型的仿真,并不可能取代实际的硬件实验环境测试,所以要想在工程上实现麦克风阵列的一些算法,仍然避免不了在实际的环境中进行测试。最后,希望分享的这套代码对大家进行麦克风阵列算法的入门提供帮助。 ) ?5 z; n5 I& _7 _* S1 l0 c———————————————— ( g [9 D8 r/ y( d9 A# E版权声明:本文为CSDN博主「Mr_Researcher」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。' W9 [$ ?- T+ T: J0 ?/ @
原文链接:https://blog.csdn.net/zhanglu_wind/article/details/796749984 R, d$ ?; J9 ` L/ h
( B) H* P: n' }+ O3 B8 j' p. o5 W/ m: G