DOA
/ q' q) e9 g7 t6 `' F' @3 t1 I5 C 声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),
; f9 N) t4 Z' i
' }& a8 v1 v# \: W3 f! @8 [4 [steered-response power
+ @% k, P) x/ B# b4 t* \0 H+ H 可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。
$ e) q& F+ Z0 M 上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。 - ~% U, s5 b$ X# I
其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现 P- T; V: O8 Y& B4 w( P, @
( G; ]- W1 x" U/ G6 R' _% j
频域宽带波束形成
$ v! n8 @# a4 @, I9 L) P 频域宽带波束形成可以归类为DFT波束形成器,结构如下图 9 J, Q6 k: U% p5 |) |7 E
![]()
7 e: v u$ M5 @/ S' o: p' }7 Q* I/ y, |9 C8 A8 t
频域处理也可以看做是子带处理(subband),DFT和IDFT的系数分别对应子带处理中的分析综合滤波器组,关于这一种解释,可参考《传感器阵列波束优化设计与应用》第六章。 频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT
$ S( L* v) h' o( I+ X* T代码实现如下
: I! ], q6 `8 h/ ]nction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle)
( M1 P( u {, e! [) n; M$ |%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
) k! O+ `8 p& V( q% a% M%frequency-domain delay-sum beamformer using circular array
# I* m) ~$ f# v8 d%
) Y5 o! F' H, A6 U* [" ^7 y6 z% input :
/ J5 }! c; _- S& q% x : input signal ,samples * channel
, b+ X# V$ z% m; _1 T. D+ b% fs: sample rate
" h, _* S4 X$ v9 q% d5 e" L% N : fft length,frequency bin number( o4 @# _6 h4 f) v; j
%frameLength : frame length,usually same as N9 C4 X/ @( g8 V: p! l
% inc : step increment
7 X: {0 e" d0 }. N& v4 E7 [6 y% r : array element radius( T# `: k. K [# K
% angle : incident angle7 U! O' }( F- h; l8 y
%
1 A( ^7 N2 t; u& Q: a0 B1 m% output :# L7 z/ g o2 f' e
% DS : delay-sum output
& T% B4 x4 R! k8 [: I% x1 : presteered signal,same size as x
$ q: o% h3 u- r' W9 V. U2 Z5 t%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 v! e8 J4 n5 V' f
2 A( t) M' l7 p8 }c = 340;
' K8 e" g; @7 v* H" A6 h: ONele = size(x,2);
% ]# y. ]$ ~+ T' j! C8 tomega = zeros(frameLength,1);/ J& V' `# A1 D" Z8 P# ^. Y
H = ones(N/2+1,Nele);$ Q7 V; a3 n @: n
4 @8 w$ i7 L1 L8 r6 R3 v% Rtheta = 90*pi/180; %固定一个俯仰角
5 S! s; {, ~9 O C2 ]2 ?3 Rgamma = [30 90 150 210 270 330]*pi/180;%麦克风位置
2 q* z% J* {- D, r0 |tao = r*sin(theta)*cos(angle(1)-gamma)/c; %方位角 0 < angle <360
* z3 k9 A* c- Z& c0 Z) pyds = zeros(length(x(:,1)),1);9 z' K3 k, c4 u: B
x1 = zeros(size(x));
6 K; R8 J: l; \5 |
/ Y9 A# F$ w5 X% frequency bin weights
8 } \+ o1 z( \% for k = 2:1:N/2+1* ]6 [4 g5 F( l; a/ m
for k = 1:1:5000*N/fs
. }. l0 Q7 p2 }; _% R' `3 x omega(k) = 2*pi*(k-1)*fs/N; ! g, p) q- D2 I+ e7 L( C( \
% steering vector& r; U' Q" l( ?5 |) M. l
H(k, = exp(-1j*omega(k)*tao);
- U" D7 D F, }' Uend% y2 U, p) p5 j+ }6 \# S
5 u K" P& D" ?
for i = 1:inc:length(x(:,1))-frameLength0 Y+ i7 _9 R, J. g/ K
% i9 S9 I n+ W2 u# y7 K, U
d = fft(bsxfun(@times, x(i:i+frameLength-1, ,hamming(frameLength)));
- v+ ]/ J! g4 Q: G
, i% z7 m: r5 d/ H P q x_fft=bsxfun(@times, d(1:N/2+1, ,H);& U) R3 ]2 u! g% e4 w
: P5 D: v5 F$ o0 T' @+ L7 K- @
% phase transformed
* ?8 j1 E$ y: x8 F% b& Q* d( |" w %x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));
: B& U3 I, k. [) w, { yf = sum(x_fft,2);' `5 R, w+ s7 B6 x' F5 W) a
Cf = [yf;conj(flipud(yf(2:N/2)))];
' a3 |( J0 d( M1 P; w1 _1 X5 X M8 v; N5 D) P) U
% 恢复延时累加的信号
3 g# P! Z/ H; q' t5 k3 P! D7 W yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));' d! o( n8 X* a/ `; A4 {2 B: J; k
; l$ J. X- w O& f m5 Z
% 恢复各路对齐后的信号
( D7 x3 ~/ U) {6 R) i3 k xf = [x_fft;conj(flipud(x_fft(2:N/2, ))];. K0 ^. V/ R* L! V ^* d
x1(i:i+frameLength-1, = x1(i:i+frameLength-1, +(ifft(xf));
: Q6 a. |! J5 [: Y/ c- Oend* }! }! \. p8 w
DS = yds/Nele;
, a' n- Y6 _% K, B/ h
& ^) n! t+ P( L( l( t& T Cend' ]5 D! Q0 @9 y
然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下
" J2 R$ Q8 D; J2 X3 N, o( E4 [! t) l/ |4 y6 T/ x
%% SRP Estimate of Direction of Arrival at Microphone Array
& Z3 S8 t$ _) ~# p# u' c7 h0 E% Frequency-domain delay-and-sum test, A, T4 g. e6 \: A; q5 s9 f7 C4 c
%
( p G0 U2 C5 N2 a% P4 q/ h%%6 K/ v% o2 Q5 z' Q" k
& M, a6 t- F3 c$ s
% x = filter(Num,1,x0);7 L4 ~. G+ e& J4 Z, N6 @8 i
c = 340.0;
* o* J- O; l; t# K: n# g, G$ x9 @9 e" M7 U. Y: j Z' `
% XMOS circular microphone array radius# N& ` Q" I0 z# U8 u: M: T
d = 0.0420;
' x8 k$ y' `# w4 T1 W% more test audio file in ../../TestAudio/ folder3 L9 e& @9 O1 T% k7 |
path = '../../TestAudio/XMOS/room_mic5-2/';
- D- A% R/ t/ o5 d" a' _. {[s1,fs] = audioread([path,'音轨-2.wav']);- N: y" Z% c* p$ Q: G' G
s2 = audioread([path,'音轨-3.wav']);3 c: x$ e! F7 _9 m8 o( J
s3 = audioread([path,'音轨-4.wav']);
& F" C0 T' t8 V8 us4 = audioread([path,'音轨-5.wav']);( z4 u* ?, t' b6 k2 Z9 B9 \) J' e
s5 = audioread([path,'音轨-6.wav']); a) B8 n' s7 [, A! o& e
s6 = audioread([path,'音轨-7.wav']);) o- Z9 a }* w% N
signal = [s1,s2,s3,s4,s5,s6];
$ N" m2 X# ^( Y& YM = size(signal,2);
4 t L* ]0 ?$ g, E) J1 E& R%%6 m. `! c, [/ w {7 N- q
t = 0;
; H3 Y/ s( l! Z8 R' }& X' X
4 Z. b- k. M9 Q# ^5 E% X% minimal searching grid" I& N! h$ z/ ]
step = 1;7 W! g) I v8 S# C9 ]4 p. d
( y, U; ?( m/ {
P = zeros(1,length(0:step:360-step));
4 h- l6 `8 b0 ?, d/ u6 ]* N4 f0 H1 mtic' i9 g1 B: C+ k& o5 l7 Z
h = waitbar(0,'Please wait...');3 I3 p( o5 U! J* v- W" N/ s
for i = 0:step:360-step) U+ |( u* v/ z/ G. N: G# A$ j
% Delay-and-sum beamforming1 v. x1 T8 s/ {6 @
[ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);
2 @8 \" C, I' m/ i t = t+1;
- i0 R6 B, e1 T7 ^! }; `( { %beamformed output energy
6 o7 g7 S+ o) `" L+ y* |! ]4 {, b P(t) = DS'*DS;
2 \8 B; Y( E3 _$ s6 k$ X/ S waitbar(i / length(step:360-step))
. M+ ?1 X" B5 x) T! tend0 o3 ]4 S8 Q2 ?8 n. a! U( w
toc. @' W! v- C' ~: p5 V& p
close(h)
7 u- l) C$ c2 F* n7 x8 G[m,index] = max(P);
$ G1 z3 d3 M7 I3 ]figure,plot(0:step:360-step,P/max(P))7 V) w. S7 X: q$ p( ]) v3 V
ang = (index)*step
' ^( Z4 _$ Z. p8 {7 K0 N' H
! P- ]" j% f5 x3 Q& n+ T7 @程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下
/ g3 P' { N8 n3 { $ {; m* c: p2 }4 n+ F- v
结果与预期相同 PHAT加权 与GCC-PHAT方法相同,这里也可以对幅度做归一化,只保留相位信息,使得到的峰值更明显,提高在噪声及混响环境下的性能 # [+ w7 @7 w7 x
上面代码中加上这一句
) c4 r1 {/ T4 k/ @, G: G3 h%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));
. Y; k* O4 ^3 O4 d& [. k; c测试同样的文件,结果如下
/ c+ ~7 h# b# R( ?' _![]()
4 a5 l7 O9 Q7 H4 A对比可以看到,PHAT加权的方法性能更好
% V7 z0 ?$ U) i7 a# O/ Q参考
: P2 c( h+ B$ B1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》 6 U# _3 f/ X2 `, M! i
2. 《传感器阵列波束优化设计与应用》
1 Y1 L# |+ v5 q* h————————————————7 |8 u: L& |" G0 @. Y. A
版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。1 C, B( W1 ?; G. @# H0 x
原文链接:https://blog.csdn.net/u010592995/article/details/81586504
5 u3 @! _7 h0 n. e7 u( `4 {% ~6 v8 y
$ r* R; t: j" O2 d' b% e
& W: W4 |; j: H+ P; D
* ]' m; e! h* t" h4 [6 Q; P# j
3 v# h+ ~! x1 {. F& { |