DOA! H" {$ D1 T4 T
声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),
* S9 K+ w" s0 H, ~
8 \4 y2 a$ Z" _- O { V* p a; Usteered-response power
; l7 ~# P4 ^- l0 O 可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。 / V4 A _6 u% Q& K
上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。
2 G' b0 _; ?- [9 X" q 其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现
$ f, p0 A8 o4 w6 n& ~
- d: g/ ~0 Y: h% h- V+ x* X# }频域宽带波束形成
, t# I% i' a9 B4 a' W3 l 频域宽带波束形成可以归类为DFT波束形成器,结构如下图 0 D+ ^8 {; W6 {5 n
9 l9 u! o7 ? z' f; D$ c% z# D5 |' e
, \1 v% Y% U& T
频域处理也可以看做是子带处理(subband),DFT和IDFT的系数分别对应子带处理中的分析综合滤波器组,关于这一种解释,可参考《传感器阵列波束优化设计与应用》第六章。 频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT
* p7 G9 b4 D& O7 w( b8 W/ Q* X4 B代码实现如下
! G& v9 `. \# knction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle)
# O. Z! I1 |( p1 k- y! k" f2 c%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
, O5 G4 o( ]0 T1 \& K }9 }, `%frequency-domain delay-sum beamformer using circular array# \) {9 l9 `- X* D7 q
% 6 z9 o! H' i( S( S
% input :
! K' `& Y# l+ _4 |% x : input signal ,samples * channel
* Q$ H; F# B' \1 o! }% fs: sample rate7 W x* ^9 m9 \: s; J
% N : fft length,frequency bin number+ m' J6 e1 L- o# ^
%frameLength : frame length,usually same as N
/ R) E. K9 U7 L5 @ Z" l% inc : step increment3 M, `0 ] Q8 ^9 N+ k6 j
% r : array element radius
( e& n+ M, e! b3 Y% angle : incident angle
7 J/ v& |6 k @. h% f& R8 @$ V( l$ i7 h+ x: h
% output :
) c6 B6 n3 c! G/ x9 t9 i% DS : delay-sum output4 b/ O Z$ g! t5 r) q
% x1 : presteered signal,same size as x8 u& N& J5 o+ V. O8 Y$ t" F. w
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
. M9 D6 x4 U0 ?! H0 l/ P
: {/ j) z% Q9 s: \2 Y [/ A" Cc = 340;0 o" Q3 m t+ V$ m% G% u& k" X
Nele = size(x,2);
- [( p" V1 n6 u! P$ E7 A) nomega = zeros(frameLength,1);: t! U8 _! c5 E; P( J
H = ones(N/2+1,Nele);
& y0 [8 h* w, a1 @5 q& m! F/ L6 E! o; W4 N7 n
theta = 90*pi/180; %固定一个俯仰角
( q0 U4 |2 i7 z) [# Vgamma = [30 90 150 210 270 330]*pi/180;%麦克风位置
8 [) H5 o9 C; G; {" `tao = r*sin(theta)*cos(angle(1)-gamma)/c; %方位角 0 < angle <360) }* K8 C; Y' }6 J8 ^
yds = zeros(length(x(:,1)),1);! ?+ N# z ^. g' ^+ ]( i& R3 @' ]
x1 = zeros(size(x));
8 S' W" f; d) r N) F) s
2 G# n( J/ B6 Z! l% D, [, R* ]. ?" z% frequency bin weights
[1 Y; O0 h0 h$ Q/ l& D7 y# @% for k = 2:1:N/2+1
7 e* ~- `+ a9 ]) X" Ufor k = 1:1:5000*N/fs0 R3 ]) o8 _4 V6 G! I
omega(k) = 2*pi*(k-1)*fs/N;
- B/ F+ P' n1 B' N % steering vector5 _$ z2 e( R$ P
H(k, = exp(-1j*omega(k)*tao);
/ O+ J4 g0 T% z5 s5 @$ Gend
5 q$ W- f# c. ~0 \
, y1 L. _2 R- B* lfor i = 1:inc:length(x(:,1))-frameLength
+ d0 S$ x# g) H2 D5 b' E5 {4 u8 A1 Z1 Z; w# W- j V0 b% d
d = fft(bsxfun(@times, x(i:i+frameLength-1, ,hamming(frameLength)));
* d6 L* W( k+ x9 `+ z
' E. D4 x6 o/ U x_fft=bsxfun(@times, d(1:N/2+1, ,H);
, L" E8 f# P, Y# H
4 E. r( s- `* ] % phase transformed9 _& p1 l2 n; J7 I" f
%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));
6 `8 I( Q7 W {. B* K1 k: G- t yf = sum(x_fft,2);# g, ~' y8 N! k' r
Cf = [yf;conj(flipud(yf(2:N/2)))];
: }- k) W& L% H7 k4 A1 D* b8 S1 i0 H; o$ L$ m) L
% 恢复延时累加的信号# }# P/ Z, N+ z$ j4 W* |
yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));
, Y A6 H G5 W9 P: l; a/ c# V
" D5 p& f7 R7 ^ % 恢复各路对齐后的信号
7 C b. |- s7 C: Q: ? xf = [x_fft;conj(flipud(x_fft(2:N/2, ))];
9 z* s, J6 d" r/ _) T3 ~ x1(i:i+frameLength-1, = x1(i:i+frameLength-1, +(ifft(xf));
* S2 g0 E) z m( e/ q2 I6 Yend
, Q! Y& k. d0 e, g0 `1 a8 dDS = yds/Nele; 5 {8 s# U- \: d/ |9 N. n6 T
4 S4 X P8 S8 C1 P6 O# hend+ o2 w! L2 |1 }$ \5 M* i- X
然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下% p" B# q2 {+ E8 J6 I7 ]
6 f7 M7 X3 Z5 V4 t9 i5 h%% SRP Estimate of Direction of Arrival at Microphone Array
9 F/ ^- n) o2 Q) G* u) m% Frequency-domain delay-and-sum test
* U; d4 v, y% _4 ~- r( R* k% & y* j1 u: m" }$ v* H
%%
& r: Z1 A1 o6 |! S7 c, t% m
& _6 M8 c7 P# B }2 H8 y% x = filter(Num,1,x0);& k2 o5 k5 p6 f7 `
c = 340.0;! [; ?. q. F% V' l3 H/ f; o
! ~8 v0 P- S! k4 ~7 C% w
% XMOS circular microphone array radius
7 R/ u2 R0 V# p/ a5 rd = 0.0420;' G' O/ A# [/ q. s) j
% more test audio file in ../../TestAudio/ folder" l& A# Y2 N/ `( _' A+ D! V- A
path = '../../TestAudio/XMOS/room_mic5-2/';/ |5 L1 z; w, O7 `; Y
[s1,fs] = audioread([path,'音轨-2.wav']);4 t% N( C5 K- u' k
s2 = audioread([path,'音轨-3.wav']); E/ u |6 h0 e; @' O
s3 = audioread([path,'音轨-4.wav']);6 S C5 h: Q& _2 o" a% ~8 C; K
s4 = audioread([path,'音轨-5.wav']);; t6 u/ ^/ o3 c0 g% p
s5 = audioread([path,'音轨-6.wav']);
0 |: a- T, |3 h. Bs6 = audioread([path,'音轨-7.wav']);
5 c2 ^3 L5 o: k- e; rsignal = [s1,s2,s3,s4,s5,s6];
& E9 ]+ U0 S5 n9 A5 r) c6 oM = size(signal,2);6 F5 }) I8 ~1 M: K! k3 j
%%
f* I1 J9 w, {$ Mt = 0;' O9 Q! q ~2 L
& x3 I7 @" R5 J) Y6 U7 J% minimal searching grid) ?1 _7 v$ s; x% C* B V5 X
step = 1;
! O' s( U2 N) { x% Q3 O* A4 a
R5 c/ N0 g$ O' ]! j: [P = zeros(1,length(0:step:360-step));
/ a+ `, }( i' v: Rtic8 v. e* L; e* ^+ `. p3 i' s
h = waitbar(0,'Please wait...');
# L& b* o' o' x4 @1 a8 J- kfor i = 0:step:360-step
4 n: v4 c1 A) X& S! A % Delay-and-sum beamforming
1 Y, e& s+ J" ]7 X2 N5 f [ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);+ d" B# k' {* }5 p% T7 X. G" @
t = t+1;
3 P7 R, O: N5 e% L) g3 y/ U, l %beamformed output energy H: S3 o2 o5 A$ i
P(t) = DS'*DS;
2 q2 Y v( X! V waitbar(i / length(step:360-step))0 k1 J# l |7 b: X! w# \0 d) N
end
* Q2 z8 R9 Q9 j3 x0 ?toc
4 z) R- m2 u4 F9 R) @6 L* s G4 [( Iclose(h) h1 a# u+ g9 d' l9 a+ L: i1 y& h
[m,index] = max(P);1 X0 O) }! g# m' s& p
figure,plot(0:step:360-step,P/max(P))6 N# Q6 \7 U3 F
ang = (index)*step
$ f9 k, ~6 O9 M4 N2 n: q$ K( l
" P) D+ m! S, h! d+ _8 ]1 a2 [0 Y" V程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下
$ x* U; w9 x- ?+ P7 |1 H1 t( b6 [![]()
* m) _4 |+ |( a T5 `结果与预期相同 PHAT加权 与GCC-PHAT方法相同,这里也可以对幅度做归一化,只保留相位信息,使得到的峰值更明显,提高在噪声及混响环境下的性能 + A: d) q' Q2 D/ p6 Z" B" V8 \
上面代码中加上这一句
1 h5 U; q W( H1 l# K; ~%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));
! x, _' d3 _+ k- p! H9 s测试同样的文件,结果如下
* u5 Q& [# ` P7 R F8 x0 I( g) u![]()
" X/ d7 {2 Y) }. O对比可以看到,PHAT加权的方法性能更好! n' z+ s3 B* b! r' m: I' f9 o) y
参考! ]9 ?7 a7 M3 s% @! c9 C# e
1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》
5 f( [. s, V( Q3 O+ x2. 《传感器阵列波束优化设计与应用》
$ k6 |. g. {5 `6 _ e6 ?9 b————————————————
; f. p2 H4 E6 V7 A% x. g版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。3 o/ A2 h9 U$ \7 Z
原文链接:https://blog.csdn.net/u010592995/article/details/81586504
2 D3 b) ]8 A, g' f, ]7 @4 C, u2 m9 U8 K7 V
" a% b; _/ e' }) o: ?( }
h4 }$ U! N' S: S
0 ?# l% k/ |3 E6 ~
2 `; `1 ~5 ^8 b: n% X |