DOA( W, n# `' N* f3 o) Z% H3 d/ `9 s
声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),
" I# x+ A3 W2 [) r9 b+ \+ o3 N* k& P! P1 {2 C U6 ~- d
steered-response power
' T+ w) {$ J- E% \( ?8 h 可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。 ( w' S T. {6 s1 i
上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。
' Q$ R0 Y+ Z9 [% t3 f 其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现$ U& n! u+ L' Z5 W5 R$ A
' Z& ?7 N6 Y* u2 ^0 n
频域宽带波束形成
+ r9 |) v6 B# ^7 } 频域宽带波束形成可以归类为DFT波束形成器,结构如下图 $ j2 ~ T* P! X- P& J
![]()
8 B: Y4 n' H. \7 i9 ~! X7 ~6 B k: f
频域处理也可以看做是子带处理(subband),DFT和IDFT的系数分别对应子带处理中的分析综合滤波器组,关于这一种解释,可参考《传感器阵列波束优化设计与应用》第六章。 频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT 4 J& W# E! n A: N
代码实现如下 7 B7 W& @3 v, R7 U( e8 j$ n0 k0 F: Y
nction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle)
9 w3 ?1 @6 S; d! Y%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%' G: M/ z# u, L0 J4 r1 H/ ]4 t$ Y/ v
%frequency-domain delay-sum beamformer using circular array
. \4 l0 ^- d5 n0 N8 Q%
; Q* d( X5 K/ Z# ^1 N/ I6 x% input :9 s5 Z$ m) D0 H, h. |
% x : input signal ,samples * channel6 J1 h) ]) w3 r! l
% fs: sample rate9 i9 X- ~4 l* B( \4 z5 q8 B6 s
% N : fft length,frequency bin number* y; V: }0 N! Z# k
%frameLength : frame length,usually same as N
# x' D4 m6 n, g2 l# \2 b% inc : step increment: G3 _ |% e+ Q. t
% r : array element radius
1 g2 g% c( f3 @. O) t2 I, R% angle : incident angle
. D7 D3 p% ?1 m# y& B4 a: M% l% |5 B2 {& O6 R* y* z
% output :/ p2 D8 U2 X. j
% DS : delay-sum output
8 o- g) S4 D, M5 R" D% x1 : presteered signal,same size as x) D, `6 p- u* e2 j ]7 U
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 n' Y; S b' ~6 O- i
! h' l0 { \6 y( U# @
c = 340;
0 ]: a* x% D6 F9 QNele = size(x,2);
( t1 V* K/ ]9 E# C' W4 Womega = zeros(frameLength,1);* {0 E- b; T2 @ M& K" h5 j8 F
H = ones(N/2+1,Nele);' s% I P$ p& D! f j! J9 \" k
, e2 y1 r/ y6 a( l
theta = 90*pi/180; %固定一个俯仰角) i1 m% R* U% R$ I1 d5 g7 M1 O
gamma = [30 90 150 210 270 330]*pi/180;%麦克风位置
/ F) A x4 _$ j7 C% Mtao = r*sin(theta)*cos(angle(1)-gamma)/c; %方位角 0 < angle <360
# y* Q: W/ p, X7 N% I* p/ |% K# Nyds = zeros(length(x(:,1)),1);
9 @- d h" \- Bx1 = zeros(size(x));
+ h7 F7 }, T8 L/ D5 @' d
b5 u1 O% Q5 l1 ]4 ~8 U) N% frequency bin weights
# a1 {: F$ a1 o) {% for k = 2:1:N/2+1
; D; v, N! z0 n$ T+ J$ V( n) Dfor k = 1:1:5000*N/fs$ w4 n1 Y( k, w" U, U6 A) }
omega(k) = 2*pi*(k-1)*fs/N; ( X/ y0 n( y; p
% steering vector- y3 T+ j2 M! O3 p
H(k, = exp(-1j*omega(k)*tao);+ C; a( C8 Z; |" V3 z9 m
end W2 U3 Z4 E' O
+ Q/ `- G( s) E, O# ^4 Y8 s1 W
for i = 1:inc:length(x(:,1))-frameLength$ i( J& d7 _! Q4 i
8 T+ R6 z9 A/ ]1 j9 H
d = fft(bsxfun(@times, x(i:i+frameLength-1, ,hamming(frameLength)));
/ x! y. K6 t& c4 {6 u
8 ^$ J) V( K9 h; I x_fft=bsxfun(@times, d(1:N/2+1, ,H);
4 X3 q) d5 m' }; | a l
9 l' O+ Q' K; q. g- n* _ % phase transformed) ?0 [0 m6 e T* F9 {0 x. S
%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));& K6 P5 _ T4 v2 j/ x' w
yf = sum(x_fft,2);' U- h% S: J- ~, H! {
Cf = [yf;conj(flipud(yf(2:N/2)))];
$ m& X8 o7 \1 q6 _* l0 j
X/ y" ^- F/ u) P % 恢复延时累加的信号- ]7 ~* @; W- s1 p1 t
yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));2 O% J! J( R' M5 R, n
& \0 i7 C( c+ u2 M4 Q0 w % 恢复各路对齐后的信号) C, ^+ y$ O7 y
xf = [x_fft;conj(flipud(x_fft(2:N/2, ))];
( |) U. |: ?. W" n+ p x1(i:i+frameLength-1, = x1(i:i+frameLength-1, +(ifft(xf));% c& f- L2 v* x3 Y
end
! L# M3 T: \( E( s- c; RDS = yds/Nele;
+ ^5 f l( u+ R( z3 d( c
( w' @9 X7 @2 t! D3 h+ send9 r I* u/ d1 X) j. Z- ?, Z5 o! T. j/ @
然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下. ]) g7 U5 ~/ l' A5 }
, P" E8 \+ k& x! V' V. X; d
%% SRP Estimate of Direction of Arrival at Microphone Array
% ~7 q6 T6 J& _. s* i. X$ x: E% Frequency-domain delay-and-sum test
! |$ Z, ]& J- A% , C- _! W- g0 e
%%
' ?$ l0 ~$ H! M% r, w( x5 j* J2 r6 f4 I% U( w0 W* u
% x = filter(Num,1,x0);" \+ Q: E! y2 J* G/ _
c = 340.0;
) o9 I7 W& I; r2 G( [
$ C z+ x: \: {5 j1 v% XMOS circular microphone array radius6 `! Q3 W% Q, _5 i R$ T9 v
d = 0.0420;2 O* V3 R `- a9 J0 o' |! A; B
% more test audio file in ../../TestAudio/ folder9 p! m |' f, w5 d
path = '../../TestAudio/XMOS/room_mic5-2/';/ s4 \8 C# l6 e& u0 z7 X
[s1,fs] = audioread([path,'音轨-2.wav']);+ B4 D4 [+ K- G1 y
s2 = audioread([path,'音轨-3.wav']);3 \) k: e9 X! I2 g
s3 = audioread([path,'音轨-4.wav']);
9 d6 ?- I5 C) `. l2 As4 = audioread([path,'音轨-5.wav']);
( {+ D4 e0 a9 H& a6 Ys5 = audioread([path,'音轨-6.wav']);
7 Q [2 ^) S2 q) v2 j) _. es6 = audioread([path,'音轨-7.wav']);
z7 n& _8 U& E. ]7 o% isignal = [s1,s2,s3,s4,s5,s6];# [4 e: r& j5 i2 G- ]
M = size(signal,2);6 J2 h \0 X2 {1 b9 l
%%4 |/ f! m1 L" W' h
t = 0;- h+ i6 c3 W( u1 X: j8 k1 n$ @$ Q' E5 ?
$ V# ^" N5 H; R; v& m7 d! B% minimal searching grid# s; l/ j+ I3 r9 s# s( G* T
step = 1;
: G* n0 N2 q9 N- i9 l* M( S% {3 Q4 ^6 w! X1 X5 v6 Z1 R- c. D
P = zeros(1,length(0:step:360-step));- K. ?6 I* {3 Y
tic
N" L% L: \: l/ r* Ih = waitbar(0,'Please wait...');" S# M. A6 O# e) e4 g
for i = 0:step:360-step
1 I3 {6 _2 h; P9 a& V % Delay-and-sum beamforming
r' S( Y: c- D. E% ]: d7 R; B [ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);
6 D* V& F [6 d3 [# g: [ t = t+1;
: Z+ @( K) C; c. n$ Q %beamformed output energy
- R" t1 V" k' O1 d1 y P(t) = DS'*DS;7 B& T& A( L, H
waitbar(i / length(step:360-step))- w* T& A+ Z4 J; {) Q& G n; H
end+ l z/ f3 h; t# L$ b/ N
toc
0 w9 c+ R& N4 oclose(h)
' K+ z& J0 Z' Q$ B[m,index] = max(P);3 H; f0 Q. m: S- w. U8 x2 I8 D( G8 C0 @
figure,plot(0:step:360-step,P/max(P))
6 v e8 [) M {2 g8 w) z0 Lang = (index)*step3 E2 v# N# Z6 v# X. Q
G) L! {6 _) A, E4 t, |5 h. p
程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下( [1 K' n3 x7 ~/ s8 v1 Y
6 ^* m) c$ B7 N+ J* S* q
结果与预期相同 PHAT加权 与GCC-PHAT方法相同,这里也可以对幅度做归一化,只保留相位信息,使得到的峰值更明显,提高在噪声及混响环境下的性能 8 F, x) m3 T" g9 g) `- X% t) i
上面代码中加上这一句 3 o, L" E' a5 T# ^% Q" j
%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));( y3 w. [: Z+ [( N$ T* `7 r
测试同样的文件,结果如下
: \' g/ Z2 {% O7 `$ G3 m* _5 `8 d 2 p V+ v7 L$ u' m6 S/ D
对比可以看到,PHAT加权的方法性能更好
5 |% X4 |' Z, {, ^' ?参考$ Y: j0 K) |( I* ]7 o
1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》
4 D( B* k9 R8 V# m ^2 I2. 《传感器阵列波束优化设计与应用》: U- H; B0 [. [9 L" s
————————————————3 t5 z+ X8 J' e
版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
4 z0 ] ?0 l" j+ S4 u原文链接:https://blog.csdn.net/u010592995/article/details/81586504
, q9 U) p+ n* J* }/ K
* \2 h @; c1 `+ ~6 P, e. r _! i5 m# e h$ R. d
/ p* V: p6 d: B) M4 L. C+ {" K
% |, o3 I- c/ u. u3 O1 B, d/ W: J' T1 [* a/ k, }4 I7 X# [6 M; H' p+ I* K
|