DOA
- T* E9 U! X4 e2 f# y8 X 声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),
1 l, w1 d0 s r; ~0 t
3 D0 {( {1 v+ V1 H$ @; fsteered-response power
' d( Q2 |. c) }% l 可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。 7 B8 P1 `1 E/ a# O# ~" D
上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。
# x: \$ V6 u$ V9 { 其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现
: u% e6 z# Q( q
B% [7 k8 R! z% a7 A& O6 W* K( c频域宽带波束形成
& X* |- d5 L: p. b5 m, ] 频域宽带波束形成可以归类为DFT波束形成器,结构如下图 f% m+ r r1 K+ m2 P6 @5 n
) g/ Z) Q6 F, G) p/ P: m
9 |3 ]3 J8 V1 R& K6 _, C' \频域处理也可以看做是子带处理(subband),DFT和IDFT的系数分别对应子带处理中的分析综合滤波器组,关于这一种解释,可参考《传感器阵列波束优化设计与应用》第六章。 频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT
1 i$ d6 y6 ~. G3 t, I. l7 r代码实现如下 7 a9 K v3 z0 b* _0 _
nction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle)0 l# E& O. m9 J' V
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 l7 t! t" ]2 |# T
%frequency-domain delay-sum beamformer using circular array/ J4 R$ B5 Z( [8 |! d' F, Y2 \
%
" o5 m- H) q! t9 g6 c, r% input :
: [! f0 G9 i' B% u9 m8 i% x : input signal ,samples * channel
9 t9 ^- V3 |, g% {9 u2 B3 n2 K# O% E% fs: sample rate
8 o( r( ~) A! @+ H4 L% N : fft length,frequency bin number7 e# r. m& V. M
%frameLength : frame length,usually same as N
0 @6 C6 v3 T' t2 {% inc : step increment
6 F" Q' Y5 q% B M% r : array element radius6 d( q" M S+ E" Z# p8 I4 W
% angle : incident angle* W" f6 ]. t3 Z
%
" T t K! C. B- L- o* c% output :
5 @; }5 Q8 @+ @# E' e& v& J% DS : delay-sum output
4 c+ X' l5 @$ ]8 G0 {% x1 : presteered signal,same size as x+ X- G# J4 c, A
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 I6 h9 h6 v' ~
6 G6 X9 i1 v( a
c = 340;
8 a- e6 Q) V% [! _- p* e; KNele = size(x,2);
/ `, ]8 Z! s4 e' i& bomega = zeros(frameLength,1);
, s! `, @/ q# V+ Y/ ZH = ones(N/2+1,Nele);3 _5 E- v6 |- Q1 F5 j
9 l2 {" R" O8 F, F* D9 T% j
theta = 90*pi/180; %固定一个俯仰角
& b; r/ f. d+ K# w/ D. ^% Pgamma = [30 90 150 210 270 330]*pi/180;%麦克风位置. {! K+ D- ^$ G# p1 h' [
tao = r*sin(theta)*cos(angle(1)-gamma)/c; %方位角 0 < angle <360
' o4 o+ T8 [! A/ Uyds = zeros(length(x(:,1)),1);- r5 b( q2 {8 Y5 k3 o! `/ B
x1 = zeros(size(x));
U. J. C# i& C5 E4 Y$ f. U6 e6 P
$ ?& e- I3 G- a% frequency bin weights9 a, e) U% L) S. m, F4 X' U# ]
% for k = 2:1:N/2+1; J* ]% M* W; T0 I( h
for k = 1:1:5000*N/fs7 K( G2 a X& ~( T% \5 b
omega(k) = 2*pi*(k-1)*fs/N; 0 o; x3 C4 O$ L; o" e+ x$ ^: d
% steering vector
$ }5 F' r1 o4 @6 [ H(k, = exp(-1j*omega(k)*tao);
* B6 L0 R6 I* Y/ Gend
: a+ ^! L$ U7 ~- ?5 M& z2 }; ?# \$ l+ s
for i = 1:inc:length(x(:,1))-frameLength" @6 ?1 k2 T: ]% G: n: U
4 g* T/ C6 V0 T9 {3 ?
d = fft(bsxfun(@times, x(i:i+frameLength-1, ,hamming(frameLength)));
. n3 H% r9 ] j* x$ Z1 s j- x; G* X0 ^+ V- J% Z( D
x_fft=bsxfun(@times, d(1:N/2+1, ,H);
) e* U9 ]( ^4 t
) U- Y' t* W; U % phase transformed0 i* N" u! Y" L! J
%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));! W) H/ c; z% P2 D& @; f9 d( F
yf = sum(x_fft,2);
$ X/ w0 S0 [* T1 u' ^4 q0 R Cf = [yf;conj(flipud(yf(2:N/2)))];9 Y1 n9 m6 C) q X* y; U
2 G* _% x t1 j' }) y. q* G: P9 _ % 恢复延时累加的信号: _+ t- C1 C2 j% M& Q2 I7 m
yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));
2 C5 u! e z8 h0 Q' }
1 j+ _/ b; f+ v ?4 C/ S, c# t/ M7 w % 恢复各路对齐后的信号$ m3 k# V# N3 a y7 k' n
xf = [x_fft;conj(flipud(x_fft(2:N/2, ))];
2 a+ m7 W' O( P$ P6 t3 H7 m x1(i:i+frameLength-1, = x1(i:i+frameLength-1, +(ifft(xf));% _& n) d. ~. H( @) A
end- B+ g- x' ~: o6 z7 C- d
DS = yds/Nele;
1 o! ?8 I! }& l/ s) B6 M y" r
6 D( @3 n- D4 k8 L, ^$ b pend
; [0 X4 @% C% v9 a4 T+ Q o然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下
$ E5 o% u, y/ @' D+ s
6 }! } |& g6 K ~3 |( r%% SRP Estimate of Direction of Arrival at Microphone Array
) D8 T9 \' l8 X( \! p% `4 c$ R, i% Frequency-domain delay-and-sum test
& T$ o: W+ Y; P6 J6 G9 | Q% : l" [' U1 R3 t6 |
%%! x8 V- v. \4 S5 W6 p, U
: B1 C# ]1 n. w( @- [' k% x = filter(Num,1,x0);
2 O( ~9 x& l( Q6 Ac = 340.0;
# m9 n4 W/ E% M. f
' q+ ^2 L! v6 d- A+ g4 z9 ^+ A' n$ z% XMOS circular microphone array radius/ _, J3 N- D( `. a5 k& ?
d = 0.0420;/ P& E! ?' q, r& g
% more test audio file in ../../TestAudio/ folder
; y' j; P3 s5 opath = '../../TestAudio/XMOS/room_mic5-2/';! _1 Q( u# }7 E( |! p/ f
[s1,fs] = audioread([path,'音轨-2.wav']);. I, E% I! K) K, V1 K/ I
s2 = audioread([path,'音轨-3.wav']);: U$ t4 i: h# Q: O
s3 = audioread([path,'音轨-4.wav']);
f5 a* J5 z& W8 y5 h9 {s4 = audioread([path,'音轨-5.wav']);
# ^! n7 q! V* L2 P" w- `: ks5 = audioread([path,'音轨-6.wav']);0 n5 Z2 j, l4 ]4 @0 m/ M2 k/ m
s6 = audioread([path,'音轨-7.wav']);
7 ?/ x$ Y6 W- U5 F- }signal = [s1,s2,s3,s4,s5,s6];
& F: U* N6 J- |* p2 \! E! QM = size(signal,2);8 @5 ]' d' k: M. M0 @ g3 t
%%; f; [; E) N( _
t = 0;
0 [7 q6 f( L% p+ M: ?
& v& X1 g+ X6 ?, R! I1 {0 T" J" X% minimal searching grid3 m! i0 _' \7 i7 Q ~0 p" V9 o
step = 1;
/ n: f4 ^3 X3 {. l4 i
3 N0 u7 o7 V, z& B& e. YP = zeros(1,length(0:step:360-step));
! M% u. C8 H8 e% V. t) g! Y. d' ftic# C$ } N3 [' ~- P
h = waitbar(0,'Please wait...');9 i! Y R% S: |# R0 M
for i = 0:step:360-step
! X! R+ e: a$ P% K) K3 u0 ^. | % Delay-and-sum beamforming% i9 `; b* Q9 z/ k# [
[ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);$ B* y) r1 n! B# U
t = t+1;. I* s4 b; T/ v* ^3 ^
%beamformed output energy
4 L Z+ }7 O5 N) \( ?* ?" W# \# v P(t) = DS'*DS;/ x/ m2 G% s# N/ `+ N4 \$ R
waitbar(i / length(step:360-step))* v3 Y( }* s9 r" m+ t: w( d
end
! D) u4 l. e0 a' r- \. Q# jtoc+ B- \& D( @' y9 x4 r
close(h)
7 N1 ?: m1 z: b3 a[m,index] = max(P);
! S& P/ D( f1 ?) {" sfigure,plot(0:step:360-step,P/max(P))3 F, j: N* A" F( r" `5 B; ]# E
ang = (index)*step' s# K; S& C6 {! r% O+ r, S
0 Y$ U/ x' b6 y% s' `! a程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下8 d( A& N% K" ^ N- L6 M* f2 h
![]()
/ B" S5 j( V6 @9 x% f结果与预期相同 PHAT加权 与GCC-PHAT方法相同,这里也可以对幅度做归一化,只保留相位信息,使得到的峰值更明显,提高在噪声及混响环境下的性能
8 m9 a. V: @' P! X0 h0 C 上面代码中加上这一句 & k7 O8 h/ R8 P# h! t; x2 u% w
%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));6 U1 q* x) O& f6 _, N8 D' s( B: b9 K
测试同样的文件,结果如下 9 u# h, n. [3 J1 S
) c3 ~' W$ j5 `$ }" |, \. H1 }
对比可以看到,PHAT加权的方法性能更好
7 J$ h# Q6 n0 A* V5 L3 x( a( h, B参考
, w6 c# {2 e: K, W# a) b- \ i" g1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》
( q7 F% j( G) a- @# ~2. 《传感器阵列波束优化设计与应用》) q1 b j! W% {8 _1 Y$ |
————————————————
5 u( `$ Q, W7 s5 ?' i版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。# N, \. k( L" J: D. [3 k! B
原文链接:https://blog.csdn.net/u010592995/article/details/81586504& n6 n7 ]+ a8 {' W, `7 | G( T
3 u* X/ s5 P# A. g4 k9 q" M' m
7 I3 |; Q/ W3 w
]' D# p, T i. ]! K: @; A
6 R7 r7 p" t1 j- T
! z* I3 k& ~) B9 K! w" p' s
|