QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4502|回复: 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
    ; e2 S" T" {8 J& i  声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),* b* t& ?% f, d3 U1 q

    0 w: J8 W* s- `: r0 osteered-response power* j3 F& d3 L) J1 P
      可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。 + {5 D8 j8 [9 F, H) c0 x2 m
      上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。
    5 Q# D2 z8 u. {  I/ X  其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现
    9 ^& w( j1 a+ F) Q1 r
    , F/ {5 ^2 t2 R3 f( |频域宽带波束形成: N* {4 A5 N# Y" b  u
      频域宽带波束形成可以归类为DFT波束形成器,结构如下图 $ _9 P" o! y  S

    - r7 Y$ |8 D) v3 N/ s
    8 R3 y/ N8 V9 |' u$ Y9 H' s

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

    频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT & V, z  _) p6 L: T& Y% W
    代码实现如下

    9 b+ o* y0 x- l" a$ O. T) f
    nction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle)
    0 M! e4 t3 e/ t  M%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%: B+ t6 a) g! E$ F4 V) I$ s: e
    %frequency-domain delay-sum beamformer using circular array2 p4 e, C2 x7 R# R8 |
    %   
    : x: K, W6 u% n3 D%      input :. l8 I$ O& ~6 [) w1 n, J
    %          x : input signal ,samples * channel  `' b* X; F6 ~: {( [2 {* T
    %          fs: sample rate8 {5 x$ u/ Q! m+ w/ e
    %          N : fft length,frequency bin number5 z$ ^5 @. J. E5 U3 I5 Q
    %frameLength : frame length,usually same as N8 c# |( @9 c3 v3 r3 O. v/ d2 n. P
    %        inc : step increment
    $ S9 o+ T* K# h; }/ j+ M6 f%          r : array element radius
    . m3 x; k. t0 G0 r' _  _* v' E" g$ G%      angle : incident angle. L" N  x' X0 i4 A
    %
    7 i* [8 \8 g, n' E( b7 m5 j( ^- B5 ]%     output :
    8 n* W8 R8 n+ R9 R6 j7 i%         DS : delay-sum output
    " o0 U8 z0 @% O# P%         x1 : presteered signal,same size as x* h. A$ S& R% z3 s) \& j, E# y  C
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    ! m4 n/ h. E. U, h6 |4 G% Y' e6 I
    ; G1 o- J* L8 M, y  p1 H6 W- gc = 340;, y( ?3 T1 S! [( X  Q
    Nele = size(x,2);
    ! D) W% q8 ~5 i6 l/ t$ f$ Tomega = zeros(frameLength,1);: ~5 v( W4 B) U& H0 l' s) Z% k- l& i" c
    H = ones(N/2+1,Nele);# g2 g5 e1 B0 |1 j( Y( h: ]5 @$ S. h* F4 g

    . [1 ]0 k1 L) T) w9 @7 l$ L$ `theta = 90*pi/180; %固定一个俯仰角
    ! t2 c9 z* I0 b8 {% E" v0 X$ ~gamma = [30 90 150 210 270 330]*pi/180;%麦克风位置5 J5 |/ d. l# ~. c* K! `( l# G3 p
    tao = r*sin(theta)*cos(angle(1)-gamma)/c;     %方位角 0 < angle <360
    + B+ Y) a. B2 m3 t: g: t! Pyds = zeros(length(x(:,1)),1);
    + \( N! S/ j' k4 I# |x1 = zeros(size(x));1 V* B! h7 T8 |! j2 m, i! ~
    3 X4 G) y4 s2 A1 Q9 [/ `8 d% e& P/ }
    % frequency bin weights
    1 E: O) l9 x6 D4 y. W' ?% for k = 2:1:N/2+1
    0 T. V- _, N) t* N, U4 pfor k = 1:1:5000*N/fs
    ( a- B1 m; D7 f7 z# V- `# s    omega(k) = 2*pi*(k-1)*fs/N;   ' d! x  w: y  ?; W# [2 S% y- S* X
        % steering vector
    / G/ j5 m" p) l/ V$ n! _    H(k, = exp(-1j*omega(k)*tao);
    3 p  U* i6 _# b) t$ y1 Lend
    5 s" N- @3 g" L, v8 F1 U" [3 C2 |* r
    for i = 1:inc:length(x(:,1))-frameLength
    7 e3 ~' ?5 N6 |; c9 l: j- m: {- C5 n
        d = fft(bsxfun(@times, x(i:i+frameLength-1,,hamming(frameLength)));
    0 s1 Y* h" C- `( X  z
    7 @# D; W2 `  y  s& ^8 D, ^! c* C1 F    x_fft=bsxfun(@times, d(1:N/2+1,,H);4 E' T# F) E5 [2 R- T
    $ D3 A0 s) g8 q! s
        % phase transformed, e/ Y1 {; B6 e
        %x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,));
    + v( n7 @1 q' t    yf = sum(x_fft,2);
    7 T/ K* ^6 n0 ]+ D/ x8 z. @    Cf = [yf;conj(flipud(yf(2:N/2)))];1 j- M( k7 d. y$ ?; U1 d
    5 O& D2 J2 l8 U6 ^5 C
        % 恢复延时累加的信号5 H  I( `2 P" W0 [! d
        yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));: {: R) H* ]: N0 ^7 K% s9 H
    ) D: a# O, Q" _6 c, s+ m2 \
        % 恢复各路对齐后的信号" ~( q! V' ?+ |" |
        xf  = [x_fft;conj(flipud(x_fft(2:N/2,))];
    5 V9 _$ X. u; l: M6 ~7 i9 s    x1(i:i+frameLength-1, = x1(i:i+frameLength-1,+(ifft(xf));' D0 p2 I$ R4 N+ {
    end* T5 \4 T: R, c' r# l  [
    DS = yds/Nele;  3 e4 d$ {& l" o. y9 W
    2 Q1 b9 o5 ^4 h$ M1 z- S; V* \
    end3 n0 a8 F/ w% |) X5 z2 d+ S
    然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下
    0 J* U; ?4 F- J/ B  r" v) c" F& s5 S% ^  A
    %% SRP Estimate of Direction of Arrival at Microphone Array0 A* G" N+ }0 {. N  O
    % Frequency-domain delay-and-sum test
    ) ^' c% v% k" I& R% O: `%  & ^7 P* b- M: P/ b7 V5 {
    %%; Z# o; Y# x- M- a+ ]
    / _& N. A) L+ O# [& B
    % x = filter(Num,1,x0);3 a# k+ p+ k* H/ H  W
    c = 340.0;' P7 Y0 M4 s1 S/ a* u8 Y; p

    ! q( y5 m" A/ d* A8 S+ L5 S% XMOS circular microphone array radius
    # g" {' n- H1 x4 Y  od = 0.0420;7 r$ t' j+ Q& a% W0 `# i. w
    % more test audio file in ../../TestAudio/ folder
    : j- k2 ?5 E6 ?2 I9 q' i6 O# hpath = '../../TestAudio/XMOS/room_mic5-2/';, W: q5 L. W3 S- v0 `6 B
    [s1,fs] = audioread([path,'音轨-2.wav']);9 J/ L  W; z* b- G- u# V2 F
    s2 = audioread([path,'音轨-3.wav']);7 B# ~# G; w' S
    s3 = audioread([path,'音轨-4.wav']);' P3 Q% I/ h# _& Y. e3 n4 y( x4 v1 y
    s4 = audioread([path,'音轨-5.wav']);$ M  E8 T1 g/ j9 }& a& |5 d
    s5 = audioread([path,'音轨-6.wav']);
    ' l1 e6 N6 ]  Q. T4 ~4 ?, G9 S0 [s6 = audioread([path,'音轨-7.wav']);
    " h& v* O9 K" l" a# z9 M: q( Vsignal = [s1,s2,s3,s4,s5,s6];
    # }( U, }- Y2 X% `+ I$ }M = size(signal,2);
    1 A4 ^1 p+ w' ~5 O" K%%
    $ \- F6 a% A% W3 Ft = 0;$ e5 E$ v$ v) L' U! Q. ]% H
    ! t! g4 n9 |# b: u5 E
    % minimal searching grid
    7 ^6 X8 u- `! }/ w0 ^4 v% Vstep = 1;- P( \2 w: u9 Y3 h8 H

    - e; v: Z3 u9 y' [- U; z: gP = zeros(1,length(0:step:360-step));. m1 V; G9 o: S" g  `3 B. X" W( ^
    tic3 q* K  E- m) @: b$ L
    h = waitbar(0,'Please wait...');
    6 A) K9 y4 X. R0 `+ _* e. jfor i = 0:step:360-step
    $ k& ^' B$ L" w0 \2 H* f1 t    % Delay-and-sum beamforming
    " Y# s9 v3 ^/ X+ u4 d+ D" m    [ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);
    ; p+ F6 d$ b. g5 C  j6 ^    t = t+1;8 O0 _$ C  L! ]% a3 S! O' \+ S2 h
        %beamformed output energy" w- @! |/ c1 W
        P(t) = DS'*DS;4 Y* |9 e  U: c
        waitbar(i / length(step:360-step))' Q, l: f  v' C9 M! n! U* ?
    end. f8 x2 p, ~. H. Y! C
    toc' _2 z+ X" f" x. J" u% J/ w
    close(h) ! `' s+ R7 |! n; R" i+ a( F
    [m,index] = max(P);
    2 b8 o) M) z. p/ t+ i1 H! u7 Gfigure,plot(0:step:360-step,P/max(P))8 E3 R& c& ~0 r& g' e
    ang = (index)*step$ @  r( ?0 d7 p3 N4 y* E
    8 t- @* _( f2 U( ?* s
    程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下8 ?. A- y* w' ^- M! z# d2 e

    + @6 j- L; f0 K1 X0 n

    结果与预期相同

    PHAT加权

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


    ' Q: Z. U4 z9 C8 s; e& c%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,));
    6 |$ X8 i7 O; }测试同样的文件,结果如下   B: p& T- Z9 p0 l: n

    5 @  v" E/ G% L! X( R" c对比可以看到,PHAT加权的方法性能更好
    8 b: H4 Q( A  A4 U9 c参考
    - p% F) \2 E$ C% D4 H1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》
    1 Z( M3 y$ R1 K/ n* _9 k4 a2. 《传感器阵列波束优化设计与应用》
    9 `4 w+ y4 e5 U+ r1 a( i/ `) G————————————————2 C/ X3 i$ u: U+ q/ y' O
    版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。4 ?) j  ?$ T/ L4 q, b5 ?; G! L
    原文链接:https://blog.csdn.net/u010592995/article/details/81586504
    7 ^$ K  q4 a# L; D: c+ C3 |5 c9 x" [- Q
    7 v# H: T, g- F, y5 {/ r
    0 Z+ X9 T2 _" C( K* a5 o
    4 b0 c% H# p; `, ^* C0 O2 {
    * C( ]: _3 h. \' o$ e: r: }
    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 09:39 , Processed in 0.348932 second(s), 50 queries .

    回顶部