- G0 @+ _$ |* M. V3 ScleanSignalPowerMeas = var(mcSignals.clean);( J R# m( ]" V" X/ [8 _
4 @5 ?9 c8 I! l
5 L: H5 L Y E1 a, N# Q/ l' ^$ X
mcSignals.diffNoise = generateMultichanBabbleNoise(setup.nSamples,setup.nSensors,setup.sensorDistance,.... K9 P! J6 e0 ~$ m1 ?$ T5 L$ n6 s
setup.speedOfSound,setup.noiseField); ' g5 ^9 c5 v+ c& x( }" k2 j3 rdiffNoisePowerMeas = var(mcSignals.diffNoise);3 B3 ^! y0 l2 x: a
diffNoisePowerTrue = cleanSignalPowerMeas/10^(setup.sdnr/10); 1 f/ U- T# H! {" R* Y$ @( f, SmcSignals.diffNoise = mcSignals.diffNoise*...* N7 w* J8 m' ?0 j4 y5 s
diag(sqrt(diffNoisePowerTrue)./sqrt(diffNoisePowerMeas));/ |5 |4 v+ v$ L
0 d8 ?1 i1 t, Q q# b) G+ l& bmcSignals.sensNoise = randn(setup.nSamples,setup.nSensors); , u. s7 }$ z0 R1 E4 w. O0 osensNoisePowerMeas = var(mcSignals.sensNoise);3 k: P8 t a9 h# q" U
sensNoisePowerTrue = cleanSignalPowerMeas/10^(setup.ssnr/10); , G# j, N, Q* K+ @: P( _mcSignals.sensNoise = mcSignals.sensNoise*... / J% u2 i4 Q _( M2 }; y) K diag(sqrt(sensNoisePowerTrue)./sqrt(sensNoisePowerMeas));0 C; P2 b9 e6 o [
; j3 f3 p+ a8 O# d( C- ]; j/ B9 w
mcSignals.noise = mcSignals.diffNoise + mcSignals.sensNoise; ; g a% s# \1 C2 JmcSignals.observed = mcSignals.clean + mcSignals.noise;2 n4 S6 V" j3 k0 a9 ?: n
9 l, j& |$ }4 A
%------------------------------processing end----------------------------------------------------------- + I* m( J$ g/ U0 O3 |8 t) ~7 B# B7 z# p9 b
0 ~0 @* E; y# ]; D1 h
' O$ }5 r! ^- c& G6 Y7 x( f. H$ H: z+ y( I4 @
%----------------produce the noisy speech of MIc in the specific ervironment sets------------------------9 P9 A$ d2 T% w
% X/ a. M0 j. K6 Z. @8 i! b7 G+ Bnoisy_mix1=10*mcSignals.observed(:,1); %Amplify the signals recieved by Mics with tenfold; a6 l! U4 u" j2 p; [$ Y
noisy_mix2=10*mcSignals.observed(:,2); $ Y5 T( ~3 u& ], ]* b3 u. y4 Jnoisy_mix3=10*mcSignals.observed(:,3); ( P# r: `$ n; C: E1 m4 V, N, s( inoisy_mix4=10*mcSignals.observed(:,4); 5 s3 y5 k8 k5 f5 i; T( Dl1=size(noisy_mix1);; N7 o1 x* w _: S3 R, [
l2=size(noisy_mix2);4 ]' V( G2 e! |6 g& [) u
l3=size(noisy_mix3); 8 m0 p ]0 R7 l1 R9 Al4=size(noisy_mix4);0 ]8 `. D9 _+ g! ?% o
audiowrite('diffused_babble_noise1_20dB.wav' ,noisy_mix1,setup.sampFreq); " ^' h+ ^- k, P$ f4 Aaudiowrite('diffused_babble_noise2_20dB.wav' ,noisy_mix2,setup.sampFreq);" J3 C0 F, |" ~6 k( W: x
audiowrite('diffused_babble_noise3_20dB.wav' ,noisy_mix3,setup.sampFreq); . [+ O) n9 v. F7 Daudiowrite('diffused_babble_noise4_20dB.wav' ,noisy_mix4,setup.sampFreq);: v" T7 x* k/ G. G: w( ^ t
- V; u* s2 r2 e* B
' z3 Z7 x3 v. X
%-----------------------------end------------------------------------------------------------------------- ; D5 i9 v5 }3 L: |4 \5 d; p9 _$ b这个是主函数,直接运行尽可以得到想要的音频文件,但是你需要先给出你的纯净音频文件和噪声音频,分别对应着:multichannelSignalGenerator()函数中的语句:[cleanSignal,setup.sampFreq] = audioread('..\data\twoMaleTwoFemale20Seconds.wav'),和generateMultichanBabbleNoise()函数中的语句:[singleChannelData,samplingFreq] = audioread('babble_8kHz.wav') 。6 P- r. j8 K* z# k) t! j9 M
直接把它们替换成你想要处理的音频文件即可。* E4 _" g' {1 B+ P# f
6 _6 m9 R: ~* [& a* D( I7 `9 ~ 除此之外,还有一些基本实验环境参数设置,包括:麦克风的形状为线性麦克风阵列(该代码只能对线性阵列进行仿真建模,并且还是均匀线性阵列,这个不需要设置);麦克风的类型(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)。 - i6 ^2 L) F" x % C& @ p3 }* }" F' c9 X( j [9 {0 A
. _. P; h" C9 T0 X# z ^
图1 麦克风类型图: U" F3 s3 @, W ) u+ C+ r' ~5 w5 {4 I6 r1 E
图二 房间的坐标系 # c, r5 ]: |! Q4 w, A& w8 a1 B( g7 { t0 F" [2 G B$ `
以上便是整个仿真实验环境的参数配置,虽然只能对均匀线性的麦克风阵列进行实验测试,但是这对满足我们进行线阵阵列算法的测试是有很大的帮助。说到底,这种麦克风阵列环境的音频数据产生方法还是基于数学模型的仿真,并不可能取代实际的硬件实验环境测试,所以要想在工程上实现麦克风阵列的一些算法,仍然避免不了在实际的环境中进行测试。最后,希望分享的这套代码对大家进行麦克风阵列算法的入门提供帮助。 2 c e- {! m/ H———————————————— : Y. d: K( [+ v) ` C5 Q, Y版权声明:本文为CSDN博主「Mr_Researcher」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 0 V) v5 m. |. s. M原文链接:https://blog.csdn.net/zhanglu_wind/article/details/79674998, Q( d) T2 r5 y& G, v( Y0 f
! L% \% I! g4 w. @5 k p' `! B9 N8 u0 i+ m4 |" V, k3 K$ T