- 在线时间
- 791 小时
- 最后登录
- 2022-11-28
- 注册时间
- 2017-6-12
- 听众数
- 15
- 收听数
- 0
- 能力
- 120 分
- 体力
- 36311 点
- 威望
- 11 点
- 阅读权限
- 255
- 积分
- 13854
- 相册
- 0
- 日志
- 0
- 记录
- 1
- 帖子
- 616
- 主题
- 542
- 精华
- 12
- 分享
- 0
- 好友
- 225
TA的每日心情 | 开心 2020-11-14 17:15 |
|---|
签到天数: 74 天 [LV.6]常住居民II
 群组: 2019美赛冲刺课程 群组: 站长地区赛培训 群组: 2019考研数学 桃子老师 群组: 2018教师培训(呼伦贝 群组: 2019考研数学 站长系列 |
1. 引言. r* }6 ?' v, \$ u7 T1 S
之前,我在语音增强一文中,提到了有关麦克风阵列语音增强的介绍,当然,麦克风阵列能做的东西远远不只是在语音降噪上的应用,它还可以用来做声源定位、声源估计、波束形成、回声抑制等。个人认为,麦克风阵列在声源定位和波束形成(多指抑制干扰语音方面)的优势是单通道麦克风算法无法比拟的。因为,利用多麦克风以后,就会将空间信息考虑到算法中,这样就特别适合解决一些与空间相关性很强的语音处理问题。$ w2 s6 ]2 S" x. G- G
) L+ F" l5 V: D+ S6 r$ g4 ~! s
然而,在做一些麦克风阵列相关的算法研究的时候,最先遇到的问题就是:实验环境的搭建。很多做麦克风阵列的爱好者并没有实际的硬件实验环境,这也就成了很多人进行麦克风阵列入门的难题。这里,我要分享的是爱丁堡大学语音实验室开源的基于MATLAB的麦克风阵列实验仿真环境。利用该仿真环境,我们就可以随意的设置房间的大小,混响程度,声源方向以及噪声等基本参数,然后得到我们想要的音频文件去测试你自己相应的麦克风阵列算法。
n4 P |* C) Q) C! K5 G7 `2 F
% l8 R! P: m6 K$ C R2. 代码介绍
$ l; r% H- c( s, u4 ]2 o0 o9 E 原始的代码被我加以修改,也是为了更好的运行,如果有兴趣的话,大家还可以参考爱丁堡大学最初的源码,并且我也上传到我的CSDN码云上了,链接是:https://gitee.com/wind_hit/Microphone-Array-Simulation-Environment。 这套MATLAB代码的主函数是multichannelSignalGenerator(),具体如下:
2 h$ B3 w+ L9 R) I, F' e( m! H2 R0 afunction [mcSignals,setup] = multichannelSignalGenerator(setup)' \* W. J; N' R- L5 L% \% ^5 p/ B
$ B, F% D& ]; \5 [/ |9 h3 h
( z L4 |6 s. t%-----------------------------------------------------------------------
, I% `+ V3 A$ m9 E* a5 w; L% Producing the multi_noisy_signals for Mic array Beamforming.1 B' x3 c) N. Y9 l- r+ g, J
%
2 ?9 s; t* Y! T* I% Usage: multichannelSignalGenerator(setup)* s& A6 `; `; N5 l4 R% a
%
1 {% ]% r; Y r. s% setup.nRirLength : The length of Room Impulse Response Filter
# S5 L, _# W# r, F% setup.hpFilterFlag : use 'false' to disable high-pass filter, the high-%pass filter is enabled by default# g! `0 p$ [' N" r5 T8 h0 Q
% setup.reflectionOrder : reflection order, default is -1, i.e. maximum order.4 p7 |( D& N! Y) k
% setup.micType : [omnidirectional, subcardioid, cardioid, hypercardioid, bidirectional], default is omnidirectional.$ t5 Q1 _, S/ p9 t+ o. ~2 t
%
& q1 i/ l0 X: v! @6 C% setup.nSensors : The numbers of the Mic
4 G5 e- u" V5 P4 z% setup.sensorDistance : The distance between the adjacent Mics (m)5 _$ x/ f, x2 R2 Z
% setup.reverbTime : The reverberation time of room9 w. A, M2 w* z' R
% setup.speedOfSound : sound velocity (m/s)
/ g$ t& ~8 C( L3 _2 f2 c%; j7 ^- s% h! m; r3 Q9 v9 S8 Y
% setup.noiseField : Two kinds of Typical noise field, 'spherical' and 'cylindrical'
3 ~1 s& U" ]/ q% setup.sdnr : The target mixing snr for diffuse noise and clean siganl.' U& f; Z' C* w" H
% setup.ssnr : The approxiated mixing snr for sensor noise and clean siganl.
2 b7 e; h8 Q% p0 u0 k( w* _%
4 b& n. S) N a% a5 G% setup.roomDim : 1 x 3 array specifying the (x,y,z) coordinates of the room (m). ! f7 n: X$ D3 u6 ?" y$ F" h
% setup.micPoints : 3 x M array, the rows specifying the (x,y,z) coordinates of the mic postions (m).
3 V f9 i! {6 t0 j$ o" Q% setup.srcPoint : 3 x M array, the rows specifying the (x,y,z) coordinates of the audio source postion (m). & P' Y* D3 _, p% M- _& ?3 Y
%
! B( y: D3 q! p) N, U2 I- L1 Y; w% srcHeight : The height of target audio source0 X* S3 D! Z: X8 |2 M! n
% arrayHeight : The height of mic array3 ~ Y5 ?5 a' {# R) J
%
) ?* t( v: K& y% a9 |: j% arrayCenter : The Center Postion of mic array
/ v3 i6 h+ ` O8 W%
1 e% U9 o8 ~6 Q) o% arrayToSrcDistInt :The distance between the array and audio source on the xy axis2 W) ~* C3 x0 b; v
%& K/ Z9 t+ P6 v, S5 Y( c/ Q
% + X4 F. F T; g* H0 n
%
% F* X; @3 v8 B%
( F8 {2 s' Z/ ]6 _% o: ]% 6 D& w& M4 V+ S. N1 M
%
5 R: k/ h3 Q4 p0 U% How To Use : JUST RUN, k" n A/ ?0 M8 _. t
%( Q8 L- o$ Z9 k$ Z, A
%
, E- D- ]9 q9 t4 w7 }, v%
8 d0 |( H a+ v! L+ |. F% Code From: Audio analysis Lab of Aalborg University (Website: https://audio.create.aau.dk/),
4 m2 O/ v5 V, y5 Z6 I- y3 L" e" [% slightly modified by Wind at Harbin Institute of Technology, Shenzhen, in 2018.3.24
1 Y, h$ n P+ o# r- k%
% P1 @1 j, j( |* t* \% Copyright (C) 1989, 1991 Free Software Foundation, Inc.$ w( u2 K/ p" _& i
%-------------------------------------------------------------------------6 B+ @6 H$ d* j, M
0 {+ J! W3 k, }. w* C5 F# x% J. d6 ~% e6 d
] z; }6 P5 V. x. x# ]. R4 [addpath([cd,'\..\rirGen\']);# a2 [8 i; J4 e! L1 O% h
, w' f! y1 ?' ~, [) k
%-----------------------------------------------initial parameters-----------------------------------! i& B5 C: Y# H, z1 x h8 E2 E
+ a9 i. x, L: K. z! R$ ?+ e5 n
setup.nRirLength = 2048;1 o1 ]* F# C1 B: |
setup.hpFilterFlag = 1;
) X' [$ j: A2 \7 s& E6 hsetup.reflectionOrder = -1;' d0 D& h9 v8 u! K
setup.micType = 'omnidirectional';$ g/ `6 x t0 O: g* R. w+ x! D
setup.nSensors = 4;
0 |6 D+ R* Y8 q) B( vsetup.sensorDistance = 0.05;
! l9 x! q' K& K1 K: xsetup.reverbTime = 0.1;
$ p. J4 H5 B1 H" s/ d9 H- w! Ksetup.speedOfSound = 340;6 V' C, n" ]. G8 Q4 F9 |; z
( e; l9 z5 H8 y1 e9 }+ bsetup.noiseField = 'spherical';0 B K9 a3 q; p, Q& {% T
setup.sdnr = 20;
4 L# c+ j- T; g. [4 Z8 S+ U) Jsetup.ssnr = 25;+ E2 _- T3 ?: G1 ?% H0 y, K
8 n: J: {# y. Q, U# S/ K0 u
setup.roomDim = [3;4;3];
3 U5 U" c3 d0 p, N- _5 A: i* ^
2 |' R6 [) l% R: j, Y' m* tsrcHeight = 1;
0 k: k% ^6 K) B) n* p2 _$ parrayHeight = 1;* q$ G: z# s) k/ e
8 [( h4 e$ l( W R( Z
arrayCenter = [setup.roomDim(1:2)/2;1];
( ~: D9 g" c" J% y7 ?2 U
0 c, S, q6 B* g; {) [& iarrayToSrcDistInt = [1,1];
9 `$ u$ y0 j3 C. {! @: E" y& C* T* T- s
setup.srcPoint = [1.5;1;1];
, ~; S3 X' p3 o; N# I
9 Q# T$ [8 ?( Y0 xsetup.micPoints = generateUlaCoords(arrayCenter,setup.nSensors,setup.sensorDistance,0,arrayHeight);
- a0 y6 f8 K! O* }# b4 W g* F
% @! e- D, Y. @ j* x( S
) o! A& m! H/ p: r- h[cleanSignal,setup.sampFreq] = audioread('..\data\twoMaleTwoFemale20Seconds.wav');
* \9 J) n! V# F2 V( x$ w, w
2 ?3 o' `! Z c& N%---------------------------------------------------initial end----------------------------------------
1 |* p* c4 E( {# w, m( F9 w& Z$ S1 @: j
$ V4 I/ _0 s J2 J) d3 e
' O; e9 |+ G4 z/ B7 T9 J4 V
%-------------------------------algorithm processing--------------------------------------------------
6 ?; r6 ^. ]* n, V7 Z! s: B6 J* @4 h* u8 H" E2 _ L
if setup.reverbTime == 0,
0 e% Z) n/ n5 s setup.reverbTime = 0.2;
0 E7 k) J* @$ D0 A2 Q1 { reflectionOrder = 0;
; I. ^) F4 X4 H: O- c9 K8 ~else6 ?+ U% A( V( Y# Q6 w; h
reflectionOrder = -1;- M. i* t D. Q3 y( ]# o' z4 ]5 j
end- D$ B: Z1 @1 N% k! o
% k& _& Q2 }+ H6 Y XrirMatrix = rir_generator(setup.speedOfSound,setup.sampFreq,setup.micPoints',setup.srcPoint',setup.roomDim',...
7 [/ z9 p( q6 F0 T& ]+ @ setup.reverbTime,setup.nRirLength,setup.micType,setup.reflectionOrder,[],[],setup.hpFilterFlag);/ E$ ^8 g1 A: \1 x5 r' q, X% W
; p6 X% w3 Q* cfor iSens = 1:setup.nSensors,
! c0 Q+ @" c. [& Y' N2 O tmpCleanSignal(:,iSens) = fftfilt(rirMatrix(iSens, ',cleanSignal);
+ Y6 G- ]- Q; D& dend# R* J/ w* c2 c/ x" }
mcSignals.clean = tmpCleanSignal(setup.nRirLength:end, ;: g# Y9 }/ v8 J A
setup.nSamples = length(mcSignals.clean);, A+ d, L& ~* f' k6 R$ W( A" H- F3 j- e
2 H& A; M5 j1 Z. R f
mcSignals.clean = mcSignals.clean - ones(setup.nSamples,1)*mean(mcSignals.clean);
n; k" ^: f% c
2 E5 ]0 |, Q: f1 q%-------produce the microphone recieved clean signals---------------------------------------------
( Q% M' C% X1 _2 R$ |9 h! h9 j, ^
mic_clean1=10*mcSignals.clean(:,1); %Because of the attenuation of the recievd signals,Amplify the signals recieved by Mics with tenfold
; B O9 [& g( x, V7 omic_clean2=10*mcSignals.clean(:,2);
?5 X$ M, x; v/ U: D6 rmic_clean3=10*mcSignals.clean(:,3);: X' g/ r0 ]. x L: I
mic_clean4=10*mcSignals.clean(:,4);3 X( M, ?, L+ h- D0 ^# F$ S; H7 o
audiowrite('mic_clean1.wav' ,mic_clean1,setup.sampFreq);3 |* M& Z. f8 @
audiowrite('mic_clean2.wav' ,mic_clean2,setup.sampFreq);
4 R' t& E- P- q+ aaudiowrite('mic_clean3.wav' ,mic_clean3,setup.sampFreq);- |- o- v }! ~
audiowrite('mic_clean4.wav' ,mic_clean4,setup.sampFreq);
( b/ N) o" V$ ~* p/ _7 G/ W
# R$ Z7 g' c$ E4 Y% I# k%----------------------------------end--------------------------------------------------8 y. [: j3 h# x
$ R/ E! f: j: [/ {& H- x! paddpath([cd,'\..\nonstationaryMultichanNoiseGenerator\']);! \- {+ ?9 j5 X4 y! Q
8 w# W4 M W; N% ecleanSignalPowerMeas = var(mcSignals.clean);, L; V2 h, h6 R3 H. a9 B
: V4 ]8 h, o& k5 u2 P3 K* n* `! S6 E& d' G1 N/ M) U+ o. v
mcSignals.diffNoise = generateMultichanBabbleNoise(setup.nSamples,setup.nSensors,setup.sensorDistance,...0 z+ q& w2 s5 U) ^ L. X
setup.speedOfSound,setup.noiseField);
4 ` i) Z. c2 V* ^% a3 N; r8 ]diffNoisePowerMeas = var(mcSignals.diffNoise);
+ M# U. `$ R2 f% s LdiffNoisePowerTrue = cleanSignalPowerMeas/10^(setup.sdnr/10);
( I+ _' ^+ Q! W/ M- _ lmcSignals.diffNoise = mcSignals.diffNoise*...3 a! q, m( R3 O9 S" E
diag(sqrt(diffNoisePowerTrue)./sqrt(diffNoisePowerMeas));' K$ f0 t0 E9 V* z8 L; V& V& g
- L( ]0 f5 p+ x1 F7 a3 L$ v
mcSignals.sensNoise = randn(setup.nSamples,setup.nSensors);8 y3 e5 U4 n, ~( v; Q- j
sensNoisePowerMeas = var(mcSignals.sensNoise);) ^- P. v" B1 D/ P6 D
sensNoisePowerTrue = cleanSignalPowerMeas/10^(setup.ssnr/10);
" }, t# J8 ^2 H* k I, LmcSignals.sensNoise = mcSignals.sensNoise*...
. j! I8 {4 s* T( `# r# P& z G o2 l diag(sqrt(sensNoisePowerTrue)./sqrt(sensNoisePowerMeas));3 i! e/ x$ t+ _5 X
* x/ v% v% o# W1 w" | _3 R" F3 {! s- K
mcSignals.noise = mcSignals.diffNoise + mcSignals.sensNoise;
% ^* O% V* `3 m( r) amcSignals.observed = mcSignals.clean + mcSignals.noise;5 [% R0 z0 F) v
6 f; f+ {4 f9 Q! H& A' l
%------------------------------processing end-----------------------------------------------------------( T# Z- K, j5 s# D5 `2 O8 H
( R7 N% \5 D! l, }1 K- } ~
+ C0 F( ^- @4 {9 a5 c- ~3 l' W7 ?! f3 ]% h0 X
) ^# U: a/ h* O- W1 ]) T' }, O
%----------------produce the noisy speech of MIc in the specific ervironment sets------------------------
7 q+ X5 s3 W: x. u
: o: G! m: n. U) @( Qnoisy_mix1=10*mcSignals.observed(:,1); %Amplify the signals recieved by Mics with tenfold
9 M4 ` A( Q# n3 f/ I4 {noisy_mix2=10*mcSignals.observed(:,2);
& k2 O. O5 S# Ynoisy_mix3=10*mcSignals.observed(:,3);. x* C9 G" J5 K
noisy_mix4=10*mcSignals.observed(:,4);: n2 [. Z1 z3 D: ?" `7 u* N7 Z
l1=size(noisy_mix1);* u+ `( Y* f$ O, Y2 d
l2=size(noisy_mix2);. H, K; I8 r9 s
l3=size(noisy_mix3);
( O7 S5 M) M% jl4=size(noisy_mix4);
9 V! N" `6 a: }; Faudiowrite('diffused_babble_noise1_20dB.wav' ,noisy_mix1,setup.sampFreq);
8 B& w. ^" Q$ Y+ b6 @6 ~audiowrite('diffused_babble_noise2_20dB.wav' ,noisy_mix2,setup.sampFreq);% w( V, f/ J" J2 u
audiowrite('diffused_babble_noise3_20dB.wav' ,noisy_mix3,setup.sampFreq); y% [2 \$ R D5 \% m5 P/ ?, V8 M2 e0 r
audiowrite('diffused_babble_noise4_20dB.wav' ,noisy_mix4,setup.sampFreq);# C5 P4 P5 C1 y" K C o) u
. p3 \* }3 S' y: n
! i/ x) E6 j7 N9 p%-----------------------------end-------------------------------------------------------------------------+ f4 }3 T* _. j1 j5 F; T# {
这个是主函数,直接运行尽可以得到想要的音频文件,但是你需要先给出你的纯净音频文件和噪声音频,分别对应着:multichannelSignalGenerator()函数中的语句:[cleanSignal,setup.sampFreq] = audioread('..\data\twoMaleTwoFemale20Seconds.wav'),和generateMultichanBabbleNoise()函数中的语句:[singleChannelData,samplingFreq] = audioread('babble_8kHz.wav') 。
" R7 [) ^6 W2 ^9 X直接把它们替换成你想要处理的音频文件即可。
4 d# M7 r6 c) g* r1 l
- V+ h$ O7 j6 a# P. Y$ K 除此之外,还有一些基本实验环境参数设置,包括:麦克风的形状为线性麦克风阵列(该代码只能对线性阵列进行仿真建模,并且还是均匀线性阵列,这个不需要设置);麦克风的类型(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 r' E/ o7 ]2 }' C
3 \ b7 v0 ?" I' h 8 d4 ?& ^+ t% o2 U
) ]; {. p6 {$ V% ? Y4 S6 P图1 麦克风类型图* ~' F- I( `! M: u
![]()
: q0 h- r$ J! @图二 房间的坐标系+ H X$ T: o3 ~1 d! x8 i7 ^
; J5 }8 Z; t& M4 B# C 以上便是整个仿真实验环境的参数配置,虽然只能对均匀线性的麦克风阵列进行实验测试,但是这对满足我们进行线阵阵列算法的测试是有很大的帮助。说到底,这种麦克风阵列环境的音频数据产生方法还是基于数学模型的仿真,并不可能取代实际的硬件实验环境测试,所以要想在工程上实现麦克风阵列的一些算法,仍然避免不了在实际的环境中进行测试。最后,希望分享的这套代码对大家进行麦克风阵列算法的入门提供帮助。- U4 ~8 A/ a" U- C# C
————————————————) B1 d8 G( v* K; U
版权声明:本文为CSDN博主「Mr_Researcher」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。. m1 c8 Q5 T9 w7 F8 ]* W
原文链接:https://blog.csdn.net/zhanglu_wind/article/details/79674998
, P4 i' y( [: r, ^$ y! m& E
# s: K- g8 k& Y7 F; C- D& r5 B5 [6 a6 e. G: t) u
|
zan
|