DOA0 k0 o% Z/ H a% X9 r; I# N/ L' r
声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),
5 c6 P' C, }: T. B
% P2 A" L, b9 ] C% U7 zsteered-response power2 z$ n' U% R# l2 ~0 `4 L0 z
可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。 # G8 v! E) I: x& X
上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。 . Q% o2 C) h+ [* G/ u+ a( _
其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现
" M, w- z% g4 q X2 H# \, R: v: J1 K
频域宽带波束形成
. F$ r/ W& U7 ^# I e5 I" s, } 频域宽带波束形成可以归类为DFT波束形成器,结构如下图 9 h$ W, U" _8 Y2 ]" `, V
' s7 \ ~. u$ a) Z9 {: [; P$ |
# H4 _* |: ^/ x1 ~% X+ [# \# X
频域处理也可以看做是子带处理(subband),DFT和IDFT的系数分别对应子带处理中的分析综合滤波器组,关于这一种解释,可参考《传感器阵列波束优化设计与应用》第六章。 频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT " O4 m- c/ k9 z7 l6 J: q x% K
代码实现如下 3 W) `/ i* t+ ^! z
nction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle)# R+ d) h0 H( K3 c! h) N
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 p: H/ z) A; ~ L
%frequency-domain delay-sum beamformer using circular array
( \% e6 U, i+ a%
" F" P8 `/ f3 w( d2 A% input :
! `+ I- {, V. S# ^% ~( m% x : input signal ,samples * channel
) T0 P5 U5 Q. _& l7 Y! I% fs: sample rate5 N6 s. x) {: B7 T7 _9 J4 W# J
% N : fft length,frequency bin number& B5 Y+ E$ [1 J& U) w
%frameLength : frame length,usually same as N
: l. V8 {8 T8 q& E: G9 i% inc : step increment* g4 R/ M- l0 L$ k
% r : array element radius Y" ~1 Y8 F8 l& H/ M' ]) P" K
% angle : incident angle
& V3 P) V4 e& @' E%
; q5 X: U; w6 j+ e8 s; e% output :2 b" B; Q/ S+ [
% DS : delay-sum output3 P# u5 N+ t! b0 [7 k
% x1 : presteered signal,same size as x
7 {" t$ m( L! h6 g4 f5 T6 {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%! _3 l% `0 s+ X" @0 b$ w9 k8 p
7 C( d% v/ l/ k
c = 340;
4 K! U+ Y6 u, U' KNele = size(x,2);
* @# D2 o# t( q6 r: Tomega = zeros(frameLength,1);3 ~) e X: G( [/ u& L
H = ones(N/2+1,Nele);7 {; i2 ]5 I( k+ |
8 L/ |$ [+ n! a# a6 \* J5 E! Rtheta = 90*pi/180; %固定一个俯仰角6 z8 F4 G M6 L$ X H F
gamma = [30 90 150 210 270 330]*pi/180;%麦克风位置' u: `& P4 a8 ?0 J8 d& D' u
tao = r*sin(theta)*cos(angle(1)-gamma)/c; %方位角 0 < angle <3606 g3 i. z. v. q' h4 D6 r3 f+ w6 d
yds = zeros(length(x(:,1)),1);2 g$ A# O/ \8 g/ m8 H3 Z& g( T0 v
x1 = zeros(size(x));
5 B. |. c8 C+ V3 y I! d* K( w: [9 d8 t1 o. j2 Z' q
% frequency bin weights5 b' \- \9 x3 L% b5 c: U- M
% for k = 2:1:N/2+1% N. Q# @- d3 F1 [
for k = 1:1:5000*N/fs
a0 S2 e" B8 u' V3 _# e: v( }5 r omega(k) = 2*pi*(k-1)*fs/N; 1 h' s3 h1 K; `( Q4 V
% steering vector$ ^2 q" K- w; o3 P3 j! f
H(k, = exp(-1j*omega(k)*tao);
( \) }1 L( ^) H' {* {2 send
! \. a# }* ]8 a8 m$ o0 w# e! O9 M1 g& x4 t# r Y& {! m
for i = 1:inc:length(x(:,1))-frameLength3 ], A- \$ L1 U( `0 o
, p, o8 ]# [. R0 k; m# B d = fft(bsxfun(@times, x(i:i+frameLength-1, ,hamming(frameLength)));, F; e, ]7 _, B" B
$ U* z2 E1 `' L- K( d6 Q; H3 T x_fft=bsxfun(@times, d(1:N/2+1, ,H);
9 t |7 v/ e+ m; c. E7 ]& Z; v. v- f$ P* a
% phase transformed. g2 y; {% Q8 i% h# K `$ c
%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));& [8 h4 _* f/ p v; ^4 S7 y
yf = sum(x_fft,2);
+ ^2 C- ^1 {$ v3 b: y' \ Cf = [yf;conj(flipud(yf(2:N/2)))];2 K: a- M7 U0 E4 O- u( |
. t, y3 W( ]1 h9 k3 W' G % 恢复延时累加的信号# Q/ f# f) {, v* L
yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));% J X5 \& i1 y* n
+ N/ N+ f8 j, q9 M1 V% B
% 恢复各路对齐后的信号
; L Q( G( }: L5 i8 I* |# M xf = [x_fft;conj(flipud(x_fft(2:N/2, ))];7 h, B" m' s0 |
x1(i:i+frameLength-1, = x1(i:i+frameLength-1, +(ifft(xf));
1 D; ^- G ~: Pend
' \9 k! d- h( l+ P$ q& _DS = yds/Nele; 4 f/ C: l4 ?3 t3 i
& l; c) g4 _7 c$ ^end
6 Y; ?5 D( ^2 q; Z然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下; z2 S: J, Z2 i
1 l n* f$ p; ]9 J%% SRP Estimate of Direction of Arrival at Microphone Array
# I/ F# E q1 @7 [. r% Frequency-domain delay-and-sum test; u8 M0 t) e' ^- ~! D- E: ?
%
: X2 R3 z; D* Y6 e& K w%%$ U7 d2 H$ B7 \6 z' b
1 _! `+ V: l+ d% x = filter(Num,1,x0);
: }6 K" y4 {$ _* A' t# j' K% fc = 340.0;
# _$ c! G) C% E1 F( Y" }! m6 o3 _' {& P, u% c j
% XMOS circular microphone array radius& X9 _9 M. q* F! ^$ L
d = 0.0420;
$ d8 W9 b0 I9 D% }( e5 c6 w% more test audio file in ../../TestAudio/ folder1 n2 l: h V2 e
path = '../../TestAudio/XMOS/room_mic5-2/';. V: Y" w8 p1 e+ z m7 u1 O
[s1,fs] = audioread([path,'音轨-2.wav']);
. w! k, |; D" g% u% V9 y. m. vs2 = audioread([path,'音轨-3.wav']);& y* M" z1 x6 y2 V% n7 l
s3 = audioread([path,'音轨-4.wav']);" @: x7 N% q/ A9 [/ R
s4 = audioread([path,'音轨-5.wav']);
+ Z7 d: w }4 g6 as5 = audioread([path,'音轨-6.wav']);
G2 C$ I* ?( ~, \* g: X1 ns6 = audioread([path,'音轨-7.wav']);
& }) J4 u; B* v, `$ jsignal = [s1,s2,s3,s4,s5,s6];
) z- ]0 w/ B8 iM = size(signal,2);
! f; R7 K z1 W- M4 U3 D. n3 E%%
# P/ i( D% K" gt = 0;, w, E4 @+ h! t9 p8 a4 V# o
- w1 R$ d- _0 _; R! h1 Z% minimal searching grid8 d. X+ t+ Y: J
step = 1;
5 [4 U( T7 ~0 J p
" C" Z7 N, w% D' r$ OP = zeros(1,length(0:step:360-step));5 f, a! P1 Y" W6 L+ H$ Q( O4 F/ s
tic: l# h8 q% w. p% z
h = waitbar(0,'Please wait...');
6 I! m5 o) ^( l" ?for i = 0:step:360-step& f y6 ^- a/ ^: M. }
% Delay-and-sum beamforming8 t* T _% h2 j/ n! k
[ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);
* R+ q0 z/ r) n9 S$ ] t = t+1;, V$ Z% S) ~# c. C8 B2 j9 _
%beamformed output energy- V' {. S3 _/ n1 p
P(t) = DS'*DS;
) E' Q$ U6 f" L2 R6 Z) |+ T waitbar(i / length(step:360-step))
8 D; N- X2 r. xend
% a8 X; e1 S: [ K- n3 Otoc) d, l% z& v- v
close(h)
}% T" ?% E: s! q& o5 t, Z* [, M2 L[m,index] = max(P);
9 [' Z' a* N! A! Y' c1 B Y9 ~figure,plot(0:step:360-step,P/max(P))
$ @( }& p. h9 p+ g$ {" Lang = (index)*step1 f* L$ J- v& z
5 G; `9 ~6 U. }% J8 @! k$ h6 X1 I7 I程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下: d0 ^0 ~- i' U" E/ u. d
![]()
6 [7 ?) M7 U5 X5 |结果与预期相同 PHAT加权 与GCC-PHAT方法相同,这里也可以对幅度做归一化,只保留相位信息,使得到的峰值更明显,提高在噪声及混响环境下的性能
/ D& _: i/ V& P! @" Y 上面代码中加上这一句
' ~" s d1 R0 N( H6 s7 l4 `+ F%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));
& |9 x" D0 Z% g: l6 [测试同样的文件,结果如下
* o, Z8 U; I1 g- R& {# r+ J : h, _; Y; ^3 u* u3 n3 C0 R
对比可以看到,PHAT加权的方法性能更好, d; K0 P* m/ L2 }% w5 k
参考- L" `8 X& M O" ^8 _
1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》
2 o; ?% i3 L: ?: j, _2. 《传感器阵列波束优化设计与应用》) [2 I0 M I; D2 G, P0 |' i
————————————————
8 Y1 O/ Z' t3 X1 f/ M2 U版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
8 v/ D; F% ]6 I4 z原文链接:https://blog.csdn.net/u010592995/article/details/81586504
$ E+ m. g" V3 w; d' E7 y; D7 g, B9 `8 d' \, i
$ Y# Y2 K6 T0 m5 Z6 ?
1 s* v( ~$ L. w& {8 y( X
8 O( C C' V3 \7 t, a2 Q& m0 q* [0 ` F
|