DOA
/ E) ~9 |" z6 Q$ t 声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),3 I$ E1 X2 g% @8 I
+ U1 t: Y: n' f2 K" v1 ]steered-response power0 `& W7 `. W* p
可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。
! d/ z1 V# v$ u' R r' y4 ^: m6 g 上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。
# x2 r! Q; y1 q* \' {/ P 其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现4 A( i# s# n1 @3 Q, B- C
, |2 M& I! O" I6 b, m- W
频域宽带波束形成 @1 j! ?6 F0 X) R- w
频域宽带波束形成可以归类为DFT波束形成器,结构如下图
) Q: T1 E* {8 ^/ q$ o2 h! c& W![]()
# [" [# ^5 }* q9 p
$ a- E( J7 g" a, O2 |频域处理也可以看做是子带处理(subband),DFT和IDFT的系数分别对应子带处理中的分析综合滤波器组,关于这一种解释,可参考《传感器阵列波束优化设计与应用》第六章。 频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT
( h3 Y) d4 ]% s代码实现如下
0 w* {: h+ o- Q( xnction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle)5 R* M& f- z. Y' k" e
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1 H) F; P2 T' \. d d/ ]$ L%frequency-domain delay-sum beamformer using circular array9 v% r. }) o \. O; ]' X- Q
% # t* M5 U6 ]; b8 @* g* a) M2 _) p' x
% input :+ \0 C% t7 g+ E7 x% x' @
% x : input signal ,samples * channel
3 ^* D: [2 F% Q9 t) R( M% fs: sample rate) x# b1 e! b- e {1 W" n
% N : fft length,frequency bin number4 s% K5 P' E, x, n d( {) o) ^
%frameLength : frame length,usually same as N
) d% g$ B! [+ y. ?- o/ V8 B- Q% inc : step increment6 \- T$ C2 D8 j6 A1 B
% r : array element radius
% ^# Y$ X9 D: P0 @- s2 h3 Y% angle : incident angle5 |$ r0 Z E6 c+ a9 `
%# l1 ~% C8 U: j
% output :/ z5 y V* E S5 b7 @
% DS : delay-sum output" O' W; n5 p. L U. [6 q% T. C
% x1 : presteered signal,same size as x
/ Z/ K7 Y9 ]0 V5 {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9 o( }6 l& D# c& c# g* z$ d4 x0 X- B5 |) g
c = 340;
: }" ~/ x! T. s5 D7 gNele = size(x,2);
2 S+ U; [. f- }$ S: m/ `) `omega = zeros(frameLength,1);* e9 U9 u: ]- {! f, B6 j! N
H = ones(N/2+1,Nele);
" M: M# S& D$ x5 U4 r$ }6 J0 [* ^4 c2 Z
theta = 90*pi/180; %固定一个俯仰角' Z5 [4 N. }4 p
gamma = [30 90 150 210 270 330]*pi/180;%麦克风位置" R1 l5 v$ Y5 f
tao = r*sin(theta)*cos(angle(1)-gamma)/c; %方位角 0 < angle <360( d% }: x/ `" i4 r
yds = zeros(length(x(:,1)),1);
k# |4 W* `0 C, O7 E6 d* f' Y" B( Ex1 = zeros(size(x));7 V/ ^4 B6 C9 P3 [+ n& Y
* i1 S" ^+ B& l9 g% frequency bin weights9 X& N+ V' J7 x
% for k = 2:1:N/2+1
+ _1 ?: N7 V4 {% \& vfor k = 1:1:5000*N/fs o; h6 S+ `$ z& e
omega(k) = 2*pi*(k-1)*fs/N; 5 @( }& }: m: L; G# H3 q4 c
% steering vector
8 V0 s" S* k. v0 m1 P H(k, = exp(-1j*omega(k)*tao);5 a9 M) ]" K7 W
end
4 \. O) M0 y! D! z I" C
. a8 L( Y, T8 W% K1 t# e* \2 L9 qfor i = 1:inc:length(x(:,1))-frameLength+ R5 `6 q$ `7 |) Y6 W9 |9 q7 j5 `
2 |* h& B/ P8 d% j
d = fft(bsxfun(@times, x(i:i+frameLength-1, ,hamming(frameLength)));
2 ` @6 D: P* z* i* d
; f1 n7 S4 m+ y8 \- t x_fft=bsxfun(@times, d(1:N/2+1, ,H);
2 ~. @+ T# Y2 B! h4 z
4 D% {: }9 c) Q" X+ R2 Q" G % phase transformed; k$ w: N: ]; y' S2 S
%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));
& ~' n! K! F7 D yf = sum(x_fft,2);5 W2 Q9 `5 w% n' Z" L8 \
Cf = [yf;conj(flipud(yf(2:N/2)))];
& U, ]; C) z$ c6 K
( T. c5 o1 L- v, A6 Z0 p % 恢复延时累加的信号
& _0 C1 H- `% s* o5 | yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));" Y% y" k! Z* a% {, H) k
! |% G" P/ o# r5 Q
% 恢复各路对齐后的信号
. O" Z# Q# q* |0 O xf = [x_fft;conj(flipud(x_fft(2:N/2, ))];9 N, g0 m* w% y
x1(i:i+frameLength-1, = x1(i:i+frameLength-1, +(ifft(xf));6 n8 m3 J: \- D4 ?) x" Y6 h
end
/ d* S! S0 Y0 j, \" ?& o2 dDS = yds/Nele;
+ D$ H$ v$ d8 f! e2 ]
- k$ b! \6 i( P0 E9 i7 tend
# R" `5 ], s+ ?1 y然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下
0 t( i+ j6 o' m/ f6 o! S" b2 Y
. A9 B* N! G, x6 U+ w, i%% SRP Estimate of Direction of Arrival at Microphone Array; C% ^ Q% _2 I. P' }& |- Z8 E
% Frequency-domain delay-and-sum test& K8 O% k( m" M( n: b4 H
%
& Y' K& O8 T$ K, o% K%%; i8 L" M' s* }2 l" @9 a( W! F
% B {6 w; P% K( ]% u9 k6 O% x = filter(Num,1,x0);( k9 |; k+ L6 a2 w" l o
c = 340.0;
. d7 Z9 E% d; z4 L0 W1 ]6 T1 h8 [/ O# ^% j- Q! W' Z0 J
% XMOS circular microphone array radius
. Y. h) ^ c7 U% dd = 0.0420;
4 G* ?: |; @& f# _' R6 x7 d# i% more test audio file in ../../TestAudio/ folder
/ d8 A8 k5 Z! s7 { c K* U9 Cpath = '../../TestAudio/XMOS/room_mic5-2/';
; H3 e+ h2 h1 I! |! {! U[s1,fs] = audioread([path,'音轨-2.wav']);8 c: K) p, |6 c% G
s2 = audioread([path,'音轨-3.wav']);
0 r: Y. s4 }4 [s3 = audioread([path,'音轨-4.wav']);& S4 b% v; `1 O, a6 L
s4 = audioread([path,'音轨-5.wav']);9 G) P% x4 r# X/ Q( {8 w2 _' {# s
s5 = audioread([path,'音轨-6.wav']);6 f# Q! ?+ m) @% b! ~
s6 = audioread([path,'音轨-7.wav']);, w& o, h. G- o1 J
signal = [s1,s2,s3,s4,s5,s6];) q4 l) Q2 M9 a* G, ~) Q- p
M = size(signal,2);$ i" X% c. n/ B8 X
%%
6 U: l9 O$ |+ b; g6 ?, P% |t = 0;
# [: K6 {6 E/ w# J0 j% t3 p+ x( i' }4 c6 ~
% minimal searching grid) H6 _; O" q5 ~. l1 C9 i8 e! g3 `2 I
step = 1;5 m0 i/ g. L, z
/ p; h, L: G9 e
P = zeros(1,length(0:step:360-step));% y: b+ h# A. D5 Q7 H+ E5 W
tic8 I; H5 `3 N: o3 K: b
h = waitbar(0,'Please wait...');
$ t5 i- l7 \) Qfor i = 0:step:360-step
1 i+ W( q, p/ E) E5 e% Q; H % Delay-and-sum beamforming
7 I* R' q: a( g3 E [ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);
* W+ {/ }) A8 K. P& S t = t+1;$ `. u' [! {$ a- S. i7 s/ ~, J' u
%beamformed output energy
/ ?8 y$ G2 {6 O; K P(t) = DS'*DS;
) d! Z" G$ |5 s5 w _! t5 B) z waitbar(i / length(step:360-step))
/ z6 g$ y" a, V0 b; ~end* }! p3 q% M7 b8 I! I4 J4 r
toc
. d9 C6 C s6 _8 Tclose(h) " N- t1 d, r' c( x
[m,index] = max(P);
2 ?0 O: w% E; w% qfigure,plot(0:step:360-step,P/max(P))
7 t+ d% K7 n9 R4 u2 W/ P2 Oang = (index)*step" I4 [2 N& w1 r6 [% j/ B; l
6 a1 Y, s: j! i3 ]程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下/ K! Y. l* c* b0 U k0 l; a
![]()
4 T3 }! z* W h" W; I. {结果与预期相同 PHAT加权 与GCC-PHAT方法相同,这里也可以对幅度做归一化,只保留相位信息,使得到的峰值更明显,提高在噪声及混响环境下的性能 $ @) D* q1 Q5 L& G1 G2 X$ B: ^6 u5 A
上面代码中加上这一句
0 T! E+ `2 s4 r2 N2 T1 _%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));0 M4 L. N( Y% o: P% _' b) ]5 E6 Z
测试同样的文件,结果如下 ; f( r0 H( i$ T/ }. n/ U
4 g! s, K; ^+ E m7 W
对比可以看到,PHAT加权的方法性能更好
: U4 M- n) c( |2 v9 ?参考
: ]; r8 Q' e6 s# H' j- ^4 Q1 r1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》
5 A$ r4 h! v2 P/ \2 R7 c2. 《传感器阵列波束优化设计与应用》
: P9 y# `* Q7 h4 \6 n* K————————————————
, Z: h3 P/ x: V; s+ }; i版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
" b7 ?9 [+ b; T3 F) I5 T原文链接:https://blog.csdn.net/u010592995/article/details/815865041 F% h& x+ {6 m6 o7 X, D& i' \$ M) k
# K' \6 W. S4 s \( R3 a9 x
; i# C* i B" O+ @8 L# \
- b8 p( D* z9 m) b; }
6 `3 ^: l0 j9 t2 C8 V* d% q3 T, j+ d" Y- n; J/ V% u! |
|