DOA0 [ l. a1 l3 a3 _; M5 `
声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),4 x# x' [) a% D
I& i. C8 g$ j' q) N! h1 S
steered-response power2 T% |* s% p' T; _: U1 z
可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。
9 q0 M$ s9 U! m2 K0 V# } Z 上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。
, p' k) M5 K2 K* ^/ U) i8 R 其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现. G8 \( H/ @" Y5 k7 s: s; M
7 g9 V- v m$ r频域宽带波束形成* b3 |) _# | m: w7 @
频域宽带波束形成可以归类为DFT波束形成器,结构如下图 5 n0 Y1 H$ c6 ?
![]()
. O+ j3 K( i+ S/ A7 ?7 l
. l# P) J; T# C B频域处理也可以看做是子带处理(subband),DFT和IDFT的系数分别对应子带处理中的分析综合滤波器组,关于这一种解释,可参考《传感器阵列波束优化设计与应用》第六章。 频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT
9 @6 Y$ ~! q- r! j' [& {代码实现如下 4 J" l! L# a5 e9 \3 v6 i
nction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle)1 W, l4 p$ r4 e' ]( Q1 y8 C
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5 g$ S1 |# U1 h- s, w2 j%frequency-domain delay-sum beamformer using circular array. I6 e- c( d; [3 n. P; q9 Z
%
# R7 s" v3 z$ I5 U% input :
4 ~! ^- D3 E2 @! Y0 x q6 @1 T6 g% x : input signal ,samples * channel: Q& b8 G3 }3 o* w- @
% fs: sample rate4 X0 V C4 W1 q9 F: P: ]5 B
% N : fft length,frequency bin number
! P% K0 {. K6 A9 r# |# Y- r%frameLength : frame length,usually same as N
8 e V' D9 q: e0 s* |4 @/ p# M# A% inc : step increment
* k! r% [/ }5 h8 L+ C% r : array element radius
+ B) X3 [. ~5 v$ p c! l4 ^% angle : incident angle
$ n p! a. P* f7 i' R" j& b%
: z( u3 x+ z' E3 G% output :& O: c3 K& {+ a2 N' _3 L& O
% DS : delay-sum output
# }/ L8 x& f7 L& w$ H9 N6 H% x1 : presteered signal,same size as x
# `: i6 v* T: ]; v%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- g5 e3 m7 M, v9 d* J0 i& Q$ x
6 m7 y" R; x9 ?0 w( xc = 340;
. d! O5 X* C2 D M# u3 tNele = size(x,2);( c ?0 T! n# w- X
omega = zeros(frameLength,1);
+ @0 ~3 n9 h* B: f) KH = ones(N/2+1,Nele);0 x+ |2 ~+ M7 t% W2 Y
, ~; L+ j `; _! m3 Q' Mtheta = 90*pi/180; %固定一个俯仰角
" h. B8 h$ a1 S/ [7 y7 c% g6 P% ngamma = [30 90 150 210 270 330]*pi/180;%麦克风位置
5 _* A! y: G7 y# Ytao = r*sin(theta)*cos(angle(1)-gamma)/c; %方位角 0 < angle <360
" |/ e. g( H( tyds = zeros(length(x(:,1)),1);
# i2 f4 Z1 U, l$ _' O2 Xx1 = zeros(size(x));
_, e; C5 M- ?4 |" x# |5 ^# W& P& m! f( Z F3 e
% frequency bin weights1 q7 E% |: @* s. X4 w/ n$ L, g
% for k = 2:1:N/2+1) N5 e7 g/ j9 E; |5 u
for k = 1:1:5000*N/fs5 n8 k7 q. l4 j
omega(k) = 2*pi*(k-1)*fs/N; ' n8 ?& A. D2 g& d% E; r
% steering vector0 Z0 Q8 G6 o' l. ]. a* S) O
H(k, = exp(-1j*omega(k)*tao);
% i5 Y8 j, @7 t9 s6 j6 O. Xend0 y/ g" Y* ]9 Z/ h) _
9 Q) `/ {" O4 T5 H
for i = 1:inc:length(x(:,1))-frameLength* g# d2 ~1 K& x5 Z& I
6 _# V. W4 |" S9 B9 F+ J2 w/ T$ |% d7 G d = fft(bsxfun(@times, x(i:i+frameLength-1, ,hamming(frameLength)));3 D _) E5 [- a7 L1 S
2 m1 H6 R* J1 Q) o x_fft=bsxfun(@times, d(1:N/2+1, ,H);2 x5 G1 g+ R/ n
8 ?& M5 i3 J2 \! H u0 _
% phase transformed5 f0 e- g6 Q6 C
%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));; q$ i% c. A( ^( v
yf = sum(x_fft,2);
4 k. b; M: _, Q Cf = [yf;conj(flipud(yf(2:N/2)))];' V& X' a. s6 a8 f: Y3 g; G. m# v
5 |; { M, a9 O- x7 y % 恢复延时累加的信号
* C- s# [' `) g( @% F0 Q yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));
2 M, c9 Y( Q- Y0 Z p8 j, }5 D5 a$ ] ]* X6 B; m3 G
% 恢复各路对齐后的信号9 c( q; J. X8 E' R
xf = [x_fft;conj(flipud(x_fft(2:N/2, ))];8 n. m- E9 M. P Z" W; Q
x1(i:i+frameLength-1, = x1(i:i+frameLength-1, +(ifft(xf));8 L) }+ x! B4 d, h% [
end6 X5 D1 @ q C
DS = yds/Nele; / V& p+ ]4 f( F" @% V; w. t3 ~, y4 ~
/ F. a6 Y9 \9 _$ H. v- }end! @6 s$ J8 L ]! j5 E% O+ j
然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下
/ f) `7 S6 {0 x/ f4 O3 y- u" }: j* C/ ]) e& T4 V
%% SRP Estimate of Direction of Arrival at Microphone Array
8 U* Z( j. _, a- e9 l2 f% Frequency-domain delay-and-sum test( c, l# b, Q' ~! w1 {6 x
%
3 }# G& z- f Z; k) S%%
& N: c# A: P, Q( g1 [1 c! b. \+ R9 q6 u% Q: |/ ~% q, V. i, @
% x = filter(Num,1,x0);
2 O" c: O6 I! I1 c3 n6 A/ ac = 340.0;9 |3 Y. f0 T+ i! M3 j
, h3 a3 T5 |* b, \5 X8 V1 X' P% XMOS circular microphone array radius
" V* p7 }2 l. ]% r# j9 J9 Gd = 0.0420;. L: P8 T |) x, X W* p
% more test audio file in ../../TestAudio/ folder. ]# p5 W- k( [# T7 l7 k
path = '../../TestAudio/XMOS/room_mic5-2/';
0 v! u! T! C$ R) V \% T! _[s1,fs] = audioread([path,'音轨-2.wav']);
, b! {+ u1 F7 |5 U6 x1 Z* [7 ds2 = audioread([path,'音轨-3.wav']);
* }1 @* V) g$ c n$ Xs3 = audioread([path,'音轨-4.wav']);% G; w# ]* U+ G& e) c) l
s4 = audioread([path,'音轨-5.wav']);1 t) ]+ u5 g/ p2 Z3 |# G5 m: ]3 R7 k+ q
s5 = audioread([path,'音轨-6.wav']);
1 f1 V/ K8 u* X" u" {s6 = audioread([path,'音轨-7.wav']);, w+ p8 Y0 X9 M; \
signal = [s1,s2,s3,s4,s5,s6];
7 Y# z6 X" b+ Y3 mM = size(signal,2);
1 [2 ?5 s0 K1 O0 V%%! x0 x5 _! m `; [. v0 N; u5 H* C
t = 0;8 M3 p4 M* J7 D3 f+ v0 {+ M
' T) r* Z z3 I
% minimal searching grid! r8 @. y) R6 B1 V' b, O4 @, y3 j
step = 1;+ i( [0 r4 O8 [$ w# u3 i
2 @+ f8 S, H; Z3 {7 mP = zeros(1,length(0:step:360-step));% H( e* n; _' Q0 y
tic W2 |# I( C" Y f2 H( W I! n1 c
h = waitbar(0,'Please wait...');
& l4 G) X5 m5 Yfor i = 0:step:360-step( j& C# S8 W5 Y: L& n- e- C) l
% Delay-and-sum beamforming/ F8 j p; @1 n
[ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);- {1 B, w6 ?" k" s9 b
t = t+1;/ g. H& i% ~4 L* Y; `4 W! O
%beamformed output energy+ w2 m% b+ z7 |2 m" W
P(t) = DS'*DS;
; j j0 z9 \5 G9 d/ T1 d [ waitbar(i / length(step:360-step))5 i% A2 H. v/ K2 `% w. W
end# t0 Y4 D4 [! ^1 X% a
toc
1 K; s b& d! @2 J$ xclose(h) 3 z; Z1 ?$ R, | S/ @0 \
[m,index] = max(P);1 M0 j, ^* J* E/ i) s
figure,plot(0:step:360-step,P/max(P))
. E& A3 O* j% R- k; ?4 Oang = (index)*step& T) u- V5 r; O, U* n
( Y# k! ?, \& o7 r3 l' P0 S% M
程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下
0 s- Z6 w3 E" |8 _6 \3 z8 v, X![]()
6 J9 W( F/ C% j: p% C( A j结果与预期相同 PHAT加权 与GCC-PHAT方法相同,这里也可以对幅度做归一化,只保留相位信息,使得到的峰值更明显,提高在噪声及混响环境下的性能
7 u! s- a6 T. [ 上面代码中加上这一句
. k1 V% t0 f! y) b- a5 G, Y7 ]5 {%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));& [" A% ^2 e- l( C4 k
测试同样的文件,结果如下
8 `4 b- |. a0 Y/ P O! o( k- l4 J5 \" e5 d/ z! j
对比可以看到,PHAT加权的方法性能更好% L. z3 F9 B) f; d G
参考
2 j. L5 e! Y! v1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》 ' s5 t5 d! ~! \# M' C
2. 《传感器阵列波束优化设计与应用》5 y6 j8 G6 e }' Q0 k
————————————————
K8 R6 B. j3 ?) }* `- ]" P& v版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。. ^2 W) U) x6 R# Q9 U. V
原文链接:https://blog.csdn.net/u010592995/article/details/81586504
+ h2 m: N6 ]% A& _& K: Z7 S8 ?+ {/ m4 c
) U1 C) D9 D( i/ \" a' z. `% E( e0 r
/ t; J* o6 g; \% w9 C* [; t; [( z1 M6 Y6 U$ B3 L* e
' j7 J J. Y/ e" ?. B4 b |