QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4579|回复: 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! H" {$ D1 T4 T
      声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),
    * S9 K+ w" s0 H, ~
    8 \4 y2 a$ Z" _- O  {  V* p  a; Usteered-response power
    ; l7 ~# P4 ^- l0 O  可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。 / V4 A  _6 u% Q& K
      上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。
    2 G' b0 _; ?- [9 X" q  其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现
    $ f, p0 A8 o4 w6 n& ~
    - d: g/ ~0 Y: h% h- V+ x* X# }频域宽带波束形成
    , t# I% i' a9 B4 a' W3 l  频域宽带波束形成可以归类为DFT波束形成器,结构如下图 0 D+ ^8 {; W6 {5 n
    9 l9 u! o7 ?  z' f; D$ c% z# D5 |' e
    , \1 v% Y% U& T

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

    频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT
    * p7 G9 b4 D& O7 w( b8 W/ Q* X4 B代码实现如下


    ! G& v9 `. \# knction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle)
    # O. Z! I1 |( p1 k- y! k" f2 c%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    , O5 G4 o( ]0 T1 \& K  }9 }, `%frequency-domain delay-sum beamformer using circular array# \) {9 l9 `- X* D7 q
    %   6 z9 o! H' i( S( S
    %      input :
    ! K' `& Y# l+ _4 |%          x : input signal ,samples * channel
    * Q$ H; F# B' \1 o! }%          fs: sample rate7 W  x* ^9 m9 \: s; J
    %          N : fft length,frequency bin number+ m' J6 e1 L- o# ^
    %frameLength : frame length,usually same as N
    / R) E. K9 U7 L5 @  Z" l%        inc : step increment3 M, `0 ]  Q8 ^9 N+ k6 j
    %          r : array element radius
    ( e& n+ M, e! b3 Y%      angle : incident angle
    7 J/ v& |6 k  @. h%  f& R8 @$ V( l$ i7 h+ x: h
    %     output :
    ) c6 B6 n3 c! G/ x9 t9 i%         DS : delay-sum output4 b/ O  Z$ g! t5 r) q
    %         x1 : presteered signal,same size as x8 u& N& J5 o+ V. O8 Y$ t" F. w
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    . M9 D6 x4 U0 ?! H0 l/ P
    : {/ j) z% Q9 s: \2 Y  [/ A" Cc = 340;0 o" Q3 m  t+ V$ m% G% u& k" X
    Nele = size(x,2);
    - [( p" V1 n6 u! P$ E7 A) nomega = zeros(frameLength,1);: t! U8 _! c5 E; P( J
    H = ones(N/2+1,Nele);
    & y0 [8 h* w, a1 @5 q& m! F/ L6 E! o; W4 N7 n
    theta = 90*pi/180; %固定一个俯仰角
    ( q0 U4 |2 i7 z) [# Vgamma = [30 90 150 210 270 330]*pi/180;%麦克风位置
    8 [) H5 o9 C; G; {" `tao = r*sin(theta)*cos(angle(1)-gamma)/c;     %方位角 0 < angle <360) }* K8 C; Y' }6 J8 ^
    yds = zeros(length(x(:,1)),1);! ?+ N# z  ^. g' ^+ ]( i& R3 @' ]
    x1 = zeros(size(x));
    8 S' W" f; d) r  N) F) s
    2 G# n( J/ B6 Z! l% D, [, R* ]. ?" z% frequency bin weights
      [1 Y; O0 h0 h$ Q/ l& D7 y# @% for k = 2:1:N/2+1
    7 e* ~- `+ a9 ]) X" Ufor k = 1:1:5000*N/fs0 R3 ]) o8 _4 V6 G! I
        omega(k) = 2*pi*(k-1)*fs/N;   
    - B/ F+ P' n1 B' N    % steering vector5 _$ z2 e( R$ P
        H(k, = exp(-1j*omega(k)*tao);
    / O+ J4 g0 T% z5 s5 @$ Gend
    5 q$ W- f# c. ~0 \
    , y1 L. _2 R- B* lfor i = 1:inc:length(x(:,1))-frameLength
    + d0 S$ x# g) H2 D5 b' E5 {4 u8 A1 Z1 Z; w# W- j  V0 b% d
        d = fft(bsxfun(@times, x(i:i+frameLength-1,,hamming(frameLength)));
    * d6 L* W( k+ x9 `+ z
    ' E. D4 x6 o/ U    x_fft=bsxfun(@times, d(1:N/2+1,,H);
    , L" E8 f# P, Y# H
    4 E. r( s- `* ]    % phase transformed9 _& p1 l2 n; J7 I" f
        %x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,));
    6 `8 I( Q7 W  {. B* K1 k: G- t    yf = sum(x_fft,2);# g, ~' y8 N! k' r
        Cf = [yf;conj(flipud(yf(2:N/2)))];
    : }- k) W& L% H7 k4 A1 D* b8 S1 i0 H; o$ L$ m) L
        % 恢复延时累加的信号# }# P/ Z, N+ z$ j4 W* |
        yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));
    , Y  A6 H  G5 W9 P: l; a/ c# V
    " D5 p& f7 R7 ^    % 恢复各路对齐后的信号
    7 C  b. |- s7 C: Q: ?    xf  = [x_fft;conj(flipud(x_fft(2:N/2,))];
    9 z* s, J6 d" r/ _) T3 ~    x1(i:i+frameLength-1, = x1(i:i+frameLength-1,+(ifft(xf));
    * S2 g0 E) z  m( e/ q2 I6 Yend
    , Q! Y& k. d0 e, g0 `1 a8 dDS = yds/Nele;  5 {8 s# U- \: d/ |9 N. n6 T

    4 S4 X  P8 S8 C1 P6 O# hend+ o2 w! L2 |1 }$ \5 M* i- X
    然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下% p" B# q2 {+ E8 J6 I7 ]

    6 f7 M7 X3 Z5 V4 t9 i5 h%% SRP Estimate of Direction of Arrival at Microphone Array
    9 F/ ^- n) o2 Q) G* u) m% Frequency-domain delay-and-sum test
    * U; d4 v, y% _4 ~- r( R* k%  & y* j1 u: m" }$ v* H
    %%
    & r: Z1 A1 o6 |! S7 c, t% m
    & _6 M8 c7 P# B  }2 H8 y% x = filter(Num,1,x0);& k2 o5 k5 p6 f7 `
    c = 340.0;! [; ?. q. F% V' l3 H/ f; o
    ! ~8 v0 P- S! k4 ~7 C% w
    % XMOS circular microphone array radius
    7 R/ u2 R0 V# p/ a5 rd = 0.0420;' G' O/ A# [/ q. s) j
    % more test audio file in ../../TestAudio/ folder" l& A# Y2 N/ `( _' A+ D! V- A
    path = '../../TestAudio/XMOS/room_mic5-2/';/ |5 L1 z; w, O7 `; Y
    [s1,fs] = audioread([path,'音轨-2.wav']);4 t% N( C5 K- u' k
    s2 = audioread([path,'音轨-3.wav']);  E/ u  |6 h0 e; @' O
    s3 = audioread([path,'音轨-4.wav']);6 S  C5 h: Q& _2 o" a% ~8 C; K
    s4 = audioread([path,'音轨-5.wav']);; t6 u/ ^/ o3 c0 g% p
    s5 = audioread([path,'音轨-6.wav']);
    0 |: a- T, |3 h. Bs6 = audioread([path,'音轨-7.wav']);
    5 c2 ^3 L5 o: k- e; rsignal = [s1,s2,s3,s4,s5,s6];
    & E9 ]+ U0 S5 n9 A5 r) c6 oM = size(signal,2);6 F5 }) I8 ~1 M: K! k3 j
    %%
      f* I1 J9 w, {$ Mt = 0;' O9 Q! q  ~2 L

    & x3 I7 @" R5 J) Y6 U7 J% minimal searching grid) ?1 _7 v$ s; x% C* B  V5 X
    step = 1;
    ! O' s( U2 N) {  x% Q3 O* A4 a
      R5 c/ N0 g$ O' ]! j: [P = zeros(1,length(0:step:360-step));
    / a+ `, }( i' v: Rtic8 v. e* L; e* ^+ `. p3 i' s
    h = waitbar(0,'Please wait...');
    # L& b* o' o' x4 @1 a8 J- kfor i = 0:step:360-step
    4 n: v4 c1 A) X& S! A    % Delay-and-sum beamforming
    1 Y, e& s+ J" ]7 X2 N5 f    [ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);+ d" B# k' {* }5 p% T7 X. G" @
        t = t+1;
    3 P7 R, O: N5 e% L) g3 y/ U, l    %beamformed output energy  H: S3 o2 o5 A$ i
        P(t) = DS'*DS;
    2 q2 Y  v( X! V    waitbar(i / length(step:360-step))0 k1 J# l  |7 b: X! w# \0 d) N
    end
    * Q2 z8 R9 Q9 j3 x0 ?toc
    4 z) R- m2 u4 F9 R) @6 L* s  G4 [( Iclose(h)   h1 a# u+ g9 d' l9 a+ L: i1 y& h
    [m,index] = max(P);1 X0 O) }! g# m' s& p
    figure,plot(0:step:360-step,P/max(P))6 N# Q6 \7 U3 F
    ang = (index)*step
    $ f9 k, ~6 O9 M4 N2 n: q$ K( l
    " P) D+ m! S, h! d+ _8 ]1 a2 [0 Y" V程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下
    $ x* U; w9 x- ?+ P7 |1 H1 t( b6 [
    * m) _4 |+ |( a  T5 `

    结果与预期相同

    PHAT加权

      与GCC-PHAT方法相同,这里也可以对幅度做归一化,只保留相位信息,使得到的峰值更明显,提高在噪声及混响环境下的性能 + A: d) q' Q2 D/ p6 Z" B" V8 \
      上面代码中加上这一句


    1 h5 U; q  W( H1 l# K; ~%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,));
    ! x, _' d3 _+ k- p! H9 s测试同样的文件,结果如下
    * u5 Q& [# `  P7 R  F8 x0 I( g) u
    " X/ d7 {2 Y) }. O对比可以看到,PHAT加权的方法性能更好! n' z+ s3 B* b! r' m: I' f9 o) y
    参考! ]9 ?7 a7 M3 s% @! c9 C# e
    1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》
    5 f( [. s, V( Q3 O+ x2. 《传感器阵列波束优化设计与应用》
    $ k6 |. g. {5 `6 _  e6 ?9 b————————————————
    ; f. p2 H4 E6 V7 A% x. g版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。3 o/ A2 h9 U$ \7 Z
    原文链接:https://blog.csdn.net/u010592995/article/details/81586504
    2 D3 b) ]8 A, g' f, ]7 @4 C, u2 m9 U8 K7 V
    " a% b; _/ e' }) o: ?( }

      h4 }$ U! N' S: S
    0 ?# l% k/ |3 E6 ~
    2 `; `1 ~5 ^8 b: n% X
    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-7-25 08:14 , Processed in 0.574089 second(s), 50 queries .

    回顶部