数学建模社区-数学中国
标题: 麦克风阵列声源定位 SRP-PHAT(二) [打印本页]
作者: 浅夏110 时间: 2020-5-15 15:04
标题: 麦克风阵列声源定位 SRP-PHAT(二)
DOA
' U3 U1 ~& J. Z: o 声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),, X: d% t8 N u( Q9 s: X/ ?- N
$ X1 H9 S9 _- Y" {1 }# n2 ?. X
steered-response power) m4 n) N$ o8 K. G s: k6 W
可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。 . Q- G ]( X1 ]- M# _) Y3 J) l' ~5 v
上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。
2 p" f6 k p2 }" ^8 C 其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现
8 u* Z0 G! `6 [0 Y p0 \! \, x: v% L! ]: e" x. J( s L
频域宽带波束形成) c! d( e# s9 x! v; M/ U, u' r' F+ c
频域宽带波束形成可以归类为DFT波束形成器,结构如下图
2 U9 F/ q) {7 H
7 L N! c/ G$ S, ~ {& v/ v0 o& @1 Z9 i, r
频域处理也可以看做是子带处理(subband),DFT和IDFT的系数分别对应子带处理中的分析综合滤波器组,关于这一种解释,可参考《传感器阵列波束优化设计与应用》第六章。
频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT
, v! b' M8 Z9 Y8 H代码实现如下
1 a8 r# @# h R( j% D
nction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle)) c5 Q# R+ ~. F3 R3 U
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# A$ S$ |; W6 d) ~, V%frequency-domain delay-sum beamformer using circular array- ^! g, {% a* B% f4 x! G* h7 h% f
%
9 J- u, n: |1 i1 P" C5 y- u% input :
( b9 ^9 _. I7 V. o; \3 t( c: ?% x : input signal ,samples * channel% x4 \( D. e& I+ D8 i4 I2 a# x
% fs: sample rate
/ ]; h( b( v" i% N : fft length,frequency bin number3 c, h9 A8 q$ ]* O7 d# _4 E
%frameLength : frame length,usually same as N) [. \* m$ n9 D7 k9 C; ?( `2 {
% inc : step increment) O% R' R! R: J# v! d0 i8 M9 W
% r : array element radius
" `1 k8 b( Y' w8 V' K% angle : incident angle+ ]4 a5 p4 D/ }) o, R
%
, m) y, S6 C8 j8 g. D% output :+ F* x; _6 U% _
% DS : delay-sum output% K/ B, ]6 j$ v9 k
% x1 : presteered signal,same size as x& u1 A7 X/ U' D
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1 _8 L7 z1 Q: w6 R& E0 k1 V
1 @+ o; N3 k. {! [ Z ^1 B* Y( {c = 340;
( W% b2 Y( X6 C$ ?# E: ONele = size(x,2);
# ~3 b* Y; D0 i' S& _4 nomega = zeros(frameLength,1);
. v2 Y9 D" z+ }# SH = ones(N/2+1,Nele);
( ~/ w2 I9 N: p1 v2 S5 Q: U8 A- h
0 c$ P. Z- R9 G- N% A3 F% h1 Ttheta = 90*pi/180; %固定一个俯仰角
3 s; t! o' A3 k0 u9 Zgamma = [30 90 150 210 270 330]*pi/180;%麦克风位置
. m6 L5 L6 e$ I: o1 u: Ftao = r*sin(theta)*cos(angle(1)-gamma)/c; %方位角 0 < angle <360- n' ~$ }7 ` m6 D/ Q
yds = zeros(length(x(:,1)),1);" j. i8 L( ^; Q# r& p# k
x1 = zeros(size(x));7 Z' ~& O! k. _, O' }0 f
9 ? n |+ d. {1 P% frequency bin weights
8 N9 S4 S9 W, u4 o$ ?$ v: v; f% for k = 2:1:N/2+1
) p- X& q( x+ R6 Q Rfor k = 1:1:5000*N/fs& n+ p- ]! I; m3 W4 ?
omega(k) = 2*pi*(k-1)*fs/N;
" X; J. @. B/ a9 {" o % steering vector2 V# O+ j3 |$ P5 a
H(k,
= exp(-1j*omega(k)*tao);
: G @' q$ _2 I2 `- k8 Qend
& @5 a$ K, C4 y4 a! e% J
$ d, p0 l+ H: |3 x' Ffor i = 1:inc:length(x(:,1))-frameLength
# B' u, [ x! k
; m1 S9 n* R9 x4 p d = fft(bsxfun(@times, x(i:i+frameLength-1,
,hamming(frameLength)));( j# s/ V5 J1 O) r
G" c, N" [$ C) Z9 u+ k! M0 e
x_fft=bsxfun(@times, d(1:N/2+1,
,H);
8 a% ~! }& ~7 b& m5 N. ^% b1 C3 F- x$ I" F i, X9 {& \
% phase transformed
- U: c! M+ p) I# ^8 } %x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,
));
/ L, B( z7 z: N% B M yf = sum(x_fft,2);- L5 A8 M3 R# Y V
Cf = [yf;conj(flipud(yf(2:N/2)))];
\( o" H$ j$ c) x. z$ B _
% N$ P( m) N: m; ] % 恢复延时累加的信号4 V7 T8 w0 M2 `% a2 l. x7 @
yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));
# \. ^- C* M: p0 j9 n+ O, n% N5 N* |8 u6 Q
% 恢复各路对齐后的信号
, q5 u: Z m4 U7 b6 t' V, x xf = [x_fft;conj(flipud(x_fft(2:N/2,
))];
: m' H }, d; K5 x1 I x1(i:i+frameLength-1,
= x1(i:i+frameLength-1,
+(ifft(xf));
# n: G/ }, Q* V3 X4 y3 h7 Z) Iend
) Q8 _' ?5 ?! b+ r) HDS = yds/Nele;
* `# t* y; b8 Z M; B. K. q5 l1 N3 \
" f- e3 P# d. V8 ~end2 o U$ t! H4 a$ e: e% Q" S! h! M; ]
然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下 O* t1 [1 \' {5 D" F$ ^2 }
, E' `, B. Q# P% _%% SRP Estimate of Direction of Arrival at Microphone Array
- J9 Q! V' H8 T5 i9 @% n% Frequency-domain delay-and-sum test
6 R v! Z" l: m4 T. r%
& X1 q( ~: }: T% i%%: @& {7 Q9 b& u ?+ h
- i6 a: \* f3 W& [" [; O; P% x = filter(Num,1,x0);
: q, R7 {: W! M+ `7 K1 Nc = 340.0;
. H( S. Y, x r( H! f1 h
% u9 O3 P3 Z# R i% r( h. ^, f% XMOS circular microphone array radius& N) L) J& v9 p
d = 0.0420;
; _( w& q; Y' ?" v6 K; T$ R% more test audio file in ../../TestAudio/ folder
3 _* G4 j' F0 R# Z: h( \path = '../../TestAudio/XMOS/room_mic5-2/';, E. I; n5 A5 `8 q
[s1,fs] = audioread([path,'音轨-2.wav']);
9 U0 g; t1 P) b4 a0 T6 x3 ds2 = audioread([path,'音轨-3.wav']);4 {' f- a5 n4 ?" v; X" r
s3 = audioread([path,'音轨-4.wav']);+ {! K' N( ^( y$ j0 R/ }
s4 = audioread([path,'音轨-5.wav']);
. T$ J, y: s' j# n9 u' ts5 = audioread([path,'音轨-6.wav']);1 D7 i1 G) j4 y |1 v3 V/ e8 A1 `* i
s6 = audioread([path,'音轨-7.wav']);4 S, u8 n$ l4 \* W1 Z0 r; b$ W
signal = [s1,s2,s3,s4,s5,s6];3 [" L" u0 m, D: G: ^0 ]
M = size(signal,2);
# ]4 }* Y( B) V5 i" i2 U& W; \%%$ o% p$ L0 n+ [
t = 0;
/ |) n* k5 Y" D, O2 Q. d6 L
9 \( ~! [3 @# C; j% minimal searching grid
, q' j! U- X, g( F1 f- Lstep = 1;
9 U/ M! A2 W! S/ d4 e! F Q" `* G" w4 \3 P+ K7 b
P = zeros(1,length(0:step:360-step));
( ?, Q5 |: u, D5 @6 Ztic# W7 x- t, I* {! H' O# l
h = waitbar(0,'Please wait...');- A. j; R' U7 I+ w
for i = 0:step:360-step8 l+ c8 o/ F5 U0 r% B% O
% Delay-and-sum beamforming8 d* _; \" q; l" d; ~: O8 v
[ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);0 @3 q7 U/ e4 x: Z
t = t+1;
& }( {& j: L' u& R% j* m3 Y M %beamformed output energy
& ?- S8 |" ^4 c( J+ w) Z; W P(t) = DS'*DS;
% F/ [9 u4 d. }( n2 a5 v2 x5 j1 ` waitbar(i / length(step:360-step))
* ^$ u" E1 J" T7 Iend
# S: _3 y# H) l7 Ttoc0 I0 c! ]3 \; h% N0 [
close(h) ) n9 g7 n6 B0 k. f8 g4 P
[m,index] = max(P);4 f' q* Q4 {, b' ^( q* ~: T: ]
figure,plot(0:step:360-step,P/max(P))
7 q* E# w+ r( U3 f; I, Cang = (index)*step9 U1 v! c, C: D% j
) W9 e: `% C w0 i; y( D7 R
程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下* s: K( B9 A+ J: R2 A& t8 Y5 E
. D" K) ^& U, K
结果与预期相同
PHAT加权 与GCC-PHAT方法相同,这里也可以对幅度做归一化,只保留相位信息,使得到的峰值更明显,提高在噪声及混响环境下的性能 0 D6 J) P) u2 s3 M# E
上面代码中加上这一句
8 d: V0 B9 R8 R! h# E%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,
));" v3 t; k0 N( a2 V D0 t
测试同样的文件,结果如下
/ m: L* ?) _- h' H* Q
0 A$ Z+ s1 r, B对比可以看到,PHAT加权的方法性能更好6 H; k/ }- r, U6 ^+ G8 }
参考
) D2 ]9 h) S2 w/ x1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》 2 V+ Z5 }( C6 @
2. 《传感器阵列波束优化设计与应用》
J2 `" j. k& m————————————————6 y/ [2 L- C6 O1 ~! n
版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。) F, k2 y, W( a! W C" a) F
原文链接:https://blog.csdn.net/u010592995/article/details/815865042 F5 N, v# `2 T$ D
) K2 n* e }4 H7 J
; T$ d* _& H2 i" ^9 O; {! S8 W, n9 }
7 o) S$ n8 w$ I0 `6 Z N8 B" \; A2 n1 _4 X0 q$ |- A% ^) i8 L2 a1 x
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |