DOA
5 I Y- q& e% o8 r0 t* ?+ T. O9 @ 声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),
6 D! W9 a- `* ~/ Y3 J: Q
) l: |% u E7 q/ O' \8 usteered-response power! Z1 _' a# i W) c e* O3 N
可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。
0 j; q3 V' Q f6 U Z 上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。 7 K: d) y7 j. r3 K6 s3 b* \: X
其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现
: i' b: G- |; m) j' W p* B5 w0 ]# L" l$ x% C' n4 d0 I+ z
频域宽带波束形成$ K$ |* n6 o9 A6 w
频域宽带波束形成可以归类为DFT波束形成器,结构如下图 8 c0 P, w8 Q# x: T$ ?, Y- @
$ T6 B" a! V- [8 E" e! _
' ~: \( z% P |频域处理也可以看做是子带处理(subband),DFT和IDFT的系数分别对应子带处理中的分析综合滤波器组,关于这一种解释,可参考《传感器阵列波束优化设计与应用》第六章。 频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT
) e2 Y% s5 m5 \8 R4 g n代码实现如下
p* R; [4 o' n% e8 Nnction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle)8 g- G- a6 Y' U
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%; K; [ `* \/ z
%frequency-domain delay-sum beamformer using circular array
+ R3 p3 X) { O%
$ M, A( I, g9 }2 Q) N% input :, p- I V' Y) [4 q$ S
% x : input signal ,samples * channel
' v6 B& [5 F [, W* W% fs: sample rate
9 s) m6 {$ c# [% N : fft length,frequency bin number6 Q8 L9 q5 \* f9 [
%frameLength : frame length,usually same as N
9 r8 H2 R2 u, A" M) _% inc : step increment0 s& ~) ~4 P# E5 q0 n: J$ v
% r : array element radius" F+ _4 d4 H4 }3 n0 _
% angle : incident angle# |" p" }; u, c2 ]* S
%
1 S% r+ _: l$ N% output :4 p' |7 I: G; M0 {
% DS : delay-sum output
, _6 o$ y3 ~4 j: E4 p' @% x1 : presteered signal,same size as x. o0 P! }$ b' m7 R C+ A1 W
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ u* y0 m4 K6 l( h7 t C4 I. H6 b, _6 y/ R! h5 C
c = 340;! e1 M. W0 @6 q/ o! ]0 x0 d8 M+ H2 l
Nele = size(x,2);
$ N, U- B" ?, [6 D$ gomega = zeros(frameLength,1);
, `6 t6 ~8 u' k }6 ?0 ?% B, vH = ones(N/2+1,Nele);9 W& ^9 z" M% ?# I4 x( d
K: c- g) q, Btheta = 90*pi/180; %固定一个俯仰角) B6 t3 ?: ^$ a7 N8 }
gamma = [30 90 150 210 270 330]*pi/180;%麦克风位置 {. o2 M. V$ C6 t' p
tao = r*sin(theta)*cos(angle(1)-gamma)/c; %方位角 0 < angle <360
3 ^1 O. I- v/ Q0 m- }6 qyds = zeros(length(x(:,1)),1);
% `1 J; D! E& [2 R4 T8 V, Kx1 = zeros(size(x));! q6 q! S; U- }0 M+ _, }' n- b/ Q
: z: |& J% e" Q8 `% frequency bin weights
" G5 G! [+ w r, }% for k = 2:1:N/2+1
. x/ c8 Z# c% ffor k = 1:1:5000*N/fs& P) l. P; m' w, L! \% P
omega(k) = 2*pi*(k-1)*fs/N; ! V) R+ ?6 X1 W9 x- [
% steering vector$ k S I% s. w! G( W
H(k, = exp(-1j*omega(k)*tao);
5 j/ ]4 N9 v# |6 Z; fend
; ^: [% {3 T0 e0 h% B# |2 n& V. O& X ?9 t+ d
for i = 1:inc:length(x(:,1))-frameLength3 S9 t5 c* s) B! \7 L8 s8 h. f
" U k, e z( L d = fft(bsxfun(@times, x(i:i+frameLength-1, ,hamming(frameLength)));
) V7 l. G3 L4 {* a+ V1 K
& j7 O2 ?6 ~; a0 V% H x_fft=bsxfun(@times, d(1:N/2+1, ,H);
2 S* N8 u0 D+ S8 \
* C; Y& L$ w8 H' h2 z % phase transformed# w5 f3 h0 p8 X6 h6 z
%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));
- d; F9 O6 Y C+ O% B3 Z; V8 k yf = sum(x_fft,2);
9 X5 N; s7 S) p9 I9 F Cf = [yf;conj(flipud(yf(2:N/2)))];
9 ^" K, R P4 _6 {: z/ k
3 V: a+ ?0 o6 x; K4 }9 o % 恢复延时累加的信号4 b5 [, r3 D+ R' j' a1 W
yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));
, B5 |" D8 t1 m
) j" v2 Y, }+ j4 Z g8 ` % 恢复各路对齐后的信号
. Z. a: @( h+ Q2 o& d$ c xf = [x_fft;conj(flipud(x_fft(2:N/2, ))];" O/ M6 p. u3 B, X8 P
x1(i:i+frameLength-1, = x1(i:i+frameLength-1, +(ifft(xf));
* b& n" S& ]% \3 Z4 C( B6 _end
! x& w6 O8 F5 g, a) V% r5 \DS = yds/Nele; ' U* ^- F2 {! r8 U D
3 [2 V" \) C- S& g
end; N* r" d) V5 g; T
然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下& l9 X4 u" p7 G/ {
2 C( |- J" R/ N X' t
%% SRP Estimate of Direction of Arrival at Microphone Array
; l" |. D" M: p* k% Frequency-domain delay-and-sum test
) }3 S e4 R' @, r%
; S- j) Y. |, w8 V& r1 Q( ~: b%%9 {" U9 G% E7 X! m; z& u; c
6 d1 K- _% ^" K0 r- Y/ }
% x = filter(Num,1,x0);
4 n) ?/ ]* G8 Ec = 340.0;
) u' g' H5 F. `7 c6 _; W* f
6 P4 S6 X* S3 C+ Z0 h% XMOS circular microphone array radius
7 G& E# W: O% a, Fd = 0.0420;
" C8 ~# {) g5 J9 O% more test audio file in ../../TestAudio/ folder( e9 Q J( e$ A7 |- v4 t [
path = '../../TestAudio/XMOS/room_mic5-2/';
6 A5 m2 d$ ?- s[s1,fs] = audioread([path,'音轨-2.wav']);
p4 L0 ^3 K( Qs2 = audioread([path,'音轨-3.wav']);4 c7 o$ f2 A/ |( X: ^' _2 Z
s3 = audioread([path,'音轨-4.wav']);$ |3 Z" C. Z. U! @
s4 = audioread([path,'音轨-5.wav']);
7 C! I* \2 c" d* q& Zs5 = audioread([path,'音轨-6.wav']);) |$ e# _2 O" j0 h* t& S" i
s6 = audioread([path,'音轨-7.wav']);. y$ f1 z; u- [& l0 X- K$ y$ J% ^
signal = [s1,s2,s3,s4,s5,s6];
0 o8 R9 @- y5 ?; t1 YM = size(signal,2);
* J; g: y/ f# ?; D9 v" {* c%%
% A% t3 x8 x( p1 {" T. ^t = 0;
' D( c+ ~4 h0 s8 z! g$ F8 U) }% K E# l9 K x) \+ K
% minimal searching grid& r6 {% g' B( J/ w. G) ^: E
step = 1;
+ Q( l5 ?1 l# U' j6 I
a. ^- z8 P$ K" cP = zeros(1,length(0:step:360-step));
" U" q& ~0 x; b! y" l rtic7 k! Z$ f0 e& q
h = waitbar(0,'Please wait...');
) ` U3 V; w' ~2 ^* p5 F& Tfor i = 0:step:360-step' p' o/ e) O& H- B7 X
% Delay-and-sum beamforming) n: x2 D- i3 T; i: v1 |) G
[ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);9 k( ~/ T# R4 _% D7 X% `
t = t+1;
6 s0 u- P! {1 y0 M %beamformed output energy
) w/ M6 P* X9 p% P7 S P(t) = DS'*DS;
, ^, v. s8 q1 s waitbar(i / length(step:360-step)); G Q, H% n: b! \$ \* F% {- b
end. J) \7 m. L ]# ~
toc2 ~/ U1 N8 d" C) g V6 V
close(h)
9 S+ Z' _, C( A6 D W. P z[m,index] = max(P);
3 {) r1 ?/ W/ zfigure,plot(0:step:360-step,P/max(P))' I4 `: o: b3 z6 O5 F
ang = (index)*step
1 O$ `' V) {$ \
4 m1 q) }3 K7 G1 R9 _程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下% ?2 j3 p$ _: I2 H
![]()
8 F& K7 z' A& i7 i结果与预期相同 PHAT加权 与GCC-PHAT方法相同,这里也可以对幅度做归一化,只保留相位信息,使得到的峰值更明显,提高在噪声及混响环境下的性能
+ j1 ?% B, |5 o$ h4 j 上面代码中加上这一句
9 _) g! F, ~# @1 H C; M% W4 R%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));
$ r; m1 ?; D; v测试同样的文件,结果如下 p) R) t8 \( V& i7 a7 h
![]()
0 W. j6 l+ b* y5 b: {0 G9 d对比可以看到,PHAT加权的方法性能更好
" u$ _8 b8 q5 R* x$ Z, s. H参考
9 O* S) `, @; U1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》 , F9 z5 v* V" s7 U- Q' i) d
2. 《传感器阵列波束优化设计与应用》
+ n4 Q$ x* D+ ?6 W7 t0 X————————————————' T# `: r! P% t) {* a
版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。- M# @) ^4 H+ \ `3 ?# M# O: r
原文链接:https://blog.csdn.net/u010592995/article/details/815865040 N& q; c' T# V7 g: Y# b3 E
! w3 x: A, O2 ]" Q! H
' q, D1 b$ G' ?
# @7 L9 Y( u0 Q9 t2 L
# v. b6 T* L+ h- H* O
' P1 W2 \3 X4 P6 ^/ E |