QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4494|回复: 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 |邮箱已经成功绑定
    DOA0 k0 o% Z/ H  a% X9 r; I# N/ L' r
      声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),
    5 c6 P' C, }: T. B
    % P2 A" L, b9 ]  C% U7 zsteered-response power2 z$ n' U% R# l2 ~0 `4 L0 z
      可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。 # G8 v! E) I: x& X
      上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。 . Q% o2 C) h+ [* G/ u+ a( _
      其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现
    " M, w- z% g4 q  X2 H# \, R: v: J1 K
    频域宽带波束形成
    . F$ r/ W& U7 ^# I  e5 I" s, }  频域宽带波束形成可以归类为DFT波束形成器,结构如下图 9 h$ W, U" _8 Y2 ]" `, V
    ' s7 \  ~. u$ a) Z9 {: [; P$ |
    # H4 _* |: ^/ x1 ~% X+ [# \# X

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

    频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT " O4 m- c/ k9 z7 l6 J: q  x% K
    代码实现如下

    3 W) `/ i* t+ ^! z
    nction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle)# R+ d) h0 H( K3 c! h) N
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 p: H/ z) A; ~  L
    %frequency-domain delay-sum beamformer using circular array
    ( \% e6 U, i+ a%   
    " F" P8 `/ f3 w( d2 A%      input :
    ! `+ I- {, V. S# ^% ~( m%          x : input signal ,samples * channel
    ) T0 P5 U5 Q. _& l7 Y! I%          fs: sample rate5 N6 s. x) {: B7 T7 _9 J4 W# J
    %          N : fft length,frequency bin number& B5 Y+ E$ [1 J& U) w
    %frameLength : frame length,usually same as N
    : l. V8 {8 T8 q& E: G9 i%        inc : step increment* g4 R/ M- l0 L$ k
    %          r : array element radius  Y" ~1 Y8 F8 l& H/ M' ]) P" K
    %      angle : incident angle
    & V3 P) V4 e& @' E%
    ; q5 X: U; w6 j+ e8 s; e%     output :2 b" B; Q/ S+ [
    %         DS : delay-sum output3 P# u5 N+ t! b0 [7 k
    %         x1 : presteered signal,same size as x
    7 {" t$ m( L! h6 g4 f5 T6 {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%! _3 l% `0 s+ X" @0 b$ w9 k8 p
    7 C( d% v/ l/ k
    c = 340;
    4 K! U+ Y6 u, U' KNele = size(x,2);
    * @# D2 o# t( q6 r: Tomega = zeros(frameLength,1);3 ~) e  X: G( [/ u& L
    H = ones(N/2+1,Nele);7 {; i2 ]5 I( k+ |

    8 L/ |$ [+ n! a# a6 \* J5 E! Rtheta = 90*pi/180; %固定一个俯仰角6 z8 F4 G  M6 L$ X  H  F
    gamma = [30 90 150 210 270 330]*pi/180;%麦克风位置' u: `& P4 a8 ?0 J8 d& D' u
    tao = r*sin(theta)*cos(angle(1)-gamma)/c;     %方位角 0 < angle <3606 g3 i. z. v. q' h4 D6 r3 f+ w6 d
    yds = zeros(length(x(:,1)),1);2 g$ A# O/ \8 g/ m8 H3 Z& g( T0 v
    x1 = zeros(size(x));
    5 B. |. c8 C+ V3 y  I! d* K( w: [9 d8 t1 o. j2 Z' q
    % frequency bin weights5 b' \- \9 x3 L% b5 c: U- M
    % for k = 2:1:N/2+1% N. Q# @- d3 F1 [
    for k = 1:1:5000*N/fs
      a0 S2 e" B8 u' V3 _# e: v( }5 r    omega(k) = 2*pi*(k-1)*fs/N;   1 h' s3 h1 K; `( Q4 V
        % steering vector$ ^2 q" K- w; o3 P3 j! f
        H(k, = exp(-1j*omega(k)*tao);
    ( \) }1 L( ^) H' {* {2 send
    ! \. a# }* ]8 a8 m$ o0 w# e! O9 M1 g& x4 t# r  Y& {! m
    for i = 1:inc:length(x(:,1))-frameLength3 ], A- \$ L1 U( `0 o

    , p, o8 ]# [. R0 k; m# B    d = fft(bsxfun(@times, x(i:i+frameLength-1,,hamming(frameLength)));, F; e, ]7 _, B" B

    $ U* z2 E1 `' L- K( d6 Q; H3 T    x_fft=bsxfun(@times, d(1:N/2+1,,H);
    9 t  |7 v/ e+ m; c. E7 ]& Z; v. v- f$ P* a
        % phase transformed. g2 y; {% Q8 i% h# K  `$ c
        %x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,));& [8 h4 _* f/ p  v; ^4 S7 y
        yf = sum(x_fft,2);
    + ^2 C- ^1 {$ v3 b: y' \    Cf = [yf;conj(flipud(yf(2:N/2)))];2 K: a- M7 U0 E4 O- u( |

    . t, y3 W( ]1 h9 k3 W' G    % 恢复延时累加的信号# Q/ f# f) {, v* L
        yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));% J  X5 \& i1 y* n
    + N/ N+ f8 j, q9 M1 V% B
        % 恢复各路对齐后的信号
    ; L  Q( G( }: L5 i8 I* |# M    xf  = [x_fft;conj(flipud(x_fft(2:N/2,))];7 h, B" m' s0 |
        x1(i:i+frameLength-1, = x1(i:i+frameLength-1,+(ifft(xf));
    1 D; ^- G  ~: Pend
    ' \9 k! d- h( l+ P$ q& _DS = yds/Nele;  4 f/ C: l4 ?3 t3 i

    & l; c) g4 _7 c$ ^end
    6 Y; ?5 D( ^2 q; Z然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下; z2 S: J, Z2 i

    1 l  n* f$ p; ]9 J%% SRP Estimate of Direction of Arrival at Microphone Array
    # I/ F# E  q1 @7 [. r% Frequency-domain delay-and-sum test; u8 M0 t) e' ^- ~! D- E: ?
    %  
    : X2 R3 z; D* Y6 e& K  w%%$ U7 d2 H$ B7 \6 z' b

    1 _! `+ V: l+ d% x = filter(Num,1,x0);
    : }6 K" y4 {$ _* A' t# j' K% fc = 340.0;
    # _$ c! G) C% E1 F( Y" }! m6 o3 _' {& P, u% c  j
    % XMOS circular microphone array radius& X9 _9 M. q* F! ^$ L
    d = 0.0420;
    $ d8 W9 b0 I9 D% }( e5 c6 w% more test audio file in ../../TestAudio/ folder1 n2 l: h  V2 e
    path = '../../TestAudio/XMOS/room_mic5-2/';. V: Y" w8 p1 e+ z  m7 u1 O
    [s1,fs] = audioread([path,'音轨-2.wav']);
    . w! k, |; D" g% u% V9 y. m. vs2 = audioread([path,'音轨-3.wav']);& y* M" z1 x6 y2 V% n7 l
    s3 = audioread([path,'音轨-4.wav']);" @: x7 N% q/ A9 [/ R
    s4 = audioread([path,'音轨-5.wav']);
    + Z7 d: w  }4 g6 as5 = audioread([path,'音轨-6.wav']);
      G2 C$ I* ?( ~, \* g: X1 ns6 = audioread([path,'音轨-7.wav']);
    & }) J4 u; B* v, `$ jsignal = [s1,s2,s3,s4,s5,s6];
    ) z- ]0 w/ B8 iM = size(signal,2);
    ! f; R7 K  z1 W- M4 U3 D. n3 E%%
    # P/ i( D% K" gt = 0;, w, E4 @+ h! t9 p8 a4 V# o

    - w1 R$ d- _0 _; R! h1 Z% minimal searching grid8 d. X+ t+ Y: J
    step = 1;
    5 [4 U( T7 ~0 J  p
    " C" Z7 N, w% D' r$ OP = zeros(1,length(0:step:360-step));5 f, a! P1 Y" W6 L+ H$ Q( O4 F/ s
    tic: l# h8 q% w. p% z
    h = waitbar(0,'Please wait...');
    6 I! m5 o) ^( l" ?for i = 0:step:360-step& f  y6 ^- a/ ^: M. }
        % Delay-and-sum beamforming8 t* T  _% h2 j/ n! k
        [ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);
    * R+ q0 z/ r) n9 S$ ]    t = t+1;, V$ Z% S) ~# c. C8 B2 j9 _
        %beamformed output energy- V' {. S3 _/ n1 p
        P(t) = DS'*DS;
    ) E' Q$ U6 f" L2 R6 Z) |+ T    waitbar(i / length(step:360-step))
    8 D; N- X2 r. xend
    % a8 X; e1 S: [  K- n3 Otoc) d, l% z& v- v
    close(h)
      }% T" ?% E: s! q& o5 t, Z* [, M2 L[m,index] = max(P);
    9 [' Z' a* N! A! Y' c1 B  Y9 ~figure,plot(0:step:360-step,P/max(P))
    $ @( }& p. h9 p+ g$ {" Lang = (index)*step1 f* L$ J- v& z

    5 G; `9 ~6 U. }% J8 @! k$ h6 X1 I7 I程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下: d0 ^0 ~- i' U" E/ u. d

    6 [7 ?) M7 U5 X5 |

    结果与预期相同

    PHAT加权

      与GCC-PHAT方法相同,这里也可以对幅度做归一化,只保留相位信息,使得到的峰值更明显,提高在噪声及混响环境下的性能
    / D& _: i/ V& P! @" Y  上面代码中加上这一句


    ' ~" s  d1 R0 N( H6 s7 l4 `+ F%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,));
    & |9 x" D0 Z% g: l6 [测试同样的文件,结果如下
    * o, Z8 U; I1 g- R& {# r+ J: h, _; Y; ^3 u* u3 n3 C0 R
    对比可以看到,PHAT加权的方法性能更好, d; K0 P* m/ L2 }% w5 k
    参考- L" `8 X& M  O" ^8 _
    1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》
    2 o; ?% i3 L: ?: j, _2. 《传感器阵列波束优化设计与应用》) [2 I0 M  I; D2 G, P0 |' i
    ————————————————
    8 Y1 O/ Z' t3 X1 f/ M2 U版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    8 v/ D; F% ]6 I4 z原文链接:https://blog.csdn.net/u010592995/article/details/81586504
    $ E+ m. g" V3 w; d' E7 y; D7 g, B9 `8 d' \, i
    $ Y# Y2 K6 T0 m5 Z6 ?
    1 s* v( ~$ L. w& {8 y( X

    8 O( C  C' V3 \7 t, a2 Q& m0 q* [0 `  F
    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-20 21:06 , Processed in 0.583168 second(s), 51 queries .

    回顶部