数学建模社区-数学中国

标题: 麦克风阵列声源定位 SRP-PHAT(二) [打印本页]

作者: 浅夏110    时间: 2020-5-15 15:04
标题: 麦克风阵列声源定位 SRP-PHAT(二)
DOA
4 t$ I" l' o3 `. I' [# _% ?& L9 Z) y  声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),0 S9 S4 z  |, r  Y8 ]

2 e$ r+ M0 ~1 x& H9 A9 }steered-response power
+ A1 v  O$ X: y+ B  k  可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。 + Q, K& K2 R! H" F/ d
  上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。
' x( V* y7 @1 o  其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现
4 E) e: V0 t) b/ G+ [
) J7 u9 F: N2 g; n频域宽带波束形成5 b4 m: |) x, h* j( h
  频域宽带波束形成可以归类为DFT波束形成器,结构如下图   G% u, k* f3 \+ p) v

# ~( V2 h0 a7 b: i! I# ^! W; F; q% A4 r6 ?6 ]$ g6 I: i8 r

频域处理也可以看做是子带处理(subband),DFT和IDFT的系数分别对应子带处理中的分析综合滤波器组,关于这一种解释,可参考《传感器阵列波束优化设计与应用》第六章。

频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT 4 B* v, Z$ V) U8 r- `9 \
代码实现如下

/ |% f" ~8 r9 R
nction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle)" Q6 x6 O/ _# x5 S  U
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
& m" n! k" C: J%frequency-domain delay-sum beamformer using circular array2 \4 Z6 ^. _+ ]6 s( P* G0 j
%   ' r, v! c6 B% f
%      input :
3 g. |9 @1 l# {%          x : input signal ,samples * channel
, w4 ~  L, z. y' }%          fs: sample rate
! M# C% \$ w8 S0 k/ Y7 g. I! V%          N : fft length,frequency bin number
: @) N6 _2 l' Y3 l" E$ v& Q. M%frameLength : frame length,usually same as N
( _4 k# F# y( G) R" p%        inc : step increment+ o/ t0 \% W8 J
%          r : array element radius) H/ v0 k1 B# t; B6 i- F) e0 b
%      angle : incident angle
3 S  u) y" P' i! y%
% T( k0 ?# u$ M& b%     output :
) U% a9 K4 w) v% n%         DS : delay-sum output
# W  {; v" B0 j2 B6 f  J0 Q%         x1 : presteered signal,same size as x+ Q6 Z7 Q5 ^4 U0 k6 G  c
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5 Z$ y( x9 c! l/ _/ b( A6 {$ f/ K: x! |% f1 m
c = 340;) T5 L$ A7 o- ?* c
Nele = size(x,2);
( v! N1 U& |2 w" w, }: K* [# ^- zomega = zeros(frameLength,1);: v* v  }1 G' }
H = ones(N/2+1,Nele);
' t* V; d1 y! l( d( ]7 I. ~
# q1 h! o$ b: ~8 Utheta = 90*pi/180; %固定一个俯仰角
7 z/ K8 a0 y5 g8 w, B# ~9 Jgamma = [30 90 150 210 270 330]*pi/180;%麦克风位置
& @5 S3 c0 Q) e2 f( I4 _* B6 Ytao = r*sin(theta)*cos(angle(1)-gamma)/c;     %方位角 0 < angle <360
9 Z# Q# z" z% Y% J8 T- X" E- Uyds = zeros(length(x(:,1)),1);/ P; q: P) f+ @& O
x1 = zeros(size(x));
5 b9 K; g7 w( m5 m# H. \: W
! l" h, K& d$ V0 c3 x! Z% x( T% frequency bin weights
; H3 K0 D3 B' s% for k = 2:1:N/2+1  r  F, t$ g! l$ l6 R# `
for k = 1:1:5000*N/fs* |3 |0 u6 ^3 `
    omega(k) = 2*pi*(k-1)*fs/N;   
5 Y7 c2 R8 S: N  F$ o* f    % steering vector
! R& n9 D6 K- |  J" f8 c2 `9 g3 b" w1 p    H(k, = exp(-1j*omega(k)*tao);
1 r1 D: ~7 y$ p* wend
" `3 Q+ k5 b0 K, n) h
) ^, a2 o6 V* qfor i = 1:inc:length(x(:,1))-frameLength- Q- F  o( ]: Z# v7 i- l

- l8 i: E4 e1 g    d = fft(bsxfun(@times, x(i:i+frameLength-1,,hamming(frameLength)));
  T5 q( S8 n- u5 w
9 ~4 i3 |2 ^% T    x_fft=bsxfun(@times, d(1:N/2+1,,H);% E% n& _! P3 c; I3 R
3 Q" m5 O7 E0 E/ {# D6 i* d
    % phase transformed
" y' o- ~. F, P/ j    %x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,));; L8 p) ~$ s+ |9 {4 x3 P# p
    yf = sum(x_fft,2);3 q" k8 J8 G) w4 U: K; \
    Cf = [yf;conj(flipud(yf(2:N/2)))];4 {$ c/ Q1 }! v7 G9 Y
  l  C0 T' e. D4 ?4 {  P
    % 恢复延时累加的信号) C* E; Y- E- J
    yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));3 {* E  X- c, v" U: r
+ F- M2 Z$ ]" M2 L/ X0 h) ~
    % 恢复各路对齐后的信号
4 Q9 }) }+ C+ t* ?! V' y    xf  = [x_fft;conj(flipud(x_fft(2:N/2,))];4 J2 h- d  m6 m& l: b$ \, N
    x1(i:i+frameLength-1, = x1(i:i+frameLength-1,+(ifft(xf));+ u1 b, N: A! n: x3 K( Y
end
0 g2 ?' ^9 S0 Q5 f) k6 ~% qDS = yds/Nele;  
3 v1 ~3 s5 p4 T
9 u: r  v  U, q0 k0 j3 y' P+ hend) u1 A" S2 J$ }0 C; r  d/ s- {; H
然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下5 p. N- q0 i( i
2 ?6 y6 Q) w# G. s: K: ?% b
%% SRP Estimate of Direction of Arrival at Microphone Array
2 z. l8 B3 F& `6 x) k% Frequency-domain delay-and-sum test
, `/ h5 H4 q5 F( p* Y% C5 z. ?%  3 r$ v8 q  V% q) h. H+ }8 B; [& j
%%
+ s% [& {4 o1 K+ R* P, {6 b2 W  e
% x = filter(Num,1,x0);
$ D" K) b' F( K; W, [# ^c = 340.0;
; O* Q4 r+ p8 ~0 v' u  z( z/ G' L5 \/ O* R* s. |8 o* k0 U
% XMOS circular microphone array radius# W  A# }) `4 U% K7 U# ]- J
d = 0.0420;' `1 U* m6 y6 A$ n
% more test audio file in ../../TestAudio/ folder& I0 N# c! u% ?3 U' n( J
path = '../../TestAudio/XMOS/room_mic5-2/';9 [  A2 T5 Y- e3 W9 `
[s1,fs] = audioread([path,'音轨-2.wav']);
& z5 F3 L" J% ]+ U- t8 Y4 q( Xs2 = audioread([path,'音轨-3.wav']);4 C, Z, c% M- w1 j* G5 K% o
s3 = audioread([path,'音轨-4.wav']);6 m2 r6 }: K+ K3 B
s4 = audioread([path,'音轨-5.wav']);4 w$ f! d% N  q, Q5 C' q6 T% `
s5 = audioread([path,'音轨-6.wav']);2 Z, f7 m3 |, v* ~
s6 = audioread([path,'音轨-7.wav']);
% X! V) N9 w2 K* U! Asignal = [s1,s2,s3,s4,s5,s6];* Z5 x, d0 p/ N5 J9 c- `% E& g
M = size(signal,2);
, F1 H+ k; {' T3 ?* a%%
; O; G! k8 K4 l; J/ Zt = 0;
! S$ F2 D/ s9 O% g1 B# @9 {) U) J# e% j9 r8 p% ~
% minimal searching grid
- N# h% \5 q$ Bstep = 1;
* c1 m% R6 F2 m0 ?! d
" ?' d# Y8 K3 s- XP = zeros(1,length(0:step:360-step));3 z+ t  H' ^. J) y* K: e& A! h% w" E
tic3 U1 i6 O; r, J9 e! @+ @
h = waitbar(0,'Please wait...');
5 |) a! ?9 C4 O+ d6 {( c- E+ ufor i = 0:step:360-step( M6 F5 U* n; d! Z/ a% q/ l
    % Delay-and-sum beamforming: P+ r( H% O( |$ F
    [ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);* k* X. I  W+ W" E7 x$ L
    t = t+1;1 l8 M6 O; q/ v6 ?, K+ T1 p  c# U" Z
    %beamformed output energy
: ]' K$ C0 h# g1 x9 z  g    P(t) = DS'*DS;$ P7 s; U( F; u0 T
    waitbar(i / length(step:360-step))
. |5 ]" k/ A6 @" t+ d' R) Q9 _end
: V6 [- E" B+ G* w) C" Vtoc
( B( _$ V  T/ H* [/ qclose(h)
! g  n4 {% m4 v# Y[m,index] = max(P);4 _+ H, ^7 A# }% j" ^1 f: A3 j
figure,plot(0:step:360-step,P/max(P))
5 i0 W1 F6 H9 o) }; J! h; Xang = (index)*step0 \, |5 K, v5 s" \5 i, {- u/ W6 Z1 Z
, h7 f; ]. N( m
程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下
5 T- l- Q. U- }7 a  {0 f: A. E
! D( H, F* q+ _1 s: w6 M3 l

结果与预期相同

PHAT加权

  与GCC-PHAT方法相同,这里也可以对幅度做归一化,只保留相位信息,使得到的峰值更明显,提高在噪声及混响环境下的性能 5 k" g* z2 V3 \2 R, f
  上面代码中加上这一句

9 a' _2 |9 o5 d6 v
%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,));- S8 g/ n" K, s$ G5 i0 D
测试同样的文件,结果如下
6 G, r, C9 C" A. F; Y
2 i( {( O! p' Y9 A; y对比可以看到,PHAT加权的方法性能更好% t9 @, w9 v  \) M. D( ?2 F+ g
参考
& L1 U& T  \" p1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》 ) e1 m3 D$ Y! l; u
2. 《传感器阵列波束优化设计与应用》
/ o# R/ U7 l/ ^% u3 C————————————————
1 l' s0 ?3 J7 m9 U  M. n: C+ ]版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
* b; ~  s2 @0 \, }原文链接:https://blog.csdn.net/u010592995/article/details/81586504$ z/ i7 n7 V* n: q9 f* T

! q$ P* E5 U( F7 U8 b! Z5 ]/ H$ E1 c4 r& N

2 ?- p/ ?9 |  K! W! o! C! ~$ W) I; j- F; H, n
# S" S; K/ H4 z5 F( ^" a/ b





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5