DOA3 M/ f+ m" L2 ^/ U
声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),8 s" k8 Z) X! J) E( p% A- ]7 o
0 H; C# O! e( T b) Gsteered-response power# \& V- T6 L/ S) T& z6 b. c* C
可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。 * ]! p ^+ W* T9 }0 }0 e" W- }
上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。
5 z! M0 M) y8 F7 Q) _ 其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现4 Q! T$ b! b5 R$ [# Y
0 V) t- Y! U9 f# Q1 u频域宽带波束形成
y1 R) P4 L7 @, {% F5 } 频域宽带波束形成可以归类为DFT波束形成器,结构如下图 4 s7 a/ x2 K9 i2 k6 @
7 {2 R, ]: D) }$ u8 o1 y7 ], l* K i% R4 P$ @ z6 H, X, l( a9 l
频域处理也可以看做是子带处理(subband),DFT和IDFT的系数分别对应子带处理中的分析综合滤波器组,关于这一种解释,可参考《传感器阵列波束优化设计与应用》第六章。 频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT 5 T$ B4 b8 q# @: E- Q; a6 j$ [. D, N
代码实现如下
& r" G. H7 C3 S9 r' z$ f+ o* h wnction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle): x- N3 I) F' V/ p u
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%: c! A8 F- C! K! p2 q7 O
%frequency-domain delay-sum beamformer using circular array7 X. y( c) n% s( i$ v
% & z8 t. C% E5 D7 Y, W0 W
% input :
) @3 n2 z* [+ N. ]" N% x : input signal ,samples * channel
4 U" e1 F; Y2 [ I2 M& q' _% fs: sample rate5 _! a- i8 r0 t: C: [1 O- d9 i
% N : fft length,frequency bin number/ U. h2 ] k4 V4 o/ {* e
%frameLength : frame length,usually same as N
( ^- ]- A. v( }* `" ^3 U3 Q$ S2 @% inc : step increment, \( e# C1 j3 Q* c2 |
% r : array element radius- H1 U7 Q; q& s& G% E; W
% angle : incident angle
* n6 |' T0 Q9 }! ~%
) ]. f# u) l& t% output :8 k- Y8 I4 ]3 f5 V# l; S
% DS : delay-sum output
" ~* i+ ~" b9 B: l. }/ [% x1 : presteered signal,same size as x( A( K! E, b6 @ i
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 H3 r" [# N3 V; X0 S
9 v0 O9 B) t2 W" A8 j
c = 340;
0 U7 y! n4 p. k# j, H8 ^: @Nele = size(x,2);
% }* ]- Q! j+ I/ ]; b+ p7 ]8 tomega = zeros(frameLength,1);0 C; v- A1 `6 t& w* Y3 V6 U
H = ones(N/2+1,Nele);3 S" j; A2 [+ c
% @9 W) B' z% r, j9 A% \theta = 90*pi/180; %固定一个俯仰角# [/ B6 F; ]- ?) n2 _) n
gamma = [30 90 150 210 270 330]*pi/180;%麦克风位置
& u& x9 }5 o, A) U; Q! Z* xtao = r*sin(theta)*cos(angle(1)-gamma)/c; %方位角 0 < angle <360" o. b* B# Z7 L* x7 \/ w2 d! \
yds = zeros(length(x(:,1)),1);3 T: i4 N" A. L6 Q3 T- k
x1 = zeros(size(x));! d! A2 K& E; s* Y/ k* x
1 x- s8 t) X6 s
% frequency bin weights
\8 M; d- H$ ^! K$ @$ V8 q" a% for k = 2:1:N/2+1
& n, e$ c2 _0 F$ S+ _* yfor k = 1:1:5000*N/fs
/ o9 R6 `, \0 v, q" B9 E6 d; l omega(k) = 2*pi*(k-1)*fs/N;
; C% M/ D2 c2 F % steering vector0 y7 r- h! b% D4 t. U
H(k, = exp(-1j*omega(k)*tao);# C" r' C/ w% {1 T3 B! B' d
end
. o6 A) V `: y* n ^9 ^* s9 C! Y9 W; W
for i = 1:inc:length(x(:,1))-frameLength4 R2 S+ O1 Z5 W5 z
! |. c0 h5 C; @; z
d = fft(bsxfun(@times, x(i:i+frameLength-1,,hamming(frameLength)));
' M, d5 c$ z Y B6 U8 s2 ]1 F$ J8 L/ G
x_fft=bsxfun(@times, d(1:N/2+1,,H);
t& I' W' |2 H/ q% n( T4 ~0 S, ]' W4 H6 Z
% phase transformed
! |5 D/ u( j& l( [! O9 R* G %x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,));
" p0 n e2 r* }9 I4 g yf = sum(x_fft,2);% z4 e2 C; a/ o1 A! N
Cf = [yf;conj(flipud(yf(2:N/2)))];# j) P& |( c1 ]. ]* a9 p$ J: Z
7 G" d0 H. s6 H
% 恢复延时累加的信号
1 Q/ h6 O- X- A+ l } yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));, I+ E* e/ e9 @. O- g/ ]
: @$ T& D# V5 y H/ }$ e % 恢复各路对齐后的信号( }' h" z d# R9 z
xf = [x_fft;conj(flipud(x_fft(2:N/2,))];4 z; q( L$ ]! H1 N0 [0 K
x1(i:i+frameLength-1, = x1(i:i+frameLength-1,+(ifft(xf));
4 T, ], H& X/ o; F# g Bend# {3 D/ r( J" v: S- {% e8 E
DS = yds/Nele; 5 e$ A0 X5 P6 B2 i& c% o
/ T2 U! R3 `/ V2 l6 M8 a/ n$ G1 S
end+ T8 S6 C9 d* K, H) y# i
然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下% w/ ?3 U' p0 a0 o. W" u- R
2 J2 J* f# W! J8 s% F3 h c%% SRP Estimate of Direction of Arrival at Microphone Array+ ?9 {8 E& z$ c B
% Frequency-domain delay-and-sum test
2 W8 ]/ D. t* @% + @( z, C% A6 J J$ y" }* r
%%
) {* |% ~7 R: m/ P& a: P! P6 f8 W) ^ u3 U
% x = filter(Num,1,x0);, U- e' n" P& k$ N* v/ s
c = 340.0;/ b i1 E/ k4 Z- q' ^% o
* V+ d( D, x4 r, B% XMOS circular microphone array radius7 M: M$ Q( j8 R; W; H
d = 0.0420;7 l; Z' ?1 R/ x' @# X
% more test audio file in ../../TestAudio/ folder! _: u- k+ \: N1 a6 F1 c
path = '../../TestAudio/XMOS/room_mic5-2/';0 o. I/ Z' J/ e2 J$ l" m
[s1,fs] = audioread([path,'音轨-2.wav']);0 X: T8 S; }9 {% n" o4 B4 `) d
s2 = audioread([path,'音轨-3.wav']);
- a) N2 X2 f9 b6 H! S6 R% m6 y# q+ ]s3 = audioread([path,'音轨-4.wav']);( ]1 U) q" U; M! Q9 s+ N
s4 = audioread([path,'音轨-5.wav']);% ?4 E) [8 I, e$ y# i6 {
s5 = audioread([path,'音轨-6.wav']);
9 x. `' i: r# is6 = audioread([path,'音轨-7.wav']);# x, {) o# u$ G) b- X& v% \
signal = [s1,s2,s3,s4,s5,s6];1 h# }; |. f- g. ] V( f! e
M = size(signal,2);9 v) g5 S1 v8 {, H$ F; M; b
%%
1 h9 R1 H5 C) P# u/ |. Ht = 0;
/ p3 @/ ?2 M- D4 s5 I& R) ~% V: Q0 Q! E) V
% minimal searching grid
]8 ?+ M5 E# n A# s; A$ i' ~step = 1;
~. g+ J" Z# B0 o! U0 `7 T
9 K8 x) E9 z8 ~9 |% |P = zeros(1,length(0:step:360-step));
8 u6 F7 Y5 H. r9 [+ d: k' R0 |tic
2 Z/ _- }8 g* d$ v% o, N9 Fh = waitbar(0,'Please wait...');0 T( m' g- Y9 }, q K
for i = 0:step:360-step# X) b, ` |! `9 S1 {) \) o
% Delay-and-sum beamforming
8 k4 I6 U& y5 Z [ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);( A) W& {3 X" \; d* P. k) d5 f k
t = t+1;1 E4 \; a: | D" E" b8 m
%beamformed output energy
& n/ w) f4 E- b! c; C P(t) = DS'*DS;: ?# O+ r- e. S4 S" Z; L% ]8 ~" h. t
waitbar(i / length(step:360-step))
5 u# m7 |3 q9 e' eend1 M! H; ]3 A8 }) |$ r2 H
toc
8 M' H2 o) a# v* E' A3 Bclose(h)
2 s$ i$ _# ^ V! k( t[m,index] = max(P);
& O. Q$ _+ B. Efigure,plot(0:step:360-step,P/max(P))2 v. T3 m% _( z
ang = (index)*step5 p9 u& d. l6 a: l5 t3 Y
* W+ C3 Y- L- ?7 c! u8 ^! W2 j$ D
程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下2 d9 g( R) Q; u# z+ q
+ B- }- Y8 _) i0 {# g结果与预期相同 PHAT加权 与GCC-PHAT方法相同,这里也可以对幅度做归一化,只保留相位信息,使得到的峰值更明显,提高在噪声及混响环境下的性能
5 f- k+ q) x% F2 x5 i 上面代码中加上这一句
; x4 F$ q, {, t1 j: c0 q( J%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,));
# N& e) s& M" r0 D0 x测试同样的文件,结果如下
8 S6 w; K7 M, I/ t9 \- X7 R( a/ _! ^5 z) Y+ \2 d1 y! m" l$ g
对比可以看到,PHAT加权的方法性能更好
7 J+ T7 p/ J. K) G参考2 s) Z0 V8 K! H* c6 B# D
1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》 ( b& T, x2 A+ M$ g
2. 《传感器阵列波束优化设计与应用》
# R( q A& J5 X% |3 K, H————————————————9 f* g- b z9 d& n# C# F* y5 z
版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
9 m, Z; p" E: o, Q/ |1 B7 a原文链接:https://blog.csdn.net/u010592995/article/details/81586504
, j' Y, r& [+ F: O( b+ C& b) m
+ ~. T0 w T" V& ?9 E0 g4 q4 z- x! u& Z! p! b
! ` }2 ]1 ~- i! E0 }4 c4 ^! s7 E* ]: X
1 e z3 M0 _& m0 ]9 M% s
|