QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4498|回复: 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
    5 ?9 J# G. R* Y# _+ s% x' b% j* \  声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),
    ! v3 X8 D7 C# k4 A) ^7 ], A6 t
    & A. B5 j/ \9 E/ Lsteered-response power
    $ J- U+ v4 O( D) C0 e, L( u: {6 ]  可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。 ) f( x+ l( J  g" N( |
      上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。 , W* ~# F  T) P! _
      其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现: e/ F! B6 W) k1 ^9 f' {
    ; N8 g% O4 F& G, f
    频域宽带波束形成
    ; q- Y; O& v9 i. L* I5 S  频域宽带波束形成可以归类为DFT波束形成器,结构如下图
      y0 h' a* K% |# k. s! r3 D3 o
    5 _7 }$ H6 ^. e0 O* ?7 b8 L  l9 b) z- Y

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

    频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT
    7 m$ s  J& m+ S8 q代码实现如下


    / z1 d% p! {  a: d  C4 c( gnction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle)/ N6 V* k' ^/ ^) P
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    6 C0 Z9 P5 y1 p; A5 P%frequency-domain delay-sum beamformer using circular array9 {' S+ S! |- R1 N  t$ d
    %   
    9 A& Z& X0 i* ]" r%      input :, }9 W) O  V$ H, Z& Q$ i' [
    %          x : input signal ,samples * channel  ~  v& y4 R3 s
    %          fs: sample rate8 X+ i& A. x: k/ j) A: R0 P
    %          N : fft length,frequency bin number
    2 `. Z- F8 ?& T! I2 b3 E) c0 D4 f%frameLength : frame length,usually same as N
    1 S+ r  k2 {# a# i" p%        inc : step increment+ q6 Q# o4 }: g( O% {3 l
    %          r : array element radius
    8 Z8 D1 r7 w# c+ t0 F%      angle : incident angle
    ; ^) g0 `% A6 P; }$ V9 B%
    ' J7 O4 M! H0 A& w+ k%     output :
    6 p( i) b+ ~: l2 {3 R5 c* w%         DS : delay-sum output3 d2 \% m9 M* x
    %         x1 : presteered signal,same size as x
    # X' C' B8 Y; k) A* w7 Z0 A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    , n4 {) q1 m9 q( M6 c1 \6 Y7 Q  [0 ?5 T
    c = 340;, U  K- q! |% ?
    Nele = size(x,2);6 q9 Y2 g5 y7 }7 w
    omega = zeros(frameLength,1);
    " k: s3 Z* M' [/ x. rH = ones(N/2+1,Nele);9 `# ]0 J6 R/ u( r& |" n. L3 m
    5 c# M' ?7 ^  T! ^8 L+ j+ `
    theta = 90*pi/180; %固定一个俯仰角3 O+ }* n! m+ B: p" y6 b8 x& F
    gamma = [30 90 150 210 270 330]*pi/180;%麦克风位置& A. d/ {) o, V; x0 {. X5 G
    tao = r*sin(theta)*cos(angle(1)-gamma)/c;     %方位角 0 < angle <360# K9 X2 g" [( }( U
    yds = zeros(length(x(:,1)),1);
    # D' X' Z% l. ^: ^4 M0 ~& Hx1 = zeros(size(x));
    $ q8 Y2 \( d% y/ r! p9 J$ k: f$ E# }) l' n: k/ X$ e
    % frequency bin weights$ @! |$ R8 P3 A* d* j7 p" z. q
    % for k = 2:1:N/2+1
    ( N4 ^' l# U5 ^' Y$ u% {2 {for k = 1:1:5000*N/fs
    * `( W  @! `( Z& B( i5 I7 C    omega(k) = 2*pi*(k-1)*fs/N;   
    & Z% ?6 p+ f( |8 R    % steering vector
    ; E# Y1 Z% }* x$ z    H(k, = exp(-1j*omega(k)*tao);& h7 `6 v+ G( ~0 R
    end
    ' |, \# p4 q$ E' \3 _$ K
    0 B8 c6 Q& z. Y% \: o* E! d! ffor i = 1:inc:length(x(:,1))-frameLength
    - }5 C" s' k+ Y0 J3 ~) H) a! C5 O
        d = fft(bsxfun(@times, x(i:i+frameLength-1,,hamming(frameLength)));' }2 C- [0 k0 G; }/ D
    8 W4 K; }4 k; \4 o/ b+ t
        x_fft=bsxfun(@times, d(1:N/2+1,,H);
    ; q" A0 I2 x5 F, U4 h( @
    + ^! V" A/ `) h1 h2 j2 p6 O) V    % phase transformed  E) H/ V' R5 d6 c
        %x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,));9 m" f$ m5 ?" Q9 P; ?
        yf = sum(x_fft,2);: }- z9 M) H; L) P
        Cf = [yf;conj(flipud(yf(2:N/2)))];$ S. P" j% @- q

    . ^9 U; A- }! |6 ]6 X    % 恢复延时累加的信号
    ( W9 Q- ]: P% @& r! {    yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));6 D* t* h* N. C4 z3 l) `7 i
    : \% _4 t# z, T' u4 K9 V
        % 恢复各路对齐后的信号
    ; M7 p: v$ O- J' |( e5 V& w# Z" S    xf  = [x_fft;conj(flipud(x_fft(2:N/2,))];
    3 k3 k3 I% q! a1 l' x    x1(i:i+frameLength-1, = x1(i:i+frameLength-1,+(ifft(xf));! j$ o% F4 _* k
    end
    6 U" x' b1 {! N8 A+ ?DS = yds/Nele;  
      u* j' _6 ]- S" O% I2 C% k1 \2 [( k7 r: Q# S1 U$ s& @! {
    end
    & _9 b' R$ K8 E2 z/ H# R3 ]然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下
    4 Y/ `' q* y0 N7 n
    + w: o/ ^9 Y. H& w+ O9 i%% SRP Estimate of Direction of Arrival at Microphone Array
    + i  T) W- l- K& B* Y% Frequency-domain delay-and-sum test
    # d' Y/ ^) z7 w& `0 |+ I6 p%  
    2 R2 d' Z6 T9 Q+ `2 J4 F7 f' o%%
    : i+ L* y6 e5 y4 c  |; V& K& H3 a9 ?  b! k% L  \
    % x = filter(Num,1,x0);
    1 x& O- F( Y; l8 y+ M+ j4 Mc = 340.0;
    ' o3 w$ g+ h5 a8 W  d8 o/ I
    ; z2 n0 Q* `: L# [4 h% XMOS circular microphone array radius% S1 O* Z, s+ c7 N  b- J. r! D1 _
    d = 0.0420;% V. ]$ d2 c( a4 {7 V
    % more test audio file in ../../TestAudio/ folder
    . a! [; B+ Q8 upath = '../../TestAudio/XMOS/room_mic5-2/';
    - O2 j+ n; [0 V$ Z( E" o[s1,fs] = audioread([path,'音轨-2.wav']);
      n' k/ N- o* R" }- ls2 = audioread([path,'音轨-3.wav']);( z# s4 V" `0 n: e9 S& v
    s3 = audioread([path,'音轨-4.wav']);
    $ g6 @3 l" }2 m! Is4 = audioread([path,'音轨-5.wav']);9 F0 a2 X2 @; F5 ?$ o5 @9 [+ m
    s5 = audioread([path,'音轨-6.wav']);
    " u( P4 Z: p/ Q" C( _s6 = audioread([path,'音轨-7.wav']);
    2 p' F  |+ {) L: p/ w& j! B5 n5 hsignal = [s1,s2,s3,s4,s5,s6];% h+ s' i/ `1 H; _" x: q  ?
    M = size(signal,2);! C) u* ]$ n+ \6 z; ]
    %%, O& j+ v, G3 p
    t = 0;. _4 r3 U6 \/ J. Y1 I+ o

    # @- q" S! }1 R+ i% H# w  N9 D% minimal searching grid
    ; B. a8 E) L- B) Gstep = 1;
    ! J. `& y5 t8 W1 }! O7 k/ a/ `! u
    & A. _! h" r& o( sP = zeros(1,length(0:step:360-step));
    ; k) e7 x$ [9 H' A: I+ Etic
    - G! S) B) Y& ?h = waitbar(0,'Please wait...');
    7 L! l4 g  A) s3 ^for i = 0:step:360-step6 B2 J: e, U' o* o
        % Delay-and-sum beamforming7 u" D7 d. N4 i1 H/ D7 Y
        [ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);
    ; Q, v  s: c& R; \8 c7 `7 @    t = t+1;  j7 e8 Z+ m6 v, d! f
        %beamformed output energy
    ) G3 r7 o& {# [7 `    P(t) = DS'*DS;
    8 w- D# I9 m+ d, {9 ~    waitbar(i / length(step:360-step))5 c* d( `7 V# k4 k; S' o" q) k/ N
    end
    7 d' C! `" M$ c; J* q" x; h4 s! {# f; Ftoc5 j( ]3 [- z# B, w- Z4 _
    close(h)
    " E5 H7 k' i) i4 h" U* F3 H; w" |1 L[m,index] = max(P);
    / c1 O" S" _) U# x, ffigure,plot(0:step:360-step,P/max(P))  `: _: A1 e- G% g8 v" [
    ang = (index)*step- W: _& a4 t, H* v

    4 X: b: O( q2 B# E程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下
    ) j# f. k, t) A( q7 C
    ( b6 G9 k  r- y7 i8 u+ v3 L0 J

    结果与预期相同

    PHAT加权

      与GCC-PHAT方法相同,这里也可以对幅度做归一化,只保留相位信息,使得到的峰值更明显,提高在噪声及混响环境下的性能
    % C8 n8 P0 i8 j- k) y  上面代码中加上这一句

    1 T! ~/ b0 D9 ~+ Q
    %x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,));
    * [( V% x* r3 K& ^* Q# U5 z测试同样的文件,结果如下
    + m) [$ d8 D5 e3 O; ?
    * k2 S6 ?# P9 h' N: F  A对比可以看到,PHAT加权的方法性能更好5 e; l! n8 |, x- E
    参考
    8 m2 L! n7 \& A1 ^: K5 h; [1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》
    * u, h$ E5 I# |5 w% a2. 《传感器阵列波束优化设计与应用》0 [0 Z) x" _+ Y9 P0 f9 B; Q
    ————————————————* J7 T3 z& p+ x& j$ N/ u4 A$ `( c
    版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。, y+ O; t5 Y! x
    原文链接:https://blog.csdn.net/u010592995/article/details/81586504
    ) ], P& D2 p1 W5 h8 s* r. P
    , V0 x+ p& C: ~' p1 p1 r: I! G0 g! c1 l4 i$ M

    2 _0 n4 m" k5 C- e  }5 c
    % M$ T- }% Z6 n: \# J% \9 \- v
    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-4-21 04:29 , Processed in 0.422453 second(s), 51 queries .

    回顶部