QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4576|回复: 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 |邮箱已经成功绑定
    DOA8 J' m: v7 z8 B, O4 K
      声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),
    $ R* h6 L0 x7 m1 \+ V; a) i0 a( i3 b1 ~3 A
    steered-response power( ]) t2 P, F  D  {, H9 p2 s! c
      可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。   a  K8 y% H6 E, Q% |- Z. Z4 r
      上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。
    * R& ?4 F+ Y# U3 N: D+ F; J  其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现
    5 s) j7 \. Y2 r$ c5 E/ v. E& B3 O% N8 o
    频域宽带波束形成
    3 A& J  a( g& P/ t& }, U) N9 Q% N  频域宽带波束形成可以归类为DFT波束形成器,结构如下图
    " w# h2 S0 }( A  r/ t6 e# q# s! J& o  H6 ?# Q' k

    0 O: |! E: K  l; P; c* T1 i

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

    频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT 4 N0 X% e: p+ ^
    代码实现如下

    # b5 B8 B" a/ I2 S
    nction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle)3 I& f+ t. Q$ b
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    * ?3 `6 {# A) i%frequency-domain delay-sum beamformer using circular array
    # Y- U! h* L. q+ ?%   ) ^* W. x" _( a5 J, h3 Y
    %      input :/ {2 ~, ?1 n8 P2 I! J( b6 F
    %          x : input signal ,samples * channel3 @5 E3 P6 g$ Z/ P
    %          fs: sample rate
    9 [9 K: O3 J' `%          N : fft length,frequency bin number
    / }" Z2 p& j/ R+ b%frameLength : frame length,usually same as N
    : F* t) h% f8 x7 Y1 Z" Q# W( t  g%        inc : step increment
    1 X% k1 ]- I+ y$ ]* r$ B%          r : array element radius/ A1 R+ v( }8 S" k
    %      angle : incident angle2 q* F: O' e2 c1 J
    %8 ~& v8 m, h- F5 J( P5 }
    %     output :! {4 n' k4 o* f8 o) R; U: E; P1 Y
    %         DS : delay-sum output
    ( J  S% E7 o1 y7 J0 j%         x1 : presteered signal,same size as x
    ! m4 `1 l9 N9 a: h, h5 D% V%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%( w: B( N1 c9 {
    ( A! ]- M/ S0 ?, f. P: U
    c = 340;
    6 x5 G) H8 b9 B5 |$ v- c# oNele = size(x,2);3 ^% c4 J6 |8 Z: K/ X& z! v: l& ^- ]: l
    omega = zeros(frameLength,1);
    4 g! |4 P9 [% @, o5 JH = ones(N/2+1,Nele);
    / t5 B6 j5 J& ?: Q* @! e: V: p7 g
    ' K# }& S! i* jtheta = 90*pi/180; %固定一个俯仰角
    . @# K$ Z. F. q9 Q& Tgamma = [30 90 150 210 270 330]*pi/180;%麦克风位置! {1 o: c0 Z) H& \
    tao = r*sin(theta)*cos(angle(1)-gamma)/c;     %方位角 0 < angle <360
    ( v) W" ?$ |# T! l4 Oyds = zeros(length(x(:,1)),1);. e; U: ~- L7 ^7 V& ?* m( |7 R
    x1 = zeros(size(x));
    ! c" o* P8 v! L: _; e1 s$ K3 i; m. e; o+ Y
    % frequency bin weights
    % a) u5 J; ~8 L# [2 U% for k = 2:1:N/2+1
    $ X$ h: }1 o0 ^% p( ?3 zfor k = 1:1:5000*N/fs, P. p/ |* n9 D! X9 Q
        omega(k) = 2*pi*(k-1)*fs/N;   
    5 Q* s/ H( m1 T# D# Y    % steering vector' t6 o" @4 C' g& l* k
        H(k, = exp(-1j*omega(k)*tao);
    8 a2 y5 ^5 |7 eend
    - ?5 c7 i6 b6 W
    5 a+ g7 s& T: S% w* ?$ O* Yfor i = 1:inc:length(x(:,1))-frameLength
    1 _6 c0 o1 W7 ]7 O! ^" o2 t7 H: J- ~5 [  b
        d = fft(bsxfun(@times, x(i:i+frameLength-1,,hamming(frameLength)));
      E0 i! p' R/ v1 @; c$ j! c
    1 b: Q7 G$ @2 Y, q    x_fft=bsxfun(@times, d(1:N/2+1,,H);
    6 x1 T" v. b7 T8 ~. k& }1 s6 `
    : l( W' Z. z2 O" ~! [    % phase transformed
    3 A5 t5 T6 q2 J# b& T    %x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,));/ W" h. X5 h6 ^: Y3 @; x' o
        yf = sum(x_fft,2);+ a2 k( A2 d0 D
        Cf = [yf;conj(flipud(yf(2:N/2)))];
    0 G2 e) ]+ `3 Z7 U/ ^2 y: f5 D! k
    # I7 b$ L$ V: l. V8 I    % 恢复延时累加的信号" c5 {1 J, \- ]
        yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));
    / l- \$ N0 w/ I3 i" V9 q+ ?4 C
    ) R% c; U$ Q' K6 R! {    % 恢复各路对齐后的信号
    & B4 u$ S' e/ k( ]    xf  = [x_fft;conj(flipud(x_fft(2:N/2,))];0 Y3 J) _) Z5 W9 S
        x1(i:i+frameLength-1, = x1(i:i+frameLength-1,+(ifft(xf));
    2 Q% N. \4 z5 x% |$ A" R7 aend" R! B; c8 u2 j; `) y
    DS = yds/Nele;  
    7 ^6 a& ]; Y( ~' n3 G- l' X' d7 ~* z! v2 t* t$ o
    end
    / B' L( W" J3 O" f- K6 |  c然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下
    6 }# U8 |$ F' Z" a( K% t- w) E9 U
    ( U% y" a: d5 K* l%% SRP Estimate of Direction of Arrival at Microphone Array% z" h: A  j# i. _2 F
    % Frequency-domain delay-and-sum test) l: ]' |& N% W- t4 e/ o* r
    %  - _4 u! _: N( u
    %%
    " X) d2 q# v  }: [8 f% |. X9 W- q4 A! b
    % x = filter(Num,1,x0);
    5 u1 w2 S" b5 J  }$ [) C4 j) _' ?c = 340.0;+ ?4 l+ e7 [. e/ G- X! w
    , U, s/ F. B. y5 n
    % XMOS circular microphone array radius
    ; N- v* h, O- V$ B2 n: W8 rd = 0.0420;
    & W4 ]. Y& u. A1 X! o% W% more test audio file in ../../TestAudio/ folder
      F5 K3 q# ^, y$ y/ A/ d. c0 `path = '../../TestAudio/XMOS/room_mic5-2/';/ G, H' e2 _6 D1 U4 b4 P1 S
    [s1,fs] = audioread([path,'音轨-2.wav']);
    1 A# r5 `) b) B& w: rs2 = audioread([path,'音轨-3.wav']);
    # ?4 q$ O, a, a# `s3 = audioread([path,'音轨-4.wav']);
    + k9 W+ L* M" O' ~0 _3 d6 f  `s4 = audioread([path,'音轨-5.wav']);
    $ Q+ P5 Z4 Q9 S: h9 e- j, Os5 = audioread([path,'音轨-6.wav']);
    ' I5 d/ q- ~( v. a0 W% Ws6 = audioread([path,'音轨-7.wav']);0 \0 p, s, D/ K/ F
    signal = [s1,s2,s3,s4,s5,s6];. O& W* @: @! z/ @7 y3 I" T/ s
    M = size(signal,2);
    1 c% O6 E3 b5 w/ g. r%%
    ; ]1 _" {2 c' y7 s- ?4 [t = 0;+ L+ R% N8 n  g( L, P3 ^5 }7 W
    - B* P" `( T. F( v8 N! u
    % minimal searching grid
    * z( Q( S( s9 E( Y6 bstep = 1;
    1 {7 ~+ _6 a$ @9 D! I  q% p- N/ {( P1 ]* j. `. E+ ]
    P = zeros(1,length(0:step:360-step));
    ( M' X5 F; h0 ]6 {/ |$ X' g  dtic
    / P" r4 Q1 Y, i. {6 s/ @& ch = waitbar(0,'Please wait...');
    : @3 Q; L6 r. Y: L" W% m1 O7 ]for i = 0:step:360-step; S1 b' M2 W; B& g1 p& \
        % Delay-and-sum beamforming
    7 E1 \9 u* ?" ]7 ^( |    [ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);
    . k' R( f: o. t' N7 W3 @/ i9 H    t = t+1;
    + y" a0 @" `9 z    %beamformed output energy& B9 B. V/ f0 H, P+ C) K8 |# h
        P(t) = DS'*DS;
    / c* i# G- N2 Z    waitbar(i / length(step:360-step))
    - U- J; e" g! X/ X  z9 w! oend0 p0 }0 X! h% i5 W5 W2 Z
    toc5 T( L1 c! `0 P
    close(h) 1 ^5 B/ ]1 s9 y) J. Y2 \1 G0 [8 y
    [m,index] = max(P);
    - x7 f/ u- r5 a6 I8 t9 ^+ Qfigure,plot(0:step:360-step,P/max(P))+ D# P, D* N5 u9 L; g
    ang = (index)*step
    8 B1 C8 U7 e- M  h% ^3 R- a" u; b! c3 s$ e# }
    程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下* B1 S3 M/ X, `9 _; K5 R& Q: y: u
    1 [: s+ R0 q1 X: {* |& Y; V# f7 F. T, D

    结果与预期相同

    PHAT加权

      与GCC-PHAT方法相同,这里也可以对幅度做归一化,只保留相位信息,使得到的峰值更明显,提高在噪声及混响环境下的性能 6 A2 s0 k0 A/ m; K% s) A1 V% P) X
      上面代码中加上这一句

    5 {2 n2 ?- E. r* l
    %x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,));/ ]6 e- u) b$ z# ^0 a+ t
    测试同样的文件,结果如下
    2 l* q% B$ v: O3 y  w# Z5 \: _4 L8 O$ ?- O
    对比可以看到,PHAT加权的方法性能更好
    8 t% l6 U. h; h- D参考& ?6 f+ W) o6 p5 c
    1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》
    $ a0 b  [9 v& ?2. 《传感器阵列波束优化设计与应用》5 _0 c4 k# V/ l# R' y2 `' m
    ————————————————
    1 ^( B. S6 l6 Y9 o" q( ^  z8 J" i9 [版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    0 N) N) b& M! P# Q( |原文链接:https://blog.csdn.net/u010592995/article/details/81586504* F# h9 M) ?7 ?# G+ \

    + ?4 q7 A, f3 w* f- c' n
    / m) S- v, l6 V: S- L5 R
    / k7 Z4 e0 Z) x. o/ M8 M5 b0 O  E) E" ~0 w" c7 j/ A
    & r8 E3 V( d/ K+ ^/ 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 03:47 , Processed in 0.394537 second(s), 50 queries .

    回顶部