DOA- m; ~; {# ^. i% z0 y
声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),
) P o7 [3 b; w3 C7 l
# t- w, {2 C5 E# n& }steered-response power
# C& \, v. v$ k) U 可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。
( p2 a' s: G0 s. N1 o 上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。 * A( B- ~7 Z# {; Q2 u
其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现
$ T, C- b# T0 f3 [- f4 Z, ^5 ?$ [2 i, @/ V( U8 u1 d4 k
频域宽带波束形成
6 ]( j" e6 s6 F4 ~/ D; d5 P/ j 频域宽带波束形成可以归类为DFT波束形成器,结构如下图 5 E, m0 _/ @0 i9 f8 q+ L1 f
![]()
# ?5 @ I' Q7 v, p" B2 R% z$ t! n3 m! x( A0 d
频域处理也可以看做是子带处理(subband),DFT和IDFT的系数分别对应子带处理中的分析综合滤波器组,关于这一种解释,可参考《传感器阵列波束优化设计与应用》第六章。 频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT . k- u; I5 l+ ^# ^/ C* }2 i
代码实现如下
1 u/ |& n2 [! x2 anction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle)
7 m8 ?" ?, I/ M4 l" _( G3 T: n% y%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5 C+ w( {5 ?! ~%frequency-domain delay-sum beamformer using circular array: k; r& G" @* |$ O+ V
%
; Q, {% U+ o2 l6 X$ m/ u3 l% input :
% ?' e2 L3 ~# V: m' I( K% x : input signal ,samples * channel
! e/ `) R; n3 _, r2 n9 G) K% fs: sample rate, u- k. S$ \( a' b+ }/ k
% N : fft length,frequency bin number0 S! ]& G" M! X$ {
%frameLength : frame length,usually same as N
7 |# U* ^: G% Z3 k" A% inc : step increment h6 k8 R8 [7 y) m' c
% r : array element radius: f9 s- A/ R' l* e
% angle : incident angle
- X9 U; O$ }& |%1 L8 x3 j5 w' E5 f
% output :! {) u% ^! X' y' ^1 G$ X+ b
% DS : delay-sum output5 g4 O* V3 l3 b% H' l! V
% x1 : presteered signal,same size as x
8 j4 @8 k- q K: Q1 G%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
. H! |' |$ D, v/ V1 p1 H
) Q$ G; T: s! |7 |c = 340;
7 P' |& {" n$ yNele = size(x,2);8 P. x) A4 b. u% I
omega = zeros(frameLength,1);' r2 m# v3 r& i. o, y: P; |. r
H = ones(N/2+1,Nele);
9 x ]+ _! o$ z7 j" o d- \
+ d- w7 |- Q1 N- qtheta = 90*pi/180; %固定一个俯仰角
+ {, Y @" g- ^7 d4 }1 ^gamma = [30 90 150 210 270 330]*pi/180;%麦克风位置3 x, e; E0 g! Q
tao = r*sin(theta)*cos(angle(1)-gamma)/c; %方位角 0 < angle <360
1 T! a" _0 S/ T0 U7 O! f1 q5 Cyds = zeros(length(x(:,1)),1);, ^ I' x. h `
x1 = zeros(size(x));
2 w& @9 J9 v7 |3 [: m0 k ~! m8 c: E4 J& _ E% G
% frequency bin weights# K& d' q# a8 k# U. o% @
% for k = 2:1:N/2+1' x# O( H' C& F$ ^1 N4 s
for k = 1:1:5000*N/fs
- h/ I) d" b4 q* a& g3 n omega(k) = 2*pi*(k-1)*fs/N;
+ b% |' F, x/ \: R! {5 @& \2 G % steering vector
) ^6 c$ ^, x, p8 ? H(k, = exp(-1j*omega(k)*tao);$ Y. T) o* t; J8 e( U6 V
end! D, r. i$ ]( o3 ^
2 w4 @# J* o2 H) ^0 Jfor i = 1:inc:length(x(:,1))-frameLength
& C5 Y+ h7 h( r# M/ ^
7 ^( J: i! w8 J8 g) W d = fft(bsxfun(@times, x(i:i+frameLength-1, ,hamming(frameLength)));9 _& ^( e* @8 x$ C( x @/ Y! M
( f/ }6 b' L) O8 V
x_fft=bsxfun(@times, d(1:N/2+1, ,H);2 w5 R5 P0 i7 h2 l4 ]8 t
$ x5 S- _+ [5 c5 C. F0 K& S % phase transformed
; [/ T5 Y6 d/ Z' i1 `0 o" d" s, \ %x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));
5 q f" J8 V9 B yf = sum(x_fft,2);& r( c+ N; Q3 M6 K. ]& r; \
Cf = [yf;conj(flipud(yf(2:N/2)))];% M$ t0 e9 C1 e
( o5 x3 O3 c/ U: v
% 恢复延时累加的信号0 _: f' R$ b) ]/ `, D
yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));) f t& J: |; K' L
7 P1 M, y: R/ X1 A % 恢复各路对齐后的信号0 ?* o/ W3 ^9 s( |
xf = [x_fft;conj(flipud(x_fft(2:N/2, ))];6 [$ W. l' q. s$ n$ N
x1(i:i+frameLength-1, = x1(i:i+frameLength-1, +(ifft(xf));
4 S+ m, J# ^/ i nend N/ y; k" c" r6 K g+ V' G: o
DS = yds/Nele; + p) D5 \# L1 ~
+ S- b% Q3 l5 s( v V- z( l, X
end
/ d; a t# s, M7 S然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下* {$ V0 T3 t! V8 y' c2 t% D t
1 V$ j2 {; w+ |+ N3 o
%% SRP Estimate of Direction of Arrival at Microphone Array
& l& `2 f! s9 w% Frequency-domain delay-and-sum test
9 Y6 f$ s$ I% M% 0 O( Y) h: ^' N" ]/ B
%%
7 W/ d* _) s& m+ x! S: W6 Q- D& I7 j* j+ c) H
% x = filter(Num,1,x0);, O. b- K3 o& o& P9 y* D
c = 340.0;: T6 }( `# q) L1 j& @$ X
3 O1 d. `- p$ }0 s+ u( [
% XMOS circular microphone array radius
7 w, n/ I/ c, @" r! X. {d = 0.0420;
, e: B- U6 S2 U; I" K' L% more test audio file in ../../TestAudio/ folder. V4 y) v2 w/ B& a
path = '../../TestAudio/XMOS/room_mic5-2/';! b8 X7 p5 {1 p, o8 Y
[s1,fs] = audioread([path,'音轨-2.wav']);
: h' f1 f4 n8 O7 h! b6 v$ d. Es2 = audioread([path,'音轨-3.wav']);
8 |: A* K8 m* ^. S: ?s3 = audioread([path,'音轨-4.wav']);. s9 j3 \! q A9 O% K; Y! M% A
s4 = audioread([path,'音轨-5.wav']);0 j5 d) e; p- H7 B
s5 = audioread([path,'音轨-6.wav']);
! u' `0 d6 a6 m4 O J' As6 = audioread([path,'音轨-7.wav']);
) C/ ~! b Y" ]2 i) d$ Y1 Esignal = [s1,s2,s3,s4,s5,s6];" a* }0 |6 w4 I% r% x
M = size(signal,2);& ?% @" I# T1 X$ T6 r
%%
" b4 P s6 s3 M1 h8 }5 @( Qt = 0;
$ o6 K; P' h# H) o5 z0 E: c) {' G ^+ j; [- c
% minimal searching grid
" V" Q3 z" W+ W- y+ D; u$ cstep = 1;
( J+ Z9 @% [ s. X3 u* n6 b: t6 P: h L' r5 A% F. Q
P = zeros(1,length(0:step:360-step));
" Y3 R! m) s( s3 I. i5 Qtic
: s/ S' I' c/ y) Hh = waitbar(0,'Please wait...');
/ [3 Q3 ~4 V. B, U7 afor i = 0:step:360-step
- e5 k. `' `/ {8 d. t! ` % Delay-and-sum beamforming
M: A8 a; W$ @5 W' E* Y [ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);/ x. K. l1 L% O% C5 s; p, \5 E
t = t+1;' ?) L2 v" g5 I5 C9 A
%beamformed output energy
: ~9 S5 ]! h$ O0 M @+ c: x! w P(t) = DS'*DS;3 v* }8 b& {' K! N3 [' ?8 E
waitbar(i / length(step:360-step))1 c! ]# [' m+ Z& i
end, S/ A k6 p4 t6 h6 o ~" {2 a
toc- [ n0 o$ e) K4 v- _4 u
close(h) 1 r; D- d6 m3 c- @6 P6 z
[m,index] = max(P);
/ t1 W, z$ y: l! tfigure,plot(0:step:360-step,P/max(P))* `' B5 ^! q. _" S0 [! l; @& m
ang = (index)*step
. t4 l4 R+ c; d
3 n& p! ~3 U5 G* i- w程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下 k# P Q/ m) L1 l1 ]
6 D b4 P8 @# L$ I0 j! L
结果与预期相同 PHAT加权 与GCC-PHAT方法相同,这里也可以对幅度做归一化,只保留相位信息,使得到的峰值更明显,提高在噪声及混响环境下的性能 ' t* Z' ^( O( `9 w8 O
上面代码中加上这一句
% v: h: u, L( O, R" i/ F' M%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1, ));$ M' G% b; I0 B9 P1 @
测试同样的文件,结果如下 * H; t$ J8 m: s6 O
![]()
4 E2 _3 }( e9 M, m/ T对比可以看到,PHAT加权的方法性能更好
7 m; d3 V2 z: ?) V7 Q参考
" O+ Y# [0 _1 a% W1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》 3 \" h0 I; M1 T1 p2 `' Y
2. 《传感器阵列波束优化设计与应用》* V+ D: I- Y2 M/ O2 G
————————————————
. E/ ^, n1 e4 q% W }版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
# J: S' @& N! i, E, z3 |: M原文链接:https://blog.csdn.net/u010592995/article/details/81586504
7 s( A7 }& U9 ~1 N) d- W L/ [. c6 |/ z# H+ l! G
4 C+ c, S! U( U# ~6 n8 @& {
S9 V& E7 [/ l8 B3 V5 e2 a5 a8 D8 b' O0 ~- o
! z% L8 S. D: b* {# B
|