DOA
q( i9 G/ u0 B9 ~, |8 t: z 声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),
' w* T) e& g; r. d% u$ J: P; @! G( @ C }, j! I! N7 H
steered-response power, r! h! e1 k8 W" \1 ~
可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。 9 T1 M _) _0 o W+ ~( t
上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。 % c$ g }) `: s) M) T u4 P
其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现! P2 r+ @9 M) k% N% @( ]
) z/ r# s; ^! W频域宽带波束形成
$ R6 J1 Y" T' _; ]- [2 O4 X 频域宽带波束形成可以归类为DFT波束形成器,结构如下图
. Y( G3 {) s( s& N' Z3 O) J![]()
# o0 {4 @/ Z# n
! w% l. W* e- W5 Y: X频域处理也可以看做是子带处理(subband),DFT和IDFT的系数分别对应子带处理中的分析综合滤波器组,关于这一种解释,可参考《传感器阵列波束优化设计与应用》第六章。 频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT * }& W& t: u. o( @" y( Q
代码实现如下 . v( s9 U+ n" o/ c% j. w5 b4 f2 C
nction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle)
% G" G3 S1 s) K9 ]%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7 q ^1 V; x$ I6 m' @) K+ R%frequency-domain delay-sum beamformer using circular array+ s. V" x! g) w: B
% - V, J8 i" w. n6 u' {
% input :
; Q; n/ K5 M+ O: g: j% x : input signal ,samples * channel
3 Y+ n( n% o m& t: D- ~ Q- [% fs: sample rate
) k% B, _1 \9 @# T3 d% N : fft length,frequency bin number* p5 S0 `2 m- j% a/ D6 K# e1 x
%frameLength : frame length,usually same as N
( I$ c5 ]+ v$ x" V1 W: Y+ m% inc : step increment/ s; Q& ?) B4 _$ V$ Y& a2 F% k
% r : array element radius* |( N6 Z3 ?* v. k. Q
% angle : incident angle
( u6 [3 V1 m Z/ D! B%+ [% `' O8 z2 Y+ M8 Z! q
% output :
9 G& h1 r' s; g$ h- e* @% DS : delay-sum output
3 W8 U5 B; `& N! ~2 W. P# A3 @( o5 M% x1 : presteered signal,same size as x/ y P, W" p: I! P
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
* _0 l+ `. X2 P2 ^) W. u
* i; i. Y2 Q, J2 x& ^c = 340;
' A8 j' L/ x- J/ p+ H2 w3 MNele = size(x,2);
0 F Y4 E# r* ?5 F* z9 a6 V2 yomega = zeros(frameLength,1);6 F# P/ w e0 l; L
H = ones(N/2+1,Nele);
2 f( w+ B! A% p/ F# I9 u+ j" O" h. S8 O: m0 a5 P3 [( _! `
theta = 90*pi/180; %固定一个俯仰角. y0 p0 O$ z. x+ P7 Y4 d$ E
gamma = [30 90 150 210 270 330]*pi/180;%麦克风位置
) e8 x" K- V5 e+ b5 g, jtao = r*sin(theta)*cos(angle(1)-gamma)/c; %方位角 0 < angle <3602 Q5 y4 h* c7 n; \9 @! B& C* Q' n
yds = zeros(length(x(:,1)),1);" J6 ?: }$ w" d9 a* G% t' z) q
x1 = zeros(size(x));
# k' W" d4 k& ~1 }$ L, ]# N/ C0 m
5 B" K* ]4 ^- w# A- M5 F% frequency bin weights, _ ]* z. G( x& b0 g' A
% for k = 2:1:N/2+1
, B3 `3 `9 ^6 `1 p) kfor k = 1:1:5000*N/fs9 O- `8 l7 V8 H) m
omega(k) = 2*pi*(k-1)*fs/N;
/ Q F; C! w% p) G% C$ C: d % steering vector
2 w3 S6 \& R, S% n" f7 V0 n H(k, = exp(-1j*omega(k)*tao);
0 o! w2 O7 i; y& V2 bend/ a6 V$ d3 O$ X) \* ]
: A" C; t4 ~3 }+ [+ K1 ]for i = 1:inc:length(x(:,1))-frameLength
( [& n0 |" H' q" ~/ J5 I
" T+ {9 l, l6 q" f# G, g d = fft(bsxfun(@times, x(i:i+frameLength-1, ,hamming(frameLength)));
' G" t0 [( Y& x% @
5 ]4 w8 E/ G; _& f& P x_fft=bsxfun(@times, d(1:N/2+1, ,H);
; g6 w" y, m: L7 C) P3 v2 a& d5 M1 i+ d; M
% phase transformed
V! u! t. U( d4 T; Z- A1 X %x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));
2 j& u* }+ W$ E. w% N1 @( c yf = sum(x_fft,2);
! o- }% z- x- o9 p7 n% F+ a Cf = [yf;conj(flipud(yf(2:N/2)))];
/ F; k! g; }6 k9 C! w3 f+ {* V" W- [5 o c4 O, m, A# [6 Y4 y! a: a
% 恢复延时累加的信号
9 ^% y% d6 V0 m1 x yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));
0 k3 N& U2 ?& O: z8 R1 {
' C. K, L3 A8 g % 恢复各路对齐后的信号
) O+ C, \: |4 k" K xf = [x_fft;conj(flipud(x_fft(2:N/2, ))];0 S, A) h1 |$ d/ R" L* I
x1(i:i+frameLength-1, = x1(i:i+frameLength-1, +(ifft(xf));: [5 b1 y9 x7 X( _! b
end7 P, |) b" l2 ^8 ^% y4 K8 Z" R- P
DS = yds/Nele;
8 x C: X9 }- ]8 i% \; e# V
( C+ }. \, j) V& J# oend* M* g; G* x+ @5 b
然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下+ b; r# P/ v& D7 r( S( G3 f
4 h( y$ w$ N- p8 K0 ?/ o$ Y, j
%% SRP Estimate of Direction of Arrival at Microphone Array! i# X$ B) q6 A; M3 a% G5 H
% Frequency-domain delay-and-sum test: i+ @" D+ |4 g( A0 R. S; X0 N
% 8 V0 L. ]* F7 v h6 ]0 v, Y
%%
5 i) s; \5 o: z7 C9 H! f: Z6 s) |4 ^3 Z2 w) j4 S) V
% x = filter(Num,1,x0);
2 T* Q) i9 r% \" ec = 340.0;, S* K( a* ?$ t& J( V
, \6 P" i# B: m+ p8 W4 e4 N
% XMOS circular microphone array radius+ H% G3 g0 S6 u4 x7 U
d = 0.0420;8 h( y9 l/ {, d& y% p) }
% more test audio file in ../../TestAudio/ folder' n. U3 }+ P; t5 Y0 Q7 \$ |8 y
path = '../../TestAudio/XMOS/room_mic5-2/';
& d3 E# r7 P4 T+ m[s1,fs] = audioread([path,'音轨-2.wav']);
& W' d; g" h7 Xs2 = audioread([path,'音轨-3.wav']);1 z4 B Z- u3 ^+ a0 l
s3 = audioread([path,'音轨-4.wav']);5 x( f0 P; t( q* B' m
s4 = audioread([path,'音轨-5.wav']);
& m; o' S1 i7 os5 = audioread([path,'音轨-6.wav']);
# u0 G0 L+ e A3 t1 q F: vs6 = audioread([path,'音轨-7.wav']);
7 K/ m! } E9 N( K8 I% ]signal = [s1,s2,s3,s4,s5,s6];
0 i5 b* u: F. ]9 `* rM = size(signal,2);: K5 Z# o8 D5 K4 J4 h: h. e# O Z
%%& j( } \' _5 l- C6 [: O9 _; I
t = 0;1 A' v2 ]6 M% W/ M( c
3 q$ K, p4 S' k% minimal searching grid! i: h+ k0 h, B! ~9 Y1 b F; z% E
step = 1;
1 E0 s! B/ T. C u0 w; A8 I, i5 k+ b( B) o, e) @4 U
P = zeros(1,length(0:step:360-step));
( \" n7 {+ q( l' N: f' f1 utic2 e, F- F! t: E. }& R
h = waitbar(0,'Please wait...');1 k9 K# o1 S5 t! Y, h' ~1 \
for i = 0:step:360-step; h1 p+ j8 ? K" ` \5 {
% Delay-and-sum beamforming! I4 L0 i6 G1 `: @
[ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);0 t' n) L) o* l$ J3 p6 `
t = t+1;
$ G6 Y0 b" D5 i+ z3 x %beamformed output energy
B/ U5 e" w; D; n P(t) = DS'*DS;
: u7 \* e3 A7 ?) q8 h# U waitbar(i / length(step:360-step)) r/ F& S7 |; x: F# ?
end
6 x6 w9 r1 s2 O* Q+ n. ]toc" O# X1 ]3 b" q4 j
close(h)
: a3 Z% E2 j2 ]# q. t6 T6 [[m,index] = max(P);( b- u* E6 |! L: Y9 p$ A
figure,plot(0:step:360-step,P/max(P))0 p# c9 ]: j+ F" O b$ r7 n
ang = (index)*step) f3 S' T- H! {, |. |
) `; C4 R9 L# U- Q" l+ q: L' R程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下
" m2 S9 ]# k( u. H b @) f7 G. H) w, [! ^- u: `
结果与预期相同 PHAT加权 与GCC-PHAT方法相同,这里也可以对幅度做归一化,只保留相位信息,使得到的峰值更明显,提高在噪声及混响环境下的性能
) V, x& n. D9 z8 H$ z1 N 上面代码中加上这一句 : N7 N0 F/ e5 D( ?! e7 w! _2 ^
%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));( U5 D4 |6 a: s
测试同样的文件,结果如下 8 G" {+ _/ x0 ~
![]()
6 u4 d' n9 s- |3 z对比可以看到,PHAT加权的方法性能更好
$ v/ `1 q- W1 Q. j+ P6 I" o9 {6 r参考
) f! q& f* [% s0 J1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》 5 R# z# R2 }8 ^5 `' P
2. 《传感器阵列波束优化设计与应用》* b8 I# K' |& ?% P; }- B
————————————————
9 R' O- z- e" f# y% Q- I; Q0 v2 j版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
9 D/ F7 S, o# N* |; `原文链接:https://blog.csdn.net/u010592995/article/details/81586504
6 y4 j9 @, g# B8 d' u' [" o( ^7 V9 h$ k8 S9 I" c$ V3 Z4 \
/ G6 l2 a3 c" L. E
7 G; o7 [8 ^8 V. B6 }: R; p/ c
! s% O+ V& o$ s! i+ s" s% M
( ]$ l" u: x u& A4 T- Z |