DOA% }1 H7 X$ t. s5 R. M8 J8 n
声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),4 K! F* F! A7 J, K# }; Z) ?
- k2 P$ k# H8 {4 ^/ Qsteered-response power
6 s, e! s0 N9 M+ z' l ] 可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。 ' }+ `* P! g* z5 V, o- ]) b
上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。 : @( y# F1 d& C' }8 r
其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现
8 [' E: O& L: f8 ?; ?7 Z
. p7 Z, S" y% k8 _) |频域宽带波束形成
0 t5 Q, l! K) L- J* z; C; k$ L 频域宽带波束形成可以归类为DFT波束形成器,结构如下图 * U$ d: [, z: w( B: Y2 z
7 I) b* S7 A8 E& A
4 |* q/ Q2 l- b频域处理也可以看做是子带处理(subband),DFT和IDFT的系数分别对应子带处理中的分析综合滤波器组,关于这一种解释,可参考《传感器阵列波束优化设计与应用》第六章。 频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT * M6 f5 w: [- X2 ^! B0 R
代码实现如下
& U8 W: d9 ?! e7 g0 ^* fnction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle)3 D$ F1 |0 x3 Q& h/ z2 Q
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$ ]3 ]4 E" J7 M" n
%frequency-domain delay-sum beamformer using circular array
, e% U+ J5 |4 z9 g2 R%
! i2 @% [9 O2 _% input :
1 X0 Q9 T# C) C) w% x : input signal ,samples * channel
" `6 s- l( z4 T5 J1 |& V5 K% fs: sample rate
( |# ? X$ f" R9 F% N : fft length,frequency bin number% E4 @4 R3 v7 ]- t a2 F
%frameLength : frame length,usually same as N
3 ?$ V; k7 v6 [0 K4 P- F% inc : step increment
% U$ f" j2 U" l- j% r : array element radius b8 ]) m" W9 b( S4 H1 ^+ s
% angle : incident angle l: Q' T* S. [" K; M, e) X
%
! Z2 W. g" e" z* R- A$ d% output :
: G0 z" b* T/ a4 y' f6 G% DS : delay-sum output
( C+ h+ g; z1 ~) [' m- W* H% x1 : presteered signal,same size as x
1 o" M3 B3 h& @4 W%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 Y+ p5 Q+ Y. D
8 {4 q8 l* t6 Vc = 340;
1 [2 [) {7 r6 mNele = size(x,2);4 f0 [; E' I" K; U g
omega = zeros(frameLength,1);. P5 S5 n% z* M" [& v- L/ u! I. P
H = ones(N/2+1,Nele);& i% k; `' Q( J* o* ?. H6 L
" ~4 G5 E7 E& R6 M! Stheta = 90*pi/180; %固定一个俯仰角 S6 k% Z/ e7 K. p$ ^/ C$ {
gamma = [30 90 150 210 270 330]*pi/180;%麦克风位置- b" F0 B2 ^' w! [$ J4 \& ?7 n
tao = r*sin(theta)*cos(angle(1)-gamma)/c; %方位角 0 < angle <3603 V* s2 v* a7 y, w7 s
yds = zeros(length(x(:,1)),1);0 I+ S; o* P4 D; o7 F" d( @
x1 = zeros(size(x));
5 q: m% Q/ n' d# T) G9 }! q$ [2 t. H* j+ U# g$ S
% frequency bin weights
/ X$ N; m( E# @1 w8 u" `" I% Y% for k = 2:1:N/2+1
, l5 L" B$ N- f- N" C8 Z0 x$ ffor k = 1:1:5000*N/fs' u1 S, G' u, ~4 c: M+ j$ s
omega(k) = 2*pi*(k-1)*fs/N;
/ k$ [3 W9 S* M# w' v9 W % steering vector1 F% i3 ]3 R" B0 }8 k4 b/ a
H(k, = exp(-1j*omega(k)*tao);
+ Y" \+ i9 n+ I, Y# K$ Aend" ~- s1 Y( U a3 r8 ^* H; T
+ l7 I Y! _. s8 B9 Tfor i = 1:inc:length(x(:,1))-frameLength( ]5 t& ?6 ~- ~- q& s. D- y
8 N/ L* f* D, f! K4 Q2 ^9 ` d = fft(bsxfun(@times, x(i:i+frameLength-1, ,hamming(frameLength)));
0 W) K' N0 p6 }) g. C/ t2 m5 `. E! c2 ]+ P- m r/ O
x_fft=bsxfun(@times, d(1:N/2+1, ,H);; L% c8 N$ b- U- q
; R* v7 u) X) _. p/ c# |
% phase transformed
4 E( F0 Q2 q3 y2 S* ^ _# t %x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));" K. q( \( {: K' f4 l
yf = sum(x_fft,2);$ ~1 \/ R/ V4 V# n: ]4 k
Cf = [yf;conj(flipud(yf(2:N/2)))];
$ X$ S: n* \$ I! a" m/ o
' b) s" u1 D+ @3 F: _5 ?3 k % 恢复延时累加的信号
* P6 a. c4 F% V# c yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));* U+ Q8 e( e* Q0 {
5 Z: V! o' C' j- q % 恢复各路对齐后的信号
, c9 O9 G3 N. v7 s3 w- }: Y xf = [x_fft;conj(flipud(x_fft(2:N/2, ))];
3 U8 `2 ], T* ? x1(i:i+frameLength-1, = x1(i:i+frameLength-1, +(ifft(xf));; B; g+ u3 ?7 h' Z" v
end
1 ^& r; N# T4 }; \& U- KDS = yds/Nele;
5 i5 f8 ^! E+ Z. j8 Y4 w, j
. K' i% S A2 D3 H" t, x, L. t# Fend5 E" H, J2 S5 @5 w' G7 Q4 l
然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下4 @: i9 o; s3 W4 n0 G3 Q% T
4 ]' ~# c: J8 O6 Y( H3 H- t( `* z9 A, p
%% SRP Estimate of Direction of Arrival at Microphone Array3 i% o3 x: m$ V7 m. d- E
% Frequency-domain delay-and-sum test6 W4 D+ r4 l) N' \5 _/ M; V3 F* p
%
5 a. K* N9 n1 Z6 T8 q" Q( `%%1 ~4 n1 J( \7 y4 R, V
2 H T7 p$ F, |% E% x = filter(Num,1,x0);- Q4 k! \/ S6 J w f
c = 340.0;7 l. r: F8 k8 X
4 Y& c) N; R) T7 D2 a1 r$ \; u: v0 l
% XMOS circular microphone array radius# Y( x; N/ R4 N" L; c
d = 0.0420;
6 g8 |/ I! h8 t, j) X% more test audio file in ../../TestAudio/ folder/ C5 _& m, |; s- X+ \* {
path = '../../TestAudio/XMOS/room_mic5-2/';
7 F5 I% a/ }4 Z6 Q' J! P# T/ z( s[s1,fs] = audioread([path,'音轨-2.wav']);
1 i% v4 n. J' o7 s$ Is2 = audioread([path,'音轨-3.wav']);8 H( i" R$ J* g- N5 U7 M
s3 = audioread([path,'音轨-4.wav']);4 h% O! M0 D' O0 |% r, z& p- R Y
s4 = audioread([path,'音轨-5.wav']);
: \, b5 s$ t2 g7 x, Z: Es5 = audioread([path,'音轨-6.wav']);
' j6 I. r' }! \0 D; o! ls6 = audioread([path,'音轨-7.wav']);" \$ C$ J/ O! f) Y& v+ q* g
signal = [s1,s2,s3,s4,s5,s6];
7 v4 D+ r6 R; N! Z. p- rM = size(signal,2);& m; D! K' ?5 C2 C
%%
+ L5 i& F- g" c/ Z9 {t = 0;
8 m9 ` n* a% ] T9 o9 U$ i+ Q
% minimal searching grid
2 b0 Y$ @; H% A: Jstep = 1;
. V3 E- A9 D4 i* o/ b0 s& C" i* ~/ J9 e) w0 V/ `: s" G5 |
P = zeros(1,length(0:step:360-step));; y I, Z( y1 o! _5 p3 ^2 a5 I
tic. n. @, a2 Z1 r
h = waitbar(0,'Please wait...');9 h- i4 y% [! s* |8 \0 j( f: g
for i = 0:step:360-step
( z+ ]8 S% i( ], X1 N % Delay-and-sum beamforming
1 K# q' d. A( a- q, W [ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);
0 y! n: \9 t+ x' l k1 f* ^ t = t+1;
( L5 ]+ f2 U0 ^3 ? %beamformed output energy1 D" Q$ k7 |( I3 U
P(t) = DS'*DS;
1 j- Z4 g) ]" }- x3 c waitbar(i / length(step:360-step))! y& b+ B2 _' d d8 M; c
end1 X- N w: g7 l8 e" c
toc! V4 M3 p0 ^) u5 Z4 i( T6 Q" m
close(h)
! s' @. R% j0 @+ L, M* g; p, n" @[m,index] = max(P);; {3 ~9 V( }* ^& _2 M" G: `
figure,plot(0:step:360-step,P/max(P))
' `( F4 F- \, ~! g, k% w% tang = (index)*step$ C+ v4 O. d. o# [# \
5 A) B* g7 e8 y9 a
程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下
8 {. m) r6 o$ d# u![]()
* u# E7 C& k# ]' g8 y- o结果与预期相同 PHAT加权 与GCC-PHAT方法相同,这里也可以对幅度做归一化,只保留相位信息,使得到的峰值更明显,提高在噪声及混响环境下的性能 ( w5 W" U+ {1 u2 O
上面代码中加上这一句 7 S5 E: S7 L& W* x$ M( {+ _* ^
%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));
; Z+ F9 \' G T* z1 d测试同样的文件,结果如下 2 h# B2 G- D! j/ M+ S9 u
![]()
5 N# b! `, D4 Z对比可以看到,PHAT加权的方法性能更好2 _1 l9 }7 B3 W! j0 l: {5 X
参考
3 \1 p: E; c& f' S1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》 ; P F& Z. A ^$ i+ H( g& B
2. 《传感器阵列波束优化设计与应用》0 k, k9 O; _: M8 w
————————————————% k8 x/ c7 t# t R( Z% w+ B5 F- K
版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
# a& u( v3 W6 m+ ^4 ?1 |2 c原文链接:https://blog.csdn.net/u010592995/article/details/815865048 B0 m' {2 z( s9 ]! s# Y8 ]% a- p# K
) E: M8 o% n4 s, C$ w. n6 w
( a& E4 E( \0 Y* F( x! {
; L/ Y# Q8 X/ R
1 z, V4 t0 c2 t/ @
, m# H. I- v& k: } |