DOA
4 C( |# h; ?, P* Z! n9 G 声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),0 d0 g3 K# J& ?! W" K# c7 _
E9 N' _9 s- H# q1 I
steered-response power
- Y+ F. v) w1 ^4 C. k 可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。 5 ?+ V" N. M. U9 _- @
上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。
8 U1 N, P! X8 I 其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现
) d) A( {" d: C8 q1 J& I
) _1 ]+ E) `: U9 j8 Q频域宽带波束形成
8 A' r4 r) g/ P; y- g# k. I 频域宽带波束形成可以归类为DFT波束形成器,结构如下图
* I9 |- g9 X [$ b' g![]()
2 d' ]+ O+ ?+ Y2 L3 k2 Z: B! [" [0 [- R# e" v
频域处理也可以看做是子带处理(subband),DFT和IDFT的系数分别对应子带处理中的分析综合滤波器组,关于这一种解释,可参考《传感器阵列波束优化设计与应用》第六章。 频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT 1 B C1 d7 o0 r1 G
代码实现如下
+ D0 O: P8 ]& ^4 knction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle)
, g! ?2 ]% v2 o- }0 m5 \%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
: h. S* L* D. s%frequency-domain delay-sum beamformer using circular array
: o9 M# C5 t; G, _. Q9 o! ]$ S7 R%
* ]1 N- ^2 q; ~% D4 o P% input :# N2 h. m2 `% `, ^
% x : input signal ,samples * channel" r4 c6 U1 ^1 g5 p, G2 B4 k
% fs: sample rate
) [( u2 W. T3 F' x: k% V& p% N : fft length,frequency bin number
3 ^( p+ ~" l% ~+ V7 V' U%frameLength : frame length,usually same as N
( a s7 L/ X; x% inc : step increment
- [) d, |; I* t: D; t% r : array element radius" m" K, S$ P) O% w3 G3 _
% angle : incident angle
; q a( T2 h: s4 F% p%
2 h& O, ~) c( u4 |% output :
/ u! H2 r3 c% C- I P% DS : delay-sum output \' Z: a5 O7 ^" g6 a
% x1 : presteered signal,same size as x+ q7 I: o' y& R6 K& I
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$ v8 l, x2 p( m( L& y
. y/ i) b) N: B( W N, m( f
c = 340;
% z# |# V7 I# d: _7 M+ t bNele = size(x,2);
/ l( p1 ^5 j/ _3 w0 B5 ?. ^omega = zeros(frameLength,1);
! ^5 Q& P4 [ ], W2 T) @' kH = ones(N/2+1,Nele);4 B: Z5 q/ q/ N- X9 v {9 Y/ L# Z
: Q' {5 g2 ]% T7 x, |& V; r X
theta = 90*pi/180; %固定一个俯仰角0 u3 G+ u7 h% W7 F4 W
gamma = [30 90 150 210 270 330]*pi/180;%麦克风位置$ D7 o, g9 u0 h# ?7 t: E' R& A/ E1 t
tao = r*sin(theta)*cos(angle(1)-gamma)/c; %方位角 0 < angle <360& _+ i- I- b* L% G& i+ W
yds = zeros(length(x(:,1)),1);
; O6 c1 X5 v4 _$ Ax1 = zeros(size(x));; p# j3 L2 R& D4 ^& `! o
+ R- m; g: k9 ?' a% frequency bin weights7 m9 h4 G" H; i& g; I7 R: _6 j. S
% for k = 2:1:N/2+1; `5 H+ c2 A& o/ ]3 Q
for k = 1:1:5000*N/fs
. I6 ?7 ?) P8 S% b" A2 m' t" V omega(k) = 2*pi*(k-1)*fs/N; * K0 y& ?; u* q' n6 ?; N
% steering vector5 ^9 p" k3 V$ w
H(k, = exp(-1j*omega(k)*tao);
5 @5 A; t ?& s" @& i4 R" qend
& g+ ^1 W) T6 m: M2 X1 P& F2 | @" \, B- p0 j% N: y
for i = 1:inc:length(x(:,1))-frameLength( D) p( @- N" f! O( }* k. b- |
* D% J+ T! S, r9 g' N
d = fft(bsxfun(@times, x(i:i+frameLength-1, ,hamming(frameLength)));6 `: `0 C) {+ ^8 Z
/ d7 K: @9 q0 u6 G
x_fft=bsxfun(@times, d(1:N/2+1, ,H);
( W* X p# z3 ^" O, o- U+ s+ |9 b3 j' b2 m
% phase transformed
) j w8 a w7 p3 d) o %x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));& g# F- Q! i- `, w, Z# r5 d( _& G
yf = sum(x_fft,2);
& n6 i3 z; h) T( T3 g& l0 L% b7 y2 [8 Z9 v Cf = [yf;conj(flipud(yf(2:N/2)))];
8 r4 c% r/ J U% b% p; y) |& S' j- \' g( F7 J/ p
% 恢复延时累加的信号3 j; G+ n6 F9 x" |0 m( ~1 F
yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));
: ?5 F( g3 e- Q( _! s1 f# S* P/ p, F/ Q! d
% 恢复各路对齐后的信号
$ c( Z* l. G+ L1 m' B xf = [x_fft;conj(flipud(x_fft(2:N/2, ))];
7 {5 ]5 j3 B7 P# G7 f- e x1(i:i+frameLength-1, = x1(i:i+frameLength-1, +(ifft(xf));
# g1 U; d! J" D( V' g$ Z2 s9 y. nend
" F% Q6 _% y, i& T( jDS = yds/Nele; 7 Q2 m& b9 e: _; E$ t' x9 E
$ D1 d4 C2 @9 U) A' Yend6 N. \, B1 s+ ?2 h# a* T" s1 p! p
然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下' R2 i9 e! d' y+ B8 C4 M* L
3 l! p' L2 E7 H% u+ v%% SRP Estimate of Direction of Arrival at Microphone Array+ _3 k$ K, \8 V* w, j) c
% Frequency-domain delay-and-sum test
7 V, r; `% q6 n3 d. z%
( j! I2 i" B7 k" W%%9 f$ a/ Z* _" I: X0 \9 }' C
9 m0 A0 t8 T# k# Z; H5 i+ A" o
% x = filter(Num,1,x0);
! @6 S& i. h: h. t/ ]+ }c = 340.0;
6 `0 p) T; k- A7 R/ V% n5 y6 H: E2 O9 x5 u' }4 v1 E( S
% XMOS circular microphone array radius) i: ^. S Y+ P* S5 K
d = 0.0420;
0 G5 S! ~, F& w8 ?9 O% more test audio file in ../../TestAudio/ folder
7 }% {: n5 u i4 b% ?# npath = '../../TestAudio/XMOS/room_mic5-2/';
' C6 W2 O n$ \+ j- x* t! G3 w1 W[s1,fs] = audioread([path,'音轨-2.wav']);) V" N7 u0 F9 g' g) v$ y2 X& R$ \0 g- d
s2 = audioread([path,'音轨-3.wav']);! z) n. P' b+ T) Y* X+ d
s3 = audioread([path,'音轨-4.wav']);+ n/ a) G0 `3 `# H4 f7 [( V
s4 = audioread([path,'音轨-5.wav']);
$ f. `9 ?" E; [$ R! \* B9 hs5 = audioread([path,'音轨-6.wav']); j( r* e/ e7 O# h. T" B
s6 = audioread([path,'音轨-7.wav']);. w! s2 G* H0 d% S/ D
signal = [s1,s2,s3,s4,s5,s6];
9 I# u* l: z" c- O3 H3 ^ j2 XM = size(signal,2);
6 n9 d) j) H# [; g4 M& Z%%
, i4 a: D3 l) \9 o9 C# A7 Vt = 0;
F# y1 | ^ {' d
, g3 H0 }0 L) n$ `' R/ d2 o1 e Q x5 K% minimal searching grid
* k, ^; U- W4 l2 l7 r4 bstep = 1;( e/ r: F1 G- \/ u. W* ]; z, C
9 a- T0 q ^9 @# hP = zeros(1,length(0:step:360-step));
9 E- P9 B. ^; P" k# s( X0 G6 _9 P1 etic8 n. h# k4 \$ G" X& g' r6 u
h = waitbar(0,'Please wait...');
7 I( ]7 `& ^1 Z- w Kfor i = 0:step:360-step% n% b' |9 f1 [
% Delay-and-sum beamforming
" k6 f. B, M f0 `. A [ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);
( r# g1 Q0 `, o; U1 q t = t+1;. C' v9 f; E! Z4 z- e" M
%beamformed output energy! _6 l0 d7 Q X* V4 m/ `$ F$ q; t9 c
P(t) = DS'*DS;
6 A+ p( c+ h2 R1 T5 f& H2 y7 o waitbar(i / length(step:360-step))
' }. y d2 r6 d' Wend
/ m! n+ @5 i3 K/ Z. M+ v; A0 jtoc' J/ E$ K% I0 Y* I
close(h) 4 J$ N) I6 j, P" k1 V3 Y
[m,index] = max(P);' i* Z! |. y4 Z9 D( h: b
figure,plot(0:step:360-step,P/max(P))
4 { c! g9 M8 Mang = (index)*step- ^6 \- `( \" \$ P
9 u# c& c, o' U6 _ d: X
程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下
: m% y H+ E8 [. _0 t( ~* b ! ]; u( x. I" D- I. \
结果与预期相同 PHAT加权 与GCC-PHAT方法相同,这里也可以对幅度做归一化,只保留相位信息,使得到的峰值更明显,提高在噪声及混响环境下的性能 " G' u& x B( [: W; e. L
上面代码中加上这一句 3 G) i v; W! U+ o6 U
%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));6 T* Z# W( S9 ^% e$ I% k3 L
测试同样的文件,结果如下 7 g9 X) K/ g* _; A
![]()
; F3 H/ J, t8 ^9 O9 E对比可以看到,PHAT加权的方法性能更好
6 z6 H* h* T6 j# \' r参考
$ p5 g _. T$ \0 _" j1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》 ) |1 F3 D" b2 p' `$ g t& c
2. 《传感器阵列波束优化设计与应用》
/ d( @1 `# k* m& @8 |————————————————
" L5 E( x% y" C版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。) x- u1 P7 K4 k$ H( m* A- q" v9 E
原文链接:https://blog.csdn.net/u010592995/article/details/81586504
4 G1 M5 u$ y5 X: z' y t" @) t' S( E! M* ]2 J
/ d. Z3 H# L5 G' W r8 Y5 |5 K4 w9 F+ B& ^
8 X: Q8 {, L b0 I$ }1 v
' z+ w- \8 H$ |, Z2 Y2 g4 Z$ T7 _
|