数学建模社区-数学中国

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

作者: 浅夏110    时间: 2020-5-15 15:04
标题: 麦克风阵列声源定位 SRP-PHAT(二)
DOA
$ c! I; ]% |. W3 f  声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),# {7 {) y. s' K! a
. G. y( Z8 f. u/ t: `- R
steered-response power# ~6 }4 K+ R  [: c6 r
  可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。
5 W( x% k: R' n2 X- d+ X  上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。
' H0 @' t" `, x  其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现9 f0 J, x8 \) x7 G- O. H

8 c8 O- o/ p% B. p频域宽带波束形成" B, j" T" r: k  l2 g6 s1 [
  频域宽带波束形成可以归类为DFT波束形成器,结构如下图
* B( k* C# O" f- d% {% x5 y+ w  Z( ]+ Q5 @# h
! S. m# h$ r* P

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

频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT
4 h9 k, r+ I3 f, O0 d" Z代码实现如下


3 G; }1 K" u: Y# ^1 mnction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle)( I7 x* R/ L7 v6 H. d
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
) a: Y) x; o# b%frequency-domain delay-sum beamformer using circular array. @7 A, s) c7 j3 M" R5 R, e+ G
%   
2 {! I) k' k* D% c, E) G# B%      input :
  F7 Q- p2 s" G& n$ ]& v) H% x  N%          x : input signal ,samples * channel
0 O3 \1 D$ T+ M. Y, t. _& R% E%          fs: sample rate% F. I2 Q, K& |9 B, W
%          N : fft length,frequency bin number! n( q8 g+ ~6 d$ I" Q5 G0 w' _" O" X. J
%frameLength : frame length,usually same as N7 A! E! g6 X+ t+ q$ w. f  G3 {
%        inc : step increment
7 j+ G( K" _( u4 f%          r : array element radius8 A1 W/ n* P% @9 y' v
%      angle : incident angle
$ n5 v  z# r+ I4 {%; L! q7 A# a0 {' q. d% _* C8 f
%     output :
  P7 F4 @( W6 ]6 B. [6 R1 P%         DS : delay-sum output
/ i. e8 x+ ?, O4 d3 u$ `0 N%         x1 : presteered signal,same size as x0 M$ q0 a5 O  G% a8 T
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 A( v9 Q8 Y  H2 z5 i5 O1 _
& |7 ?5 m( d8 O3 U* L+ t8 A) \) V
c = 340;
! B+ Q6 [5 \* m& r6 _) zNele = size(x,2);
3 y) C" _5 J: V$ h/ {# c# [omega = zeros(frameLength,1);  \0 n$ D* v' T2 y  h9 d' c" C" `0 r3 m
H = ones(N/2+1,Nele);
/ I% K+ A% b1 O3 G7 O) Z2 c
1 H% Y: x& L/ Z1 A- s( ~" Ntheta = 90*pi/180; %固定一个俯仰角. F# J9 H5 q, [
gamma = [30 90 150 210 270 330]*pi/180;%麦克风位置' S, x* m0 k' ~1 P4 W4 l
tao = r*sin(theta)*cos(angle(1)-gamma)/c;     %方位角 0 < angle <360
: L# S" ^5 j0 U; c' K- zyds = zeros(length(x(:,1)),1);& |( l9 e2 d( v' [. [; h3 I
x1 = zeros(size(x));. V8 n! I  g) ]. B2 }9 f% Z/ Q) ?
7 Q: N/ Y2 u6 t( L/ K
% frequency bin weights
7 u5 w+ D& y% C1 }% for k = 2:1:N/2+13 {7 P& w3 W3 X# [! _* K/ p
for k = 1:1:5000*N/fs
3 W- l7 X) R' U3 |, o) ^! l    omega(k) = 2*pi*(k-1)*fs/N;   
: \, c" ^% D5 R( v7 B) C    % steering vector
( a" y, b1 ^% J0 N    H(k, = exp(-1j*omega(k)*tao);4 I2 Q0 |- T2 r5 o
end
& X) b! h4 l( _& D
$ C6 c# M/ w. s6 X# yfor i = 1:inc:length(x(:,1))-frameLength
2 O5 Q2 i# S* p8 C. b% k
- ]+ d( L5 e9 |% E; Q  n/ a! o    d = fft(bsxfun(@times, x(i:i+frameLength-1,,hamming(frameLength)));
' r4 K8 c( D7 L) Q& H. d/ g  U( S# r% O# B: [
    x_fft=bsxfun(@times, d(1:N/2+1,,H);
% G6 \  R  D& ]% e
, w8 B0 c. N8 |! j: X  {8 n6 P1 ^    % phase transformed5 h" {4 R4 n  g+ V; g9 B' I
    %x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,));6 \. N4 F" x7 v# a* Q
    yf = sum(x_fft,2);: v  H$ s0 c: W) H
    Cf = [yf;conj(flipud(yf(2:N/2)))];
1 p9 T8 P3 ^* r- T4 n" g
! P+ Y6 d9 {$ d! P/ c1 d) g7 ~& s+ G    % 恢复延时累加的信号
+ k, e' j8 x$ s  o4 c6 Y; O    yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));. }7 c$ p. L# V; ^- ]
  J9 u3 V& m2 L0 {1 w
    % 恢复各路对齐后的信号$ E8 E: J. q+ H+ @3 c6 T* m
    xf  = [x_fft;conj(flipud(x_fft(2:N/2,))];) W9 M8 j) U2 w/ b- z( _
    x1(i:i+frameLength-1, = x1(i:i+frameLength-1,+(ifft(xf));0 i3 V& Q/ w& Y7 M8 o6 j
end& H) k$ U, X* D: s9 w. b
DS = yds/Nele;  % i6 N1 _# F- @; n6 m) w

2 ~4 s& T- y# A# ^end7 V6 [" k. W+ z
然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下
  {+ ~: W" i, A3 k8 ^$ ]& w, i& m) Z% J' J' M0 Z' N! ^
%% SRP Estimate of Direction of Arrival at Microphone Array
, U, S' Z6 |+ k* X/ n: V% Frequency-domain delay-and-sum test* Z! E$ I/ g  L
%  - w' ^" ^) y% A. Y. d$ \& S, G0 I; w
%%
5 ^% W( e; Q* g# H# _. ~4 E6 C2 p) S1 C! x/ e1 S$ i
% x = filter(Num,1,x0);
9 o$ V  g. {/ o" Sc = 340.0;
5 D* Y; k3 p) r' V" M
' U  M6 F/ S2 U5 v) K% I% XMOS circular microphone array radius
; {5 d; N7 ]/ Y2 S3 o1 t! @d = 0.0420;
' ]) |7 g3 L& m% C% more test audio file in ../../TestAudio/ folder0 ~3 `1 K( s0 X' P3 l: W0 L7 Y
path = '../../TestAudio/XMOS/room_mic5-2/';6 ]9 T0 y; y) c# z0 |) x
[s1,fs] = audioread([path,'音轨-2.wav']);
, Q; v5 {$ J; o8 h% ls2 = audioread([path,'音轨-3.wav']);
- {8 D; U$ w# ?3 b! Ts3 = audioread([path,'音轨-4.wav']);
# ?3 ~- z3 i: L% }: Es4 = audioread([path,'音轨-5.wav']);  g; C" c' Y) \3 s& W
s5 = audioread([path,'音轨-6.wav']);" t0 ?5 Q( {# i2 E$ c  w% E6 A
s6 = audioread([path,'音轨-7.wav']);
6 g$ u( Q7 H& v2 Bsignal = [s1,s2,s3,s4,s5,s6];: J+ e) Y# B0 S6 U& |6 F+ Z! {
M = size(signal,2);
. n; r' E  U) J4 n% b+ h%%! t$ P; Q  |* h8 U
t = 0;# a& r0 e& e! O/ c, l6 ^- v

8 {, s, b& b' F6 \$ ]% minimal searching grid( h& ^' L; f2 r6 H, U6 N
step = 1;
. c5 ]6 k' I; G- F0 v% G9 X% C2 i5 }4 @( r7 t0 R7 s$ H/ V& O) |- G4 l
P = zeros(1,length(0:step:360-step));
+ @- J- w( G$ }2 j* ztic. o# Z* u7 u; _* K' M5 M! ^5 B1 j' l
h = waitbar(0,'Please wait...');. y% w4 R1 ^* m( X! O
for i = 0:step:360-step7 T+ ]& X1 p& D  c$ E# Z# J4 R  N
    % Delay-and-sum beamforming
3 Y1 M% J" A1 I1 W8 Z! l2 X    [ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);3 Z3 }/ d! K, e, J
    t = t+1;" ^1 L! Y) s! F# a( i- a
    %beamformed output energy
' ]: F& m0 ^. h    P(t) = DS'*DS;6 r3 c7 ]5 g: [
    waitbar(i / length(step:360-step))
; m% l9 t7 D8 Q! }; Xend
9 o% M* ]; x7 N6 Ptoc
4 {7 u4 H1 l8 o; O% Sclose(h) 0 M5 j8 t, G5 q- \! Z6 h- ^
[m,index] = max(P);
* k( J! }) |( G5 E( H6 |0 efigure,plot(0:step:360-step,P/max(P)): r: R7 z# A4 m/ G5 p1 s: k
ang = (index)*step
  P* q3 a4 x: p) Z
6 K, W7 x: w9 l* H- U! O程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下
1 x; ?% j9 `2 s( n- I; b0 q9 J: A$ N& m0 F& \( V3 J7 X

结果与预期相同

PHAT加权

  与GCC-PHAT方法相同,这里也可以对幅度做归一化,只保留相位信息,使得到的峰值更明显,提高在噪声及混响环境下的性能   R/ H. _+ w+ ]
  上面代码中加上这一句


4 ~, f- x6 g  y  S: ^  L8 N%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,));3 s/ n5 F9 Z5 z
测试同样的文件,结果如下 * m( s& r4 u7 [" ]: f$ t" k: E
) n0 u$ ?6 `2 a: ~
对比可以看到,PHAT加权的方法性能更好! e) M6 w* `6 E
参考2 J0 y& ?1 ?4 Q* z
1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》 # q3 d. ?, b0 N: h% ^! t  M
2. 《传感器阵列波束优化设计与应用》
/ \6 t( S. s$ J- N5 C————————————————
" a  M$ C3 w$ p, K+ x2 o/ {& ^版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。  e" \& V9 Y) l# f4 S: J, w
原文链接:https://blog.csdn.net/u010592995/article/details/81586504
* b$ q0 M' U( T# P7 A5 e. U4 u3 Z# u2 J/ `/ G

% x4 p+ v  M6 E/ g# G# `5 h
' I; _( _( O" S  ^' y2 \
; Q' F) p, H9 t& t5 e, y  P( f5 P1 p! X' |  t/ w/ T5 n5 J





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