QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4610|回复: 0
打印 上一主题 下一主题

麦克风阵列声源定位 SRP-PHAT(二)

[复制链接]
字体大小: 正常 放大
浅夏110 实名认证       

542

主题

15

听众

1万

积分

  • TA的每日心情
    开心
    2020-11-14 17:15
  • 签到天数: 74 天

    [LV.6]常住居民II

    邮箱绑定达人

    群组2019美赛冲刺课程

    群组站长地区赛培训

    群组2019考研数学 桃子老师

    群组2018教师培训(呼伦贝

    群组2019考研数学 站长系列

    跳转到指定楼层
    1#
    发表于 2020-5-15 15:04 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta |邮箱已经成功绑定
    DOA
      q( i9 G/ u0 B9 ~, |8 t: z  声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),
    ' w* T) e& g; r. d% u$ J: P; @! G( @  C  }, j! I! N7 H
    steered-response power, r! h! e1 k8 W" \1 ~
      可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。 9 T1 M  _) _0 o  W+ ~( t
      上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。 % c$ g  }) `: s) M) T  u4 P
      其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现! P2 r+ @9 M) k% N% @( ]

    ) z/ r# s; ^! W频域宽带波束形成
    $ R6 J1 Y" T' _; ]- [2 O4 X  频域宽带波束形成可以归类为DFT波束形成器,结构如下图
    . Y( G3 {) s( s& N' Z3 O) J
    # o0 {4 @/ Z# n
    ! w% l. W* e- W5 Y: X

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

    频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT * }& W& t: u. o( @" y( Q
    代码实现如下

    . v( s9 U+ n" o/ c% j. w5 b4 f2 C
    nction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle)
    % G" G3 S1 s) K9 ]%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    7 q  ^1 V; x$ I6 m' @) K+ R%frequency-domain delay-sum beamformer using circular array+ s. V" x! g) w: B
    %   - V, J8 i" w. n6 u' {
    %      input :
    ; Q; n/ K5 M+ O: g: j%          x : input signal ,samples * channel
    3 Y+ n( n% o  m& t: D- ~  Q- [%          fs: sample rate
    ) k% B, _1 \9 @# T3 d%          N : fft length,frequency bin number* p5 S0 `2 m- j% a/ D6 K# e1 x
    %frameLength : frame length,usually same as N
    ( I$ c5 ]+ v$ x" V1 W: Y+ m%        inc : step increment/ s; Q& ?) B4 _$ V$ Y& a2 F% k
    %          r : array element radius* |( N6 Z3 ?* v. k. Q
    %      angle : incident angle
    ( u6 [3 V1 m  Z/ D! B%+ [% `' O8 z2 Y+ M8 Z! q
    %     output :
    9 G& h1 r' s; g$ h- e* @%         DS : delay-sum output
    3 W8 U5 B; `& N! ~2 W. P# A3 @( o5 M%         x1 : presteered signal,same size as x/ y  P, W" p: I! P
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    * _0 l+ `. X2 P2 ^) W. u
    * i; i. Y2 Q, J2 x& ^c = 340;
    ' A8 j' L/ x- J/ p+ H2 w3 MNele = size(x,2);
    0 F  Y4 E# r* ?5 F* z9 a6 V2 yomega = zeros(frameLength,1);6 F# P/ w  e0 l; L
    H = ones(N/2+1,Nele);
    2 f( w+ B! A% p/ F# I9 u+ j" O" h. S8 O: m0 a5 P3 [( _! `
    theta = 90*pi/180; %固定一个俯仰角. y0 p0 O$ z. x+ P7 Y4 d$ E
    gamma = [30 90 150 210 270 330]*pi/180;%麦克风位置
    ) e8 x" K- V5 e+ b5 g, jtao = r*sin(theta)*cos(angle(1)-gamma)/c;     %方位角 0 < angle <3602 Q5 y4 h* c7 n; \9 @! B& C* Q' n
    yds = zeros(length(x(:,1)),1);" J6 ?: }$ w" d9 a* G% t' z) q
    x1 = zeros(size(x));
    # k' W" d4 k& ~1 }$ L, ]# N/ C0 m
    5 B" K* ]4 ^- w# A- M5 F% frequency bin weights, _  ]* z. G( x& b0 g' A
    % for k = 2:1:N/2+1
    , B3 `3 `9 ^6 `1 p) kfor k = 1:1:5000*N/fs9 O- `8 l7 V8 H) m
        omega(k) = 2*pi*(k-1)*fs/N;   
    / Q  F; C! w% p) G% C$ C: d    % steering vector
    2 w3 S6 \& R, S% n" f7 V0 n    H(k, = exp(-1j*omega(k)*tao);
    0 o! w2 O7 i; y& V2 bend/ a6 V$ d3 O$ X) \* ]

    : A" C; t4 ~3 }+ [+ K1 ]for i = 1:inc:length(x(:,1))-frameLength
    ( [& n0 |" H' q" ~/ J5 I
    " T+ {9 l, l6 q" f# G, g    d = fft(bsxfun(@times, x(i:i+frameLength-1,,hamming(frameLength)));
    ' G" t0 [( Y& x% @
    5 ]4 w8 E/ G; _& f& P    x_fft=bsxfun(@times, d(1:N/2+1,,H);
    ; g6 w" y, m: L7 C) P3 v2 a& d5 M1 i+ d; M
        % phase transformed
      V! u! t. U( d4 T; Z- A1 X    %x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,));
    2 j& u* }+ W$ E. w% N1 @( c    yf = sum(x_fft,2);
    ! o- }% z- x- o9 p7 n% F+ a    Cf = [yf;conj(flipud(yf(2:N/2)))];
    / F; k! g; }6 k9 C! w3 f+ {* V" W- [5 o  c4 O, m, A# [6 Y4 y! a: a
        % 恢复延时累加的信号
    9 ^% y% d6 V0 m1 x    yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));
    0 k3 N& U2 ?& O: z8 R1 {
    ' C. K, L3 A8 g    % 恢复各路对齐后的信号
    ) O+ C, \: |4 k" K    xf  = [x_fft;conj(flipud(x_fft(2:N/2,))];0 S, A) h1 |$ d/ R" L* I
        x1(i:i+frameLength-1, = x1(i:i+frameLength-1,+(ifft(xf));: [5 b1 y9 x7 X( _! b
    end7 P, |) b" l2 ^8 ^% y4 K8 Z" R- P
    DS = yds/Nele;  
    8 x  C: X9 }- ]8 i% \; e# V
    ( C+ }. \, j) V& J# oend* M* g; G* x+ @5 b
    然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下+ b; r# P/ v& D7 r( S( G3 f
    4 h( y$ w$ N- p8 K0 ?/ o$ Y, j
    %% SRP Estimate of Direction of Arrival at Microphone Array! i# X$ B) q6 A; M3 a% G5 H
    % Frequency-domain delay-and-sum test: i+ @" D+ |4 g( A0 R. S; X0 N
    %  8 V0 L. ]* F7 v  h6 ]0 v, Y
    %%
    5 i) s; \5 o: z7 C9 H! f: Z6 s) |4 ^3 Z2 w) j4 S) V
    % x = filter(Num,1,x0);
    2 T* Q) i9 r% \" ec = 340.0;, S* K( a* ?$ t& J( V
    , \6 P" i# B: m+ p8 W4 e4 N
    % XMOS circular microphone array radius+ H% G3 g0 S6 u4 x7 U
    d = 0.0420;8 h( y9 l/ {, d& y% p) }
    % more test audio file in ../../TestAudio/ folder' n. U3 }+ P; t5 Y0 Q7 \$ |8 y
    path = '../../TestAudio/XMOS/room_mic5-2/';
    & d3 E# r7 P4 T+ m[s1,fs] = audioread([path,'音轨-2.wav']);
    & W' d; g" h7 Xs2 = audioread([path,'音轨-3.wav']);1 z4 B  Z- u3 ^+ a0 l
    s3 = audioread([path,'音轨-4.wav']);5 x( f0 P; t( q* B' m
    s4 = audioread([path,'音轨-5.wav']);
    & m; o' S1 i7 os5 = audioread([path,'音轨-6.wav']);
    # u0 G0 L+ e  A3 t1 q  F: vs6 = audioread([path,'音轨-7.wav']);
    7 K/ m! }  E9 N( K8 I% ]signal = [s1,s2,s3,s4,s5,s6];
    0 i5 b* u: F. ]9 `* rM = size(signal,2);: K5 Z# o8 D5 K4 J4 h: h. e# O  Z
    %%& j( }  \' _5 l- C6 [: O9 _; I
    t = 0;1 A' v2 ]6 M% W/ M( c

    3 q$ K, p4 S' k% minimal searching grid! i: h+ k0 h, B! ~9 Y1 b  F; z% E
    step = 1;
    1 E0 s! B/ T. C  u0 w; A8 I, i5 k+ b( B) o, e) @4 U
    P = zeros(1,length(0:step:360-step));
    ( \" n7 {+ q( l' N: f' f1 utic2 e, F- F! t: E. }& R
    h = waitbar(0,'Please wait...');1 k9 K# o1 S5 t! Y, h' ~1 \
    for i = 0:step:360-step; h1 p+ j8 ?  K" `  \5 {
        % Delay-and-sum beamforming! I4 L0 i6 G1 `: @
        [ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);0 t' n) L) o* l$ J3 p6 `
        t = t+1;
    $ G6 Y0 b" D5 i+ z3 x    %beamformed output energy
      B/ U5 e" w; D; n    P(t) = DS'*DS;
    : u7 \* e3 A7 ?) q8 h# U    waitbar(i / length(step:360-step))  r/ F& S7 |; x: F# ?
    end
    6 x6 w9 r1 s2 O* Q+ n. ]toc" O# X1 ]3 b" q4 j
    close(h)
    : a3 Z% E2 j2 ]# q. t6 T6 [[m,index] = max(P);( b- u* E6 |! L: Y9 p$ A
    figure,plot(0:step:360-step,P/max(P))0 p# c9 ]: j+ F" O  b$ r7 n
    ang = (index)*step) f3 S' T- H! {, |. |

    ) `; C4 R9 L# U- Q" l+ q: L' R程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下
    " m2 S9 ]# k( u. H  b  @) f7 G. H) w, [! ^- u: `

    结果与预期相同

    PHAT加权

      与GCC-PHAT方法相同,这里也可以对幅度做归一化,只保留相位信息,使得到的峰值更明显,提高在噪声及混响环境下的性能
    ) V, x& n. D9 z8 H$ z1 N  上面代码中加上这一句

    : N7 N0 F/ e5 D( ?! e7 w! _2 ^
    %x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,));( U5 D4 |6 a: s
    测试同样的文件,结果如下 8 G" {+ _/ x0 ~

    6 u4 d' n9 s- |3 z对比可以看到,PHAT加权的方法性能更好
    $ v/ `1 q- W1 Q. j+ P6 I" o9 {6 r参考
    ) f! q& f* [% s0 J1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》 5 R# z# R2 }8 ^5 `' P
    2. 《传感器阵列波束优化设计与应用》* b8 I# K' |& ?% P; }- B
    ————————————————
    9 R' O- z- e" f# y% Q- I; Q0 v2 j版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    9 D/ F7 S, o# N* |; `原文链接:https://blog.csdn.net/u010592995/article/details/81586504
    6 y4 j9 @, g# B8 d' u' [" o( ^7 V9 h$ k8 S9 I" c$ V3 Z4 \

    / G6 l2 a3 c" L. E
    7 G; o7 [8 ^8 V. B6 }: R; p/ c
    ! s% O+ V& o$ s! i+ s" s% M
    ( ]$ l" u: x  u& A4 T- Z
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-9-8 22:39 , Processed in 1.197746 second(s), 51 queries .

    回顶部