DOA
5 [* T- t3 h; S& a, Y 声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),: \' W+ k( J/ |9 y% e* U$ E
: M K8 \, `1 a% \+ g" O5 Wsteered-response power
, B, S" B$ P! W% x 可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。
6 |6 g; E& _! J0 a8 z 上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。
' }% Y- x+ `" y' X0 ~ 其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现0 w* D2 t, f0 i- B
. x5 R+ b/ H! _1 j: ?6 `频域宽带波束形成# q5 ?9 [) }1 C& P5 ?; W
频域宽带波束形成可以归类为DFT波束形成器,结构如下图 - N, G4 K6 M/ o& c
0 X$ m. h2 C. M0 B u Y* C1 ^, V
( t: d. U" v6 S频域处理也可以看做是子带处理(subband),DFT和IDFT的系数分别对应子带处理中的分析综合滤波器组,关于这一种解释,可参考《传感器阵列波束优化设计与应用》第六章。 频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT 6 O Y* J3 x6 b1 F5 x9 v7 R
代码实现如下 % p' V Y- }( ` p& D! A9 l# k
nction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle)
! R- s w4 r$ W& o8 R/ ^%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5 d3 ^. _1 w% |" a9 O%frequency-domain delay-sum beamformer using circular array
( d; ~( @3 @+ P8 W5 Y0 `- h% & k3 d4 ?( s% p, X) J1 G
% input :
2 j# S7 w( E; J) P5 n4 V4 S) x3 z% x : input signal ,samples * channel
" Z; \" x: ~: f9 W! N3 [$ R& `+ v% fs: sample rate
0 H9 |) z, ~) C7 l& z/ n+ T; k# N% N : fft length,frequency bin number: Z7 g/ R9 B3 A6 X; O: S
%frameLength : frame length,usually same as N7 j0 v5 ]8 a' i1 t" k% C7 |5 v9 L! N
% inc : step increment- N, X% s+ f! n( e1 |
% r : array element radius; V# a: F- t9 k
% angle : incident angle+ Z. {( I2 A7 N8 m a+ V
%5 B0 z- l+ D6 u. R$ [' P, C( ~* }
% output :
& o$ G; ?- D& Z1 t% ^% DS : delay-sum output
. D! |8 O- m% Y% x1 : presteered signal,same size as x; ?$ Y( E5 a) ~' _. D" T0 g; A
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 }: f% A6 L6 b/ M, W" u1 L9 y
4 Y _- A) h# k) V" Ac = 340; j6 s% B% _' a* t
Nele = size(x,2);
2 \3 _% A5 l3 u4 O+ Q# n' f- y+ Somega = zeros(frameLength,1);
# o9 ^9 d. g+ L6 w) `H = ones(N/2+1,Nele);
* s7 |0 u1 A, j8 {# ? F1 y
1 B) R9 m4 q0 _8 m2 Gtheta = 90*pi/180; %固定一个俯仰角0 I0 I6 {% Y8 J1 @ H9 c4 b' i" C
gamma = [30 90 150 210 270 330]*pi/180;%麦克风位置' S0 z# [7 L; n; U8 M. t# L
tao = r*sin(theta)*cos(angle(1)-gamma)/c; %方位角 0 < angle <360
5 O) }7 w) u" B% r6 fyds = zeros(length(x(:,1)),1);6 J- k, g# T4 \9 q- T* i0 ?
x1 = zeros(size(x));
# k. }& u( t; U) J+ ]
6 h' i) f! s# k! z$ e% frequency bin weights% |' ~% q3 a, _: A1 T
% for k = 2:1:N/2+15 L5 _2 J9 |; Z0 G2 M, A( ?
for k = 1:1:5000*N/fs" d% _6 N' e* L( Z; K9 }
omega(k) = 2*pi*(k-1)*fs/N; 8 b$ i' b* z( u, H
% steering vector& L" L. @' B# e3 v% L
H(k, = exp(-1j*omega(k)*tao);
' u% i' h3 d7 T/ `0 e5 N' Cend
& L$ [% m. t. A9 ?$ _1 V$ S4 v3 Y; p2 h* v6 T
for i = 1:inc:length(x(:,1))-frameLength; H# u% G0 z/ Y4 I
6 a0 d6 L! {" v8 g6 i$ y d = fft(bsxfun(@times, x(i:i+frameLength-1, ,hamming(frameLength)));0 A5 z* {7 {% I1 O. w8 t+ n3 S
- E: E) c3 I" y3 d8 H
x_fft=bsxfun(@times, d(1:N/2+1, ,H);1 F4 G( {3 L' b2 }9 d/ m
" g+ a6 ]& }; ]! K2 v4 w, k: Y
% phase transformed H' i8 R7 S) H* p. Z8 H
%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));) C* |1 W* D p- Z
yf = sum(x_fft,2);4 Y- v1 m, A* N3 [+ g3 q0 X l& i0 s* c
Cf = [yf;conj(flipud(yf(2:N/2)))];% F+ A U0 v. S' T
9 ^0 f4 ~+ T) P
% 恢复延时累加的信号
5 D0 \) S: h/ @7 q- @5 c, ? yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));
+ v6 o* [3 F6 e; B2 R( H) @6 e; q/ m$ Q
% 恢复各路对齐后的信号+ K3 V- | t$ }. Z9 q& U. L8 R
xf = [x_fft;conj(flipud(x_fft(2:N/2, ))];9 L( I r3 `, n8 I! A& u
x1(i:i+frameLength-1, = x1(i:i+frameLength-1, +(ifft(xf));
' F) \& h9 w/ Vend
2 G: D( n) @$ D) F( `* e4 f" NDS = yds/Nele; : Y0 O2 i! j' Q3 R3 R( I
" g! o& m8 m" j5 hend
- F" D+ U6 z5 |2 t- x0 m然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下; M! [" A9 Q1 n3 R2 ~
" n4 ^' u) \# r0 ?& N* r. {' d%% SRP Estimate of Direction of Arrival at Microphone Array
5 d! ^6 B1 u8 e5 H W# U; Y0 l& B4 ?% Frequency-domain delay-and-sum test
& P, X% [: N S1 x%
8 y7 Z. R+ |/ T8 \5 a. J%%4 `0 v2 a5 {4 W/ r3 R
/ p$ k- R4 l X' O+ e0 U
% x = filter(Num,1,x0);
K% R: D# @4 I# O6 n- l) ac = 340.0;, P0 _9 t" C% u: T4 d; H! i) a
# W; Y/ l+ K: \ H9 H% XMOS circular microphone array radius
0 s" t; I0 v7 _6 f1 p& x- J3 bd = 0.0420;, }8 q: O- W( V! i: q
% more test audio file in ../../TestAudio/ folder
# X6 k3 a5 n" r( O4 M7 jpath = '../../TestAudio/XMOS/room_mic5-2/';& A% c) a' X- I+ t9 B2 q
[s1,fs] = audioread([path,'音轨-2.wav']);
0 V. F8 M* l; B+ h5 B8 ss2 = audioread([path,'音轨-3.wav']);$ J+ s: m+ {7 Q: s$ g
s3 = audioread([path,'音轨-4.wav']);
$ @) g& }" d9 _" g% L/ cs4 = audioread([path,'音轨-5.wav']);/ L+ Q' D: x( J5 z# \# E
s5 = audioread([path,'音轨-6.wav']);6 e) E9 [. ?; n
s6 = audioread([path,'音轨-7.wav']);+ w$ I( O: [9 m4 r
signal = [s1,s2,s3,s4,s5,s6];9 L. D+ Y) z, n( y: g
M = size(signal,2);1 ?2 d+ B- o; @ }9 J" o( V. q
%%
9 {, ?$ q4 J, `, pt = 0;
1 K) M2 x( L% o _! r" N! I' D0 X$ g( A0 g: [
% minimal searching grid
4 Y2 c* w9 N9 A1 X% kstep = 1;/ z+ f3 n; ?- d* H. I) Y
0 u; g* @8 E wP = zeros(1,length(0:step:360-step));
# Z" K- j8 \0 l `tic+ r. E/ o/ u( W
h = waitbar(0,'Please wait...');
) m4 p: @" Y0 K- v5 S- Mfor i = 0:step:360-step
" Z3 b7 \; I* v- E8 M0 q# p % Delay-and-sum beamforming* v$ F. z8 M3 T/ a* P s, O
[ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);+ Z0 R3 Z* G- x$ _
t = t+1;
7 j1 q1 ~0 ?# s5 M$ L9 w* n %beamformed output energy
w) u2 v% w0 ]4 B6 k- T% D P(t) = DS'*DS;1 v! j' o% i6 ^- S
waitbar(i / length(step:360-step))
* Z0 W& _ T0 }) I( `- ^# F& gend+ A U( s: N/ U2 {0 _# \
toc2 Q% B" q [5 c( ]# w
close(h)
4 x. e* a1 u7 k[m,index] = max(P);
p; ~- j, s0 q6 d) s) ^; i7 H6 _figure,plot(0:step:360-step,P/max(P))/ ^+ `" E Q: v- e" T
ang = (index)*step
; {$ H+ r1 n3 o; }' {7 l) o' s' q% ]2 N7 g
程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下9 A" M" n! B. A* G, c
- ` p& H1 r! ^1 G2 l0 E$ x
结果与预期相同 PHAT加权 与GCC-PHAT方法相同,这里也可以对幅度做归一化,只保留相位信息,使得到的峰值更明显,提高在噪声及混响环境下的性能
, S# z2 ?; V# L5 R8 E& d+ A9 X- r2 R 上面代码中加上这一句 $ g9 s9 b' o% V9 W
%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));
8 T5 S7 n6 k$ a4 Y( f0 J8 M& ]测试同样的文件,结果如下
! ?3 N. v# {* ]![]()
# A/ \( t' m# @8 @4 j, f. c对比可以看到,PHAT加权的方法性能更好
* H# D: H/ {) e# ]* L$ J参考
3 y( M8 w% e( Y1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》
+ G% v1 Z K7 E6 |2. 《传感器阵列波束优化设计与应用》
8 s* P( L& ?. Q1 w4 |1 x3 q9 X8 f' B% S————————————————& @9 t% j; ?( ~
版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
$ Y( O/ j/ W9 S+ h! j0 e原文链接:https://blog.csdn.net/u010592995/article/details/815865042 w4 ?+ O( e2 @* ^ J/ |7 z* k
+ Q7 d8 d" n, J/ t8 p
/ E7 O! f/ N8 E& U: v$ }, }
4 E$ r4 }9 o2 ~8 ^0 q q
7 |, `, [5 g/ B
7 k/ v4 Y1 ]1 l, G, C |