DOA
5 ?9 J# G. R* Y# _+ s% x' b% j* \ 声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),
! v3 X8 D7 C# k4 A) ^7 ], A6 t
& A. B5 j/ \9 E/ Lsteered-response power
$ J- U+ v4 O( D) C0 e, L( u: {6 ] 可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。 ) f( x+ l( J g" N( |
上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。 , W* ~# F T) P! _
其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现: e/ F! B6 W) k1 ^9 f' {
; N8 g% O4 F& G, f
频域宽带波束形成
; q- Y; O& v9 i. L* I5 S 频域宽带波束形成可以归类为DFT波束形成器,结构如下图
y0 h' a* K% |# k. s! r3 D3 o![]()
5 _7 }$ H6 ^. e0 O* ?7 b8 L l9 b) z- Y
频域处理也可以看做是子带处理(subband),DFT和IDFT的系数分别对应子带处理中的分析综合滤波器组,关于这一种解释,可参考《传感器阵列波束优化设计与应用》第六章。 频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT
7 m$ s J& m+ S8 q代码实现如下
/ z1 d% p! { a: d C4 c( gnction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle)/ N6 V* k' ^/ ^) P
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6 C0 Z9 P5 y1 p; A5 P%frequency-domain delay-sum beamformer using circular array9 {' S+ S! |- R1 N t$ d
%
9 A& Z& X0 i* ]" r% input :, }9 W) O V$ H, Z& Q$ i' [
% x : input signal ,samples * channel ~ v& y4 R3 s
% fs: sample rate8 X+ i& A. x: k/ j) A: R0 P
% N : fft length,frequency bin number
2 `. Z- F8 ?& T! I2 b3 E) c0 D4 f%frameLength : frame length,usually same as N
1 S+ r k2 {# a# i" p% inc : step increment+ q6 Q# o4 }: g( O% {3 l
% r : array element radius
8 Z8 D1 r7 w# c+ t0 F% angle : incident angle
; ^) g0 `% A6 P; }$ V9 B%
' J7 O4 M! H0 A& w+ k% output :
6 p( i) b+ ~: l2 {3 R5 c* w% DS : delay-sum output3 d2 \% m9 M* x
% x1 : presteered signal,same size as x
# X' C' B8 Y; k) A* w7 Z0 A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
, n4 {) q1 m9 q( M6 c1 \6 Y7 Q [0 ?5 T
c = 340;, U K- q! |% ?
Nele = size(x,2);6 q9 Y2 g5 y7 }7 w
omega = zeros(frameLength,1);
" k: s3 Z* M' [/ x. rH = ones(N/2+1,Nele);9 `# ]0 J6 R/ u( r& |" n. L3 m
5 c# M' ?7 ^ T! ^8 L+ j+ `
theta = 90*pi/180; %固定一个俯仰角3 O+ }* n! m+ B: p" y6 b8 x& F
gamma = [30 90 150 210 270 330]*pi/180;%麦克风位置& A. d/ {) o, V; x0 {. X5 G
tao = r*sin(theta)*cos(angle(1)-gamma)/c; %方位角 0 < angle <360# K9 X2 g" [( }( U
yds = zeros(length(x(:,1)),1);
# D' X' Z% l. ^: ^4 M0 ~& Hx1 = zeros(size(x));
$ q8 Y2 \( d% y/ r! p9 J$ k: f$ E# }) l' n: k/ X$ e
% frequency bin weights$ @! |$ R8 P3 A* d* j7 p" z. q
% for k = 2:1:N/2+1
( N4 ^' l# U5 ^' Y$ u% {2 {for k = 1:1:5000*N/fs
* `( W @! `( Z& B( i5 I7 C omega(k) = 2*pi*(k-1)*fs/N;
& Z% ?6 p+ f( |8 R % steering vector
; E# Y1 Z% }* x$ z H(k, = exp(-1j*omega(k)*tao);& h7 `6 v+ G( ~0 R
end
' |, \# p4 q$ E' \3 _$ K
0 B8 c6 Q& z. Y% \: o* E! d! ffor i = 1:inc:length(x(:,1))-frameLength
- }5 C" s' k+ Y0 J3 ~) H) a! C5 O
d = fft(bsxfun(@times, x(i:i+frameLength-1, ,hamming(frameLength)));' }2 C- [0 k0 G; }/ D
8 W4 K; }4 k; \4 o/ b+ t
x_fft=bsxfun(@times, d(1:N/2+1, ,H);
; q" A0 I2 x5 F, U4 h( @
+ ^! V" A/ `) h1 h2 j2 p6 O) V % phase transformed E) H/ V' R5 d6 c
%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));9 m" f$ m5 ?" Q9 P; ?
yf = sum(x_fft,2);: }- z9 M) H; L) P
Cf = [yf;conj(flipud(yf(2:N/2)))];$ S. P" j% @- q
. ^9 U; A- }! |6 ]6 X % 恢复延时累加的信号
( W9 Q- ]: P% @& r! { yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));6 D* t* h* N. C4 z3 l) `7 i
: \% _4 t# z, T' u4 K9 V
% 恢复各路对齐后的信号
; M7 p: v$ O- J' |( e5 V& w# Z" S xf = [x_fft;conj(flipud(x_fft(2:N/2, ))];
3 k3 k3 I% q! a1 l' x x1(i:i+frameLength-1, = x1(i:i+frameLength-1, +(ifft(xf));! j$ o% F4 _* k
end
6 U" x' b1 {! N8 A+ ?DS = yds/Nele;
u* j' _6 ]- S" O% I2 C% k1 \2 [( k7 r: Q# S1 U$ s& @! {
end
& _9 b' R$ K8 E2 z/ H# R3 ]然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下
4 Y/ `' q* y0 N7 n
+ w: o/ ^9 Y. H& w+ O9 i%% SRP Estimate of Direction of Arrival at Microphone Array
+ i T) W- l- K& B* Y% Frequency-domain delay-and-sum test
# d' Y/ ^) z7 w& `0 |+ I6 p%
2 R2 d' Z6 T9 Q+ `2 J4 F7 f' o%%
: i+ L* y6 e5 y4 c |; V& K& H3 a9 ? b! k% L \
% x = filter(Num,1,x0);
1 x& O- F( Y; l8 y+ M+ j4 Mc = 340.0;
' o3 w$ g+ h5 a8 W d8 o/ I
; z2 n0 Q* `: L# [4 h% XMOS circular microphone array radius% S1 O* Z, s+ c7 N b- J. r! D1 _
d = 0.0420;% V. ]$ d2 c( a4 {7 V
% more test audio file in ../../TestAudio/ folder
. a! [; B+ Q8 upath = '../../TestAudio/XMOS/room_mic5-2/';
- O2 j+ n; [0 V$ Z( E" o[s1,fs] = audioread([path,'音轨-2.wav']);
n' k/ N- o* R" }- ls2 = audioread([path,'音轨-3.wav']);( z# s4 V" `0 n: e9 S& v
s3 = audioread([path,'音轨-4.wav']);
$ g6 @3 l" }2 m! Is4 = audioread([path,'音轨-5.wav']);9 F0 a2 X2 @; F5 ?$ o5 @9 [+ m
s5 = audioread([path,'音轨-6.wav']);
" u( P4 Z: p/ Q" C( _s6 = audioread([path,'音轨-7.wav']);
2 p' F |+ {) L: p/ w& j! B5 n5 hsignal = [s1,s2,s3,s4,s5,s6];% h+ s' i/ `1 H; _" x: q ?
M = size(signal,2);! C) u* ]$ n+ \6 z; ]
%%, O& j+ v, G3 p
t = 0;. _4 r3 U6 \/ J. Y1 I+ o
# @- q" S! }1 R+ i% H# w N9 D% minimal searching grid
; B. a8 E) L- B) Gstep = 1;
! J. `& y5 t8 W1 }! O7 k/ a/ `! u
& A. _! h" r& o( sP = zeros(1,length(0:step:360-step));
; k) e7 x$ [9 H' A: I+ Etic
- G! S) B) Y& ?h = waitbar(0,'Please wait...');
7 L! l4 g A) s3 ^for i = 0:step:360-step6 B2 J: e, U' o* o
% Delay-and-sum beamforming7 u" D7 d. N4 i1 H/ D7 Y
[ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);
; Q, v s: c& R; \8 c7 `7 @ t = t+1; j7 e8 Z+ m6 v, d! f
%beamformed output energy
) G3 r7 o& {# [7 ` P(t) = DS'*DS;
8 w- D# I9 m+ d, {9 ~ waitbar(i / length(step:360-step))5 c* d( `7 V# k4 k; S' o" q) k/ N
end
7 d' C! `" M$ c; J* q" x; h4 s! {# f; Ftoc5 j( ]3 [- z# B, w- Z4 _
close(h)
" E5 H7 k' i) i4 h" U* F3 H; w" |1 L[m,index] = max(P);
/ c1 O" S" _) U# x, ffigure,plot(0:step:360-step,P/max(P)) `: _: A1 e- G% g8 v" [
ang = (index)*step- W: _& a4 t, H* v
4 X: b: O( q2 B# E程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下
) j# f. k, t) A( q7 C![]()
( b6 G9 k r- y7 i8 u+ v3 L0 J结果与预期相同 PHAT加权 与GCC-PHAT方法相同,这里也可以对幅度做归一化,只保留相位信息,使得到的峰值更明显,提高在噪声及混响环境下的性能
% C8 n8 P0 i8 j- k) y 上面代码中加上这一句 1 T! ~/ b0 D9 ~+ Q
%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));
* [( V% x* r3 K& ^* Q# U5 z测试同样的文件,结果如下
+ m) [$ d8 D5 e3 O; ?![]()
* k2 S6 ?# P9 h' N: F A对比可以看到,PHAT加权的方法性能更好5 e; l! n8 |, x- E
参考
8 m2 L! n7 \& A1 ^: K5 h; [1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》
* u, h$ E5 I# |5 w% a2. 《传感器阵列波束优化设计与应用》0 [0 Z) x" _+ Y9 P0 f9 B; Q
————————————————* J7 T3 z& p+ x& j$ N/ u4 A$ `( c
版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。, y+ O; t5 Y! x
原文链接:https://blog.csdn.net/u010592995/article/details/81586504
) ], P& D2 p1 W5 h8 s* r. P
, V0 x+ p& C: ~' p1 p1 r: I! G0 g! c1 l4 i$ M
2 _0 n4 m" k5 C- e }5 c
% M$ T- }% Z6 n: \# J% \9 \- v
|