DOA; D1 m; ?" i& Z _( ~0 F
声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),1 l5 K! C% G0 l& _/ x, n% Z9 V
! \- H5 }0 E6 L4 U1 m( n
steered-response power
" ?6 K9 V/ z; `* B P 可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。
& B# ]' S2 b8 k. R, z 上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。
) [* S) `! `$ }9 n" F2 P0 k 其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现
! y1 E# _# X8 p) }& _# {
. y3 v- G8 h0 d- ]频域宽带波束形成
% t+ d1 g! ?3 g/ C 频域宽带波束形成可以归类为DFT波束形成器,结构如下图
& e% h& k" H1 X- c. T& L9 d![]()
% G% y% X, s1 V: s/ d0 ~
' P+ R* ~: W8 U2 @; p9 h& U/ W频域处理也可以看做是子带处理(subband),DFT和IDFT的系数分别对应子带处理中的分析综合滤波器组,关于这一种解释,可参考《传感器阵列波束优化设计与应用》第六章。 频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT
& u4 ]. h1 f ^代码实现如下
2 }3 ^! C# a E F; _nction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle)
3 z- d$ ^' C, Z2 ~%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% p/ i& r5 Y' ~. \$ N9 y' j. g%frequency-domain delay-sum beamformer using circular array
3 \7 g7 d! ~# M/ k5 t" q" ?% ' J8 q3 r9 n; q- y6 j
% input :1 G$ S/ Z0 A/ p2 i
% x : input signal ,samples * channel
/ Z& F2 s$ }# N/ v; f1 u3 O% fs: sample rate# _" a' o9 _7 M8 g9 J
% N : fft length,frequency bin number9 @7 p- z8 h% V! F
%frameLength : frame length,usually same as N
5 B4 Z. K) L1 d- {; m* p3 U% inc : step increment
3 ]0 X! B7 G( W# ]9 ]% r : array element radius, g$ ^ S) t. Z1 v3 L8 u9 ~
% angle : incident angle
3 h5 E6 r# g0 n q%( D5 D1 A( I9 t K4 o
% output :) H$ ~3 @( ~2 G# l. p2 V* ~
% DS : delay-sum output
9 O# }/ C( j8 q3 `! L; Y5 h, l% x1 : presteered signal,same size as x
D: L) v2 @: @$ h# f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" g$ Q8 x$ j s0 u! ]
4 j' L( _) B$ J. b9 K. h3 Z1 N1 jc = 340;
- ]! ^* l- X2 P1 w! t8 b/ BNele = size(x,2);
8 W; r2 f/ t: r2 x+ H9 `omega = zeros(frameLength,1);" j5 Z1 [. |7 f8 x% O7 o
H = ones(N/2+1,Nele);
/ l& p6 C0 O, I0 D8 }3 b" C, S- z6 S. \1 C# S9 ~
theta = 90*pi/180; %固定一个俯仰角# [! h7 G1 ]# e2 n: g6 u p2 G4 a
gamma = [30 90 150 210 270 330]*pi/180;%麦克风位置- ^: ]$ |) X* Y& B, l& }" [/ D
tao = r*sin(theta)*cos(angle(1)-gamma)/c; %方位角 0 < angle <360
; b5 G K5 C/ K! O' y1 I. I2 s2 Dyds = zeros(length(x(:,1)),1);
. e5 \) w8 D9 W( nx1 = zeros(size(x));
; D. h& J; s( ]+ w
( Q/ f' m! a" I1 I# T) O: b' ]% frequency bin weights, P7 C8 G; g+ B. z0 W
% for k = 2:1:N/2+1 z4 i$ j5 t5 P* p/ C
for k = 1:1:5000*N/fs
) o& m8 D+ H* ]- k8 P omega(k) = 2*pi*(k-1)*fs/N;
& ?! G) i+ i7 f % steering vector
; N; ?# \5 h7 }7 a0 u9 ^0 d H(k, = exp(-1j*omega(k)*tao);
8 ^( n$ x! N* U. D2 r, [" vend
5 {7 G% B& [9 h5 @$ ^) L4 Y; f" E7 W8 `) u. L& q* s
for i = 1:inc:length(x(:,1))-frameLength
( R' S& t/ q* U& K$ [
5 w/ }* @7 O; a9 M* L/ s3 ? d = fft(bsxfun(@times, x(i:i+frameLength-1, ,hamming(frameLength)));
6 l( _) N5 w; Y3 b; T! l5 W4 ]$ A2 ?& u* ]+ M* g
x_fft=bsxfun(@times, d(1:N/2+1, ,H);
& H5 z0 M& Q" W& r% O" P4 M+ R6 j4 a3 z& r, q3 |! H
% phase transformed
4 n7 [5 w r8 O$ `) S0 i% [ K %x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));& o* @5 u+ p, o i5 h: {4 C8 @7 o
yf = sum(x_fft,2);
% W% t# O2 e c2 E; l/ B- y Cf = [yf;conj(flipud(yf(2:N/2)))];$ a' J* F0 r! ]0 G4 f- ?# U# N
' _* I, q X5 I. e' Z- h, n2 d
% 恢复延时累加的信号3 }% |- |0 [. ]! c% T
yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));7 z( q) F% t/ B4 _7 \. C" ]$ a
3 }& h' f4 Y7 z" w* u % 恢复各路对齐后的信号, E2 Q9 j7 l! {0 c' F
xf = [x_fft;conj(flipud(x_fft(2:N/2, ))];
6 z E% F& }6 v) t x1(i:i+frameLength-1, = x1(i:i+frameLength-1, +(ifft(xf));
( G1 S' `1 w/ w" j- o& xend) X8 n( \1 l0 E$ l9 {
DS = yds/Nele; / Z$ }4 I! X( P2 Q) U [& x/ L, H6 Z
+ c ^ p0 f7 N: send
& S: K5 R7 O5 K* Q' i' q9 R* b然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下
8 ~: }' r+ L' [+ M& g0 q T0 ^$ G3 u, U5 p% J! ^$ s8 G
%% SRP Estimate of Direction of Arrival at Microphone Array
; ?+ r! \# G' U5 V# x* v6 _5 Z% Frequency-domain delay-and-sum test" ^8 e, r- C+ W1 Q# G
%
; U& J2 k: |# g8 w. C1 c%%* p& B. W, M8 h/ d" Z& A- r$ d
X% O1 K! X5 \8 E- g
% x = filter(Num,1,x0);7 G# H+ [" R( B
c = 340.0;
% t0 ]0 x* H" f8 x3 Q/ x6 U. f' b T U4 h3 g: B
% XMOS circular microphone array radius4 A% ]! t7 _8 e4 {
d = 0.0420;/ W( G8 n) x5 B# o- i
% more test audio file in ../../TestAudio/ folder% h% c" {6 N! A5 ~
path = '../../TestAudio/XMOS/room_mic5-2/';; Q/ S& w) m: y5 [
[s1,fs] = audioread([path,'音轨-2.wav']);2 }5 f0 B D* j. c
s2 = audioread([path,'音轨-3.wav']);' g- x$ L1 [- Q) b5 r/ a
s3 = audioread([path,'音轨-4.wav']);
& @ N" `, C5 Us4 = audioread([path,'音轨-5.wav']);$ j1 m( K0 [% H; F
s5 = audioread([path,'音轨-6.wav']);
# z: x) W. A% n: A1 Ls6 = audioread([path,'音轨-7.wav']);* n* k9 a/ N% O6 w
signal = [s1,s2,s3,s4,s5,s6];
: F/ B5 G \9 M, L$ A, a5 Y) JM = size(signal,2);
! E+ R. n9 r8 {! F%%/ g! ^& J6 x0 Y, g; M# i
t = 0;
( M# ~* z5 b' d! {! o' R8 E( N# z* b5 f7 g
% minimal searching grid. p# g2 B1 x4 m$ V
step = 1;
2 p. X5 T# c* v# i: U" z& ~1 n
0 N# A; {1 L T2 T, C5 CP = zeros(1,length(0:step:360-step));9 }$ S9 y+ ~7 f) |/ L$ f) o0 ~
tic5 G4 R: x) d4 n/ m2 V: N
h = waitbar(0,'Please wait...');
0 d a+ t: q2 M6 g, ]9 D7 qfor i = 0:step:360-step5 W _7 f$ }' Z, X, [ i( m
% Delay-and-sum beamforming
1 N4 v/ v Z+ P! t j$ d1 Y% {4 i, C [ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);/ I% U3 }% W- k$ v" o% f- p* f" q( ~
t = t+1;* [9 ~. x* l$ U5 t
%beamformed output energy
\2 J+ y: E* @9 S P(t) = DS'*DS;
! K- i4 U' o; a7 Z waitbar(i / length(step:360-step))# m3 R7 P# ^1 g- I7 Q
end
$ t/ Y. h* \: H4 s$ t: E( e6 Otoc/ O' u T7 j C: Q1 v5 Y
close(h)
$ K/ j* y: \: Y* ?3 W& `3 I' y[m,index] = max(P);5 r1 o2 ~( d0 i# t& f& ^9 {
figure,plot(0:step:360-step,P/max(P))
3 H7 O$ s, \2 n7 bang = (index)*step+ X3 u6 O H6 q7 [
+ i Y- M7 {9 [! s' M( T
程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下$ G3 b/ I5 N6 T8 g9 C/ {
![]()
9 G) E P8 H- v6 Q+ v( W6 p' I" Q结果与预期相同 PHAT加权 与GCC-PHAT方法相同,这里也可以对幅度做归一化,只保留相位信息,使得到的峰值更明显,提高在噪声及混响环境下的性能 ' c t' k0 w7 l; m0 A& K
上面代码中加上这一句 2 C2 _) n- q% H
%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));
0 x/ _8 k- k3 ~0 _" R测试同样的文件,结果如下
/ o& H$ e3 {& B![]()
. j. w, z' i. ]7 N对比可以看到,PHAT加权的方法性能更好4 Y5 ]4 n% k$ F" H7 Z
参考
$ \3 E! M: ^( J$ J# r' g: r1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》 ; n' h) g* Y" U9 f. H# @4 w x8 ]8 l! K
2. 《传感器阵列波束优化设计与应用》" L( W3 C) P% J0 ~6 E1 x3 ?
————————————————4 H5 e, D+ d* z) D' |
版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。) {/ }3 S9 G c4 `5 p" j+ T& e
原文链接:https://blog.csdn.net/u010592995/article/details/81586504
& R, i& G7 n6 g# u: ^+ z' C6 q& A
' a$ c" `; J3 u# p" g
% C$ e5 S! A; T$ a' H: ] ~; A% n5 @' G. ]
4 }1 d) m- w6 T7 y3 ?
. s: u" d4 I: L4 Y2 e* `1 Y |