DOA8 J' m: v7 z8 B, O4 K
声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),
$ R* h6 L0 x7 m1 \+ V; a) i0 a( i3 b1 ~3 A
steered-response power( ]) t2 P, F D {, H9 p2 s! c
可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。 a K8 y% H6 E, Q% |- Z. Z4 r
上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。
* R& ?4 F+ Y# U3 N: D+ F; J 其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现
5 s) j7 \. Y2 r$ c5 E/ v. E& B3 O% N8 o
频域宽带波束形成
3 A& J a( g& P/ t& }, U) N9 Q% N 频域宽带波束形成可以归类为DFT波束形成器,结构如下图
" w# h2 S0 }( A r/ t 6 e# q# s! J& o H6 ?# Q' k
0 O: |! E: K l; P; c* T1 i频域处理也可以看做是子带处理(subband),DFT和IDFT的系数分别对应子带处理中的分析综合滤波器组,关于这一种解释,可参考《传感器阵列波束优化设计与应用》第六章。 频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT 4 N0 X% e: p+ ^
代码实现如下 # b5 B8 B" a/ I2 S
nction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle)3 I& f+ t. Q$ b
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
* ?3 `6 {# A) i%frequency-domain delay-sum beamformer using circular array
# Y- U! h* L. q+ ?% ) ^* W. x" _( a5 J, h3 Y
% input :/ {2 ~, ?1 n8 P2 I! J( b6 F
% x : input signal ,samples * channel3 @5 E3 P6 g$ Z/ P
% fs: sample rate
9 [9 K: O3 J' `% N : fft length,frequency bin number
/ }" Z2 p& j/ R+ b%frameLength : frame length,usually same as N
: F* t) h% f8 x7 Y1 Z" Q# W( t g% inc : step increment
1 X% k1 ]- I+ y$ ]* r$ B% r : array element radius/ A1 R+ v( }8 S" k
% angle : incident angle2 q* F: O' e2 c1 J
%8 ~& v8 m, h- F5 J( P5 }
% output :! {4 n' k4 o* f8 o) R; U: E; P1 Y
% DS : delay-sum output
( J S% E7 o1 y7 J0 j% x1 : presteered signal,same size as x
! m4 `1 l9 N9 a: h, h5 D% V%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%( w: B( N1 c9 {
( A! ]- M/ S0 ?, f. P: U
c = 340;
6 x5 G) H8 b9 B5 |$ v- c# oNele = size(x,2);3 ^% c4 J6 |8 Z: K/ X& z! v: l& ^- ]: l
omega = zeros(frameLength,1);
4 g! |4 P9 [% @, o5 JH = ones(N/2+1,Nele);
/ t5 B6 j5 J& ?: Q* @! e: V: p7 g
' K# }& S! i* jtheta = 90*pi/180; %固定一个俯仰角
. @# K$ Z. F. q9 Q& Tgamma = [30 90 150 210 270 330]*pi/180;%麦克风位置! {1 o: c0 Z) H& \
tao = r*sin(theta)*cos(angle(1)-gamma)/c; %方位角 0 < angle <360
( v) W" ?$ |# T! l4 Oyds = zeros(length(x(:,1)),1);. e; U: ~- L7 ^7 V& ?* m( |7 R
x1 = zeros(size(x));
! c" o* P8 v! L: _; e1 s$ K3 i; m. e; o+ Y
% frequency bin weights
% a) u5 J; ~8 L# [2 U% for k = 2:1:N/2+1
$ X$ h: }1 o0 ^% p( ?3 zfor k = 1:1:5000*N/fs, P. p/ |* n9 D! X9 Q
omega(k) = 2*pi*(k-1)*fs/N;
5 Q* s/ H( m1 T# D# Y % steering vector' t6 o" @4 C' g& l* k
H(k, = exp(-1j*omega(k)*tao);
8 a2 y5 ^5 |7 eend
- ?5 c7 i6 b6 W
5 a+ g7 s& T: S% w* ?$ O* Yfor i = 1:inc:length(x(:,1))-frameLength
1 _6 c0 o1 W7 ]7 O! ^" o2 t7 H: J- ~5 [ b
d = fft(bsxfun(@times, x(i:i+frameLength-1, ,hamming(frameLength)));
E0 i! p' R/ v1 @; c$ j! c
1 b: Q7 G$ @2 Y, q x_fft=bsxfun(@times, d(1:N/2+1, ,H);
6 x1 T" v. b7 T8 ~. k& }1 s6 `
: l( W' Z. z2 O" ~! [ % phase transformed
3 A5 t5 T6 q2 J# b& T %x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));/ W" h. X5 h6 ^: Y3 @; x' o
yf = sum(x_fft,2);+ a2 k( A2 d0 D
Cf = [yf;conj(flipud(yf(2:N/2)))];
0 G2 e) ]+ `3 Z7 U/ ^2 y: f5 D! k
# I7 b$ L$ V: l. V8 I % 恢复延时累加的信号" c5 {1 J, \- ]
yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));
/ l- \$ N0 w/ I3 i" V9 q+ ?4 C
) R% c; U$ Q' K6 R! { % 恢复各路对齐后的信号
& B4 u$ S' e/ k( ] xf = [x_fft;conj(flipud(x_fft(2:N/2, ))];0 Y3 J) _) Z5 W9 S
x1(i:i+frameLength-1, = x1(i:i+frameLength-1, +(ifft(xf));
2 Q% N. \4 z5 x% |$ A" R7 aend" R! B; c8 u2 j; `) y
DS = yds/Nele;
7 ^6 a& ]; Y( ~' n3 G- l' X' d7 ~* z! v2 t* t$ o
end
/ B' L( W" J3 O" f- K6 | c然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下
6 }# U8 |$ F' Z" a( K% t- w) E9 U
( U% y" a: d5 K* l%% SRP Estimate of Direction of Arrival at Microphone Array% z" h: A j# i. _2 F
% Frequency-domain delay-and-sum test) l: ]' |& N% W- t4 e/ o* r
% - _4 u! _: N( u
%%
" X) d2 q# v }: [8 f% |. X9 W- q4 A! b
% x = filter(Num,1,x0);
5 u1 w2 S" b5 J }$ [) C4 j) _' ?c = 340.0;+ ?4 l+ e7 [. e/ G- X! w
, U, s/ F. B. y5 n
% XMOS circular microphone array radius
; N- v* h, O- V$ B2 n: W8 rd = 0.0420;
& W4 ]. Y& u. A1 X! o% W% more test audio file in ../../TestAudio/ folder
F5 K3 q# ^, y$ y/ A/ d. c0 `path = '../../TestAudio/XMOS/room_mic5-2/';/ G, H' e2 _6 D1 U4 b4 P1 S
[s1,fs] = audioread([path,'音轨-2.wav']);
1 A# r5 `) b) B& w: rs2 = audioread([path,'音轨-3.wav']);
# ?4 q$ O, a, a# `s3 = audioread([path,'音轨-4.wav']);
+ k9 W+ L* M" O' ~0 _3 d6 f `s4 = audioread([path,'音轨-5.wav']);
$ Q+ P5 Z4 Q9 S: h9 e- j, Os5 = audioread([path,'音轨-6.wav']);
' I5 d/ q- ~( v. a0 W% Ws6 = audioread([path,'音轨-7.wav']);0 \0 p, s, D/ K/ F
signal = [s1,s2,s3,s4,s5,s6];. O& W* @: @! z/ @7 y3 I" T/ s
M = size(signal,2);
1 c% O6 E3 b5 w/ g. r%%
; ]1 _" {2 c' y7 s- ?4 [t = 0;+ L+ R% N8 n g( L, P3 ^5 }7 W
- B* P" `( T. F( v8 N! u
% minimal searching grid
* z( Q( S( s9 E( Y6 bstep = 1;
1 {7 ~+ _6 a$ @9 D! I q% p- N/ {( P1 ]* j. `. E+ ]
P = zeros(1,length(0:step:360-step));
( M' X5 F; h0 ]6 {/ |$ X' g dtic
/ P" r4 Q1 Y, i. {6 s/ @& ch = waitbar(0,'Please wait...');
: @3 Q; L6 r. Y: L" W% m1 O7 ]for i = 0:step:360-step; S1 b' M2 W; B& g1 p& \
% Delay-and-sum beamforming
7 E1 \9 u* ?" ]7 ^( | [ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);
. k' R( f: o. t' N7 W3 @/ i9 H t = t+1;
+ y" a0 @" `9 z %beamformed output energy& B9 B. V/ f0 H, P+ C) K8 |# h
P(t) = DS'*DS;
/ c* i# G- N2 Z waitbar(i / length(step:360-step))
- U- J; e" g! X/ X z9 w! oend0 p0 }0 X! h% i5 W5 W2 Z
toc5 T( L1 c! `0 P
close(h) 1 ^5 B/ ]1 s9 y) J. Y2 \1 G0 [8 y
[m,index] = max(P);
- x7 f/ u- r5 a6 I8 t9 ^+ Qfigure,plot(0:step:360-step,P/max(P))+ D# P, D* N5 u9 L; g
ang = (index)*step
8 B1 C8 U7 e- M h% ^3 R- a" u; b! c3 s$ e# }
程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下* B1 S3 M/ X, `9 _; K5 R& Q: y: u
1 [: s+ R0 q1 X: {* |& Y; V# f7 F. T, D
结果与预期相同 PHAT加权 与GCC-PHAT方法相同,这里也可以对幅度做归一化,只保留相位信息,使得到的峰值更明显,提高在噪声及混响环境下的性能 6 A2 s0 k0 A/ m; K% s) A1 V% P) X
上面代码中加上这一句 5 {2 n2 ?- E. r* l
%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));/ ]6 e- u) b$ z# ^0 a+ t
测试同样的文件,结果如下
2 l* q% B$ v: O3 y w# Z 5 \: _4 L8 O$ ?- O
对比可以看到,PHAT加权的方法性能更好
8 t% l6 U. h; h- D参考& ?6 f+ W) o6 p5 c
1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》
$ a0 b [9 v& ?2. 《传感器阵列波束优化设计与应用》5 _0 c4 k# V/ l# R' y2 `' m
————————————————
1 ^( B. S6 l6 Y9 o" q( ^ z8 J" i9 [版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
0 N) N) b& M! P# Q( |原文链接:https://blog.csdn.net/u010592995/article/details/81586504* F# h9 M) ?7 ?# G+ \
+ ?4 q7 A, f3 w* f- c' n
/ m) S- v, l6 V: S- L5 R
/ k7 Z4 e0 Z) x. o/ M8 M5 b0 O E) E" ~0 w" c7 j/ A
& r8 E3 V( d/ K+ ^/ x
|