QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4577|回复: 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- m; ~; {# ^. i% z0 y
      声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),
    ) P  o7 [3 b; w3 C7 l
    # t- w, {2 C5 E# n& }steered-response power
    # C& \, v. v$ k) U  可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。
    ( p2 a' s: G0 s. N1 o  上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。 * A( B- ~7 Z# {; Q2 u
      其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现
    $ T, C- b# T0 f3 [- f4 Z, ^5 ?$ [2 i, @/ V( U8 u1 d4 k
    频域宽带波束形成
    6 ]( j" e6 s6 F4 ~/ D; d5 P/ j  频域宽带波束形成可以归类为DFT波束形成器,结构如下图 5 E, m0 _/ @0 i9 f8 q+ L1 f

    # ?5 @  I' Q7 v, p" B2 R% z$ t! n3 m! x( A0 d

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

    频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT . k- u; I5 l+ ^# ^/ C* }2 i
    代码实现如下


    1 u/ |& n2 [! x2 anction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle)
    7 m8 ?" ?, I/ M4 l" _( G3 T: n% y%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    5 C+ w( {5 ?! ~%frequency-domain delay-sum beamformer using circular array: k; r& G" @* |$ O+ V
    %   
    ; Q, {% U+ o2 l6 X$ m/ u3 l%      input :
    % ?' e2 L3 ~# V: m' I( K%          x : input signal ,samples * channel
    ! e/ `) R; n3 _, r2 n9 G) K%          fs: sample rate, u- k. S$ \( a' b+ }/ k
    %          N : fft length,frequency bin number0 S! ]& G" M! X$ {
    %frameLength : frame length,usually same as N
    7 |# U* ^: G% Z3 k" A%        inc : step increment  h6 k8 R8 [7 y) m' c
    %          r : array element radius: f9 s- A/ R' l* e
    %      angle : incident angle
    - X9 U; O$ }& |%1 L8 x3 j5 w' E5 f
    %     output :! {) u% ^! X' y' ^1 G$ X+ b
    %         DS : delay-sum output5 g4 O* V3 l3 b% H' l! V
    %         x1 : presteered signal,same size as x
    8 j4 @8 k- q  K: Q1 G%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    . H! |' |$ D, v/ V1 p1 H
    ) Q$ G; T: s! |7 |c = 340;
    7 P' |& {" n$ yNele = size(x,2);8 P. x) A4 b. u% I
    omega = zeros(frameLength,1);' r2 m# v3 r& i. o, y: P; |. r
    H = ones(N/2+1,Nele);
    9 x  ]+ _! o$ z7 j" o  d- \
    + d- w7 |- Q1 N- qtheta = 90*pi/180; %固定一个俯仰角
    + {, Y  @" g- ^7 d4 }1 ^gamma = [30 90 150 210 270 330]*pi/180;%麦克风位置3 x, e; E0 g! Q
    tao = r*sin(theta)*cos(angle(1)-gamma)/c;     %方位角 0 < angle <360
    1 T! a" _0 S/ T0 U7 O! f1 q5 Cyds = zeros(length(x(:,1)),1);, ^  I' x. h  `
    x1 = zeros(size(x));
    2 w& @9 J9 v7 |3 [: m0 k  ~! m8 c: E4 J& _  E% G
    % frequency bin weights# K& d' q# a8 k# U. o% @
    % for k = 2:1:N/2+1' x# O( H' C& F$ ^1 N4 s
    for k = 1:1:5000*N/fs
    - h/ I) d" b4 q* a& g3 n    omega(k) = 2*pi*(k-1)*fs/N;   
    + b% |' F, x/ \: R! {5 @& \2 G    % steering vector
    ) ^6 c$ ^, x, p8 ?    H(k, = exp(-1j*omega(k)*tao);$ Y. T) o* t; J8 e( U6 V
    end! D, r. i$ ]( o3 ^

    2 w4 @# J* o2 H) ^0 Jfor i = 1:inc:length(x(:,1))-frameLength
    & C5 Y+ h7 h( r# M/ ^
    7 ^( J: i! w8 J8 g) W    d = fft(bsxfun(@times, x(i:i+frameLength-1,,hamming(frameLength)));9 _& ^( e* @8 x$ C( x  @/ Y! M
    ( f/ }6 b' L) O8 V
        x_fft=bsxfun(@times, d(1:N/2+1,,H);2 w5 R5 P0 i7 h2 l4 ]8 t

    $ x5 S- _+ [5 c5 C. F0 K& S    % phase transformed
    ; [/ T5 Y6 d/ Z' i1 `0 o" d" s, \    %x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,));
    5 q  f" J8 V9 B    yf = sum(x_fft,2);& r( c+ N; Q3 M6 K. ]& r; \
        Cf = [yf;conj(flipud(yf(2:N/2)))];% M$ t0 e9 C1 e
    ( o5 x3 O3 c/ U: v
        % 恢复延时累加的信号0 _: f' R$ b) ]/ `, D
        yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));) f  t& J: |; K' L

    7 P1 M, y: R/ X1 A    % 恢复各路对齐后的信号0 ?* o/ W3 ^9 s( |
        xf  = [x_fft;conj(flipud(x_fft(2:N/2,))];6 [$ W. l' q. s$ n$ N
        x1(i:i+frameLength-1, = x1(i:i+frameLength-1,+(ifft(xf));
    4 S+ m, J# ^/ i  nend  N/ y; k" c" r6 K  g+ V' G: o
    DS = yds/Nele;  + p) D5 \# L1 ~
    + S- b% Q3 l5 s( v  V- z( l, X
    end
    / d; a  t# s, M7 S然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下* {$ V0 T3 t! V8 y' c2 t% D  t
    1 V$ j2 {; w+ |+ N3 o
    %% SRP Estimate of Direction of Arrival at Microphone Array
    & l& `2 f! s9 w% Frequency-domain delay-and-sum test
    9 Y6 f$ s$ I% M%  0 O( Y) h: ^' N" ]/ B
    %%
    7 W/ d* _) s& m+ x! S: W6 Q- D& I7 j* j+ c) H
    % x = filter(Num,1,x0);, O. b- K3 o& o& P9 y* D
    c = 340.0;: T6 }( `# q) L1 j& @$ X
    3 O1 d. `- p$ }0 s+ u( [
    % XMOS circular microphone array radius
    7 w, n/ I/ c, @" r! X. {d = 0.0420;
    , e: B- U6 S2 U; I" K' L% more test audio file in ../../TestAudio/ folder. V4 y) v2 w/ B& a
    path = '../../TestAudio/XMOS/room_mic5-2/';! b8 X7 p5 {1 p, o8 Y
    [s1,fs] = audioread([path,'音轨-2.wav']);
    : h' f1 f4 n8 O7 h! b6 v$ d. Es2 = audioread([path,'音轨-3.wav']);
    8 |: A* K8 m* ^. S: ?s3 = audioread([path,'音轨-4.wav']);. s9 j3 \! q  A9 O% K; Y! M% A
    s4 = audioread([path,'音轨-5.wav']);0 j5 d) e; p- H7 B
    s5 = audioread([path,'音轨-6.wav']);
    ! u' `0 d6 a6 m4 O  J' As6 = audioread([path,'音轨-7.wav']);
    ) C/ ~! b  Y" ]2 i) d$ Y1 Esignal = [s1,s2,s3,s4,s5,s6];" a* }0 |6 w4 I% r% x
    M = size(signal,2);& ?% @" I# T1 X$ T6 r
    %%
    " b4 P  s6 s3 M1 h8 }5 @( Qt = 0;
    $ o6 K; P' h# H) o5 z0 E: c) {' G  ^+ j; [- c
    % minimal searching grid
    " V" Q3 z" W+ W- y+ D; u$ cstep = 1;
    ( J+ Z9 @% [  s. X3 u* n6 b: t6 P: h  L' r5 A% F. Q
    P = zeros(1,length(0:step:360-step));
    " Y3 R! m) s( s3 I. i5 Qtic
    : s/ S' I' c/ y) Hh = waitbar(0,'Please wait...');
    / [3 Q3 ~4 V. B, U7 afor i = 0:step:360-step
    - e5 k. `' `/ {8 d. t! `    % Delay-and-sum beamforming
      M: A8 a; W$ @5 W' E* Y    [ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);/ x. K. l1 L% O% C5 s; p, \5 E
        t = t+1;' ?) L2 v" g5 I5 C9 A
        %beamformed output energy
    : ~9 S5 ]! h$ O0 M  @+ c: x! w    P(t) = DS'*DS;3 v* }8 b& {' K! N3 [' ?8 E
        waitbar(i / length(step:360-step))1 c! ]# [' m+ Z& i
    end, S/ A  k6 p4 t6 h6 o  ~" {2 a
    toc- [  n0 o$ e) K4 v- _4 u
    close(h) 1 r; D- d6 m3 c- @6 P6 z
    [m,index] = max(P);
    / t1 W, z$ y: l! tfigure,plot(0:step:360-step,P/max(P))* `' B5 ^! q. _" S0 [! l; @& m
    ang = (index)*step
    . t4 l4 R+ c; d
    3 n& p! ~3 U5 G* i- w程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下  k# P  Q/ m) L1 l1 ]
    6 D  b4 P8 @# L$ I0 j! L

    结果与预期相同

    PHAT加权

      与GCC-PHAT方法相同,这里也可以对幅度做归一化,只保留相位信息,使得到的峰值更明显,提高在噪声及混响环境下的性能 ' t* Z' ^( O( `9 w8 O
      上面代码中加上这一句


    % v: h: u, L( O, R" i/ F' M%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,));$ M' G% b; I0 B9 P1 @
    测试同样的文件,结果如下 * H; t$ J8 m: s6 O

    4 E2 _3 }( e9 M, m/ T对比可以看到,PHAT加权的方法性能更好
    7 m; d3 V2 z: ?) V7 Q参考
    " O+ Y# [0 _1 a% W1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》 3 \" h0 I; M1 T1 p2 `' Y
    2. 《传感器阵列波束优化设计与应用》* V+ D: I- Y2 M/ O2 G
    ————————————————
    . E/ ^, n1 e4 q% W  }版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    # J: S' @& N! i, E, z3 |: M原文链接:https://blog.csdn.net/u010592995/article/details/81586504
    7 s( A7 }& U9 ~1 N) d- W  L/ [. c6 |/ z# H+ l! G

    4 C+ c, S! U( U# ~6 n8 @& {
      S9 V& E7 [/ l8 B3 V5 e2 a5 a8 D8 b' O0 ~- o
    ! z% L8 S. D: b* {# B
    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 05:07 , Processed in 0.583752 second(s), 51 queries .

    回顶部