QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4608|回复: 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( W, n# `' N* f3 o) Z% H3 d/ `9 s
      声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),
    " I# x+ A3 W2 [) r9 b+ \+ o3 N* k& P! P1 {2 C  U6 ~- d
    steered-response power
    ' T+ w) {$ J- E% \( ?8 h  可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。 ( w' S  T. {6 s1 i
      上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。
    ' Q$ R0 Y+ Z9 [% t3 f  其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现$ U& n! u+ L' Z5 W5 R$ A
    ' Z& ?7 N6 Y* u2 ^0 n
    频域宽带波束形成
    + r9 |) v6 B# ^7 }  频域宽带波束形成可以归类为DFT波束形成器,结构如下图 $ j2 ~  T* P! X- P& J

    8 B: Y4 n' H. \7 i9 ~! X7 ~6 B  k: f

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

    频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT 4 J& W# E! n  A: N
    代码实现如下

    7 B7 W& @3 v, R7 U( e8 j$ n0 k0 F: Y
    nction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle)
    9 w3 ?1 @6 S; d! Y%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%' G: M/ z# u, L0 J4 r1 H/ ]4 t$ Y/ v
    %frequency-domain delay-sum beamformer using circular array
    . \4 l0 ^- d5 n0 N8 Q%   
    ; Q* d( X5 K/ Z# ^1 N/ I6 x%      input :9 s5 Z$ m) D0 H, h. |
    %          x : input signal ,samples * channel6 J1 h) ]) w3 r! l
    %          fs: sample rate9 i9 X- ~4 l* B( \4 z5 q8 B6 s
    %          N : fft length,frequency bin number* y; V: }0 N! Z# k
    %frameLength : frame length,usually same as N
    # x' D4 m6 n, g2 l# \2 b%        inc : step increment: G3 _  |% e+ Q. t
    %          r : array element radius
    1 g2 g% c( f3 @. O) t2 I, R%      angle : incident angle
    . D7 D3 p% ?1 m# y& B4 a: M% l%  |5 B2 {& O6 R* y* z
    %     output :/ p2 D8 U2 X. j
    %         DS : delay-sum output
    8 o- g) S4 D, M5 R" D%         x1 : presteered signal,same size as x) D, `6 p- u* e2 j  ]7 U
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 n' Y; S  b' ~6 O- i
    ! h' l0 {  \6 y( U# @
    c = 340;
    0 ]: a* x% D6 F9 QNele = size(x,2);
    ( t1 V* K/ ]9 E# C' W4 Womega = zeros(frameLength,1);* {0 E- b; T2 @  M& K" h5 j8 F
    H = ones(N/2+1,Nele);' s% I  P$ p& D! f  j! J9 \" k
    , e2 y1 r/ y6 a( l
    theta = 90*pi/180; %固定一个俯仰角) i1 m% R* U% R$ I1 d5 g7 M1 O
    gamma = [30 90 150 210 270 330]*pi/180;%麦克风位置
    / F) A  x4 _$ j7 C% Mtao = r*sin(theta)*cos(angle(1)-gamma)/c;     %方位角 0 < angle <360
    # y* Q: W/ p, X7 N% I* p/ |% K# Nyds = zeros(length(x(:,1)),1);
    9 @- d  h" \- Bx1 = zeros(size(x));
    + h7 F7 }, T8 L/ D5 @' d
      b5 u1 O% Q5 l1 ]4 ~8 U) N% frequency bin weights
    # a1 {: F$ a1 o) {% for k = 2:1:N/2+1
    ; D; v, N! z0 n$ T+ J$ V( n) Dfor k = 1:1:5000*N/fs$ w4 n1 Y( k, w" U, U6 A) }
        omega(k) = 2*pi*(k-1)*fs/N;   ( X/ y0 n( y; p
        % steering vector- y3 T+ j2 M! O3 p
        H(k, = exp(-1j*omega(k)*tao);+ C; a( C8 Z; |" V3 z9 m
    end  W2 U3 Z4 E' O
    + Q/ `- G( s) E, O# ^4 Y8 s1 W
    for i = 1:inc:length(x(:,1))-frameLength$ i( J& d7 _! Q4 i
    8 T+ R6 z9 A/ ]1 j9 H
        d = fft(bsxfun(@times, x(i:i+frameLength-1,,hamming(frameLength)));
    / x! y. K6 t& c4 {6 u
    8 ^$ J) V( K9 h; I    x_fft=bsxfun(@times, d(1:N/2+1,,H);
    4 X3 q) d5 m' }; |  a  l
    9 l' O+ Q' K; q. g- n* _    % phase transformed) ?0 [0 m6 e  T* F9 {0 x. S
        %x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,));& K6 P5 _  T4 v2 j/ x' w
        yf = sum(x_fft,2);' U- h% S: J- ~, H! {
        Cf = [yf;conj(flipud(yf(2:N/2)))];
    $ m& X8 o7 \1 q6 _* l0 j
      X/ y" ^- F/ u) P    % 恢复延时累加的信号- ]7 ~* @; W- s1 p1 t
        yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));2 O% J! J( R' M5 R, n

    & \0 i7 C( c+ u2 M4 Q0 w    % 恢复各路对齐后的信号) C, ^+ y$ O7 y
        xf  = [x_fft;conj(flipud(x_fft(2:N/2,))];
    ( |) U. |: ?. W" n+ p    x1(i:i+frameLength-1, = x1(i:i+frameLength-1,+(ifft(xf));% c& f- L2 v* x3 Y
    end
    ! L# M3 T: \( E( s- c; RDS = yds/Nele;  
    + ^5 f  l( u+ R( z3 d( c
    ( w' @9 X7 @2 t! D3 h+ send9 r  I* u/ d1 X) j. Z- ?, Z5 o! T. j/ @
    然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下. ]) g7 U5 ~/ l' A5 }
    , P" E8 \+ k& x! V' V. X; d
    %% SRP Estimate of Direction of Arrival at Microphone Array
    % ~7 q6 T6 J& _. s* i. X$ x: E% Frequency-domain delay-and-sum test
    ! |$ Z, ]& J- A%  , C- _! W- g0 e
    %%
    ' ?$ l0 ~$ H! M% r, w( x5 j* J2 r6 f4 I% U( w0 W* u
    % x = filter(Num,1,x0);" \+ Q: E! y2 J* G/ _
    c = 340.0;
    ) o9 I7 W& I; r2 G( [
    $ C  z+ x: \: {5 j1 v% XMOS circular microphone array radius6 `! Q3 W% Q, _5 i  R$ T9 v
    d = 0.0420;2 O* V3 R  `- a9 J0 o' |! A; B
    % more test audio file in ../../TestAudio/ folder9 p! m  |' f, w5 d
    path = '../../TestAudio/XMOS/room_mic5-2/';/ s4 \8 C# l6 e& u0 z7 X
    [s1,fs] = audioread([path,'音轨-2.wav']);+ B4 D4 [+ K- G1 y
    s2 = audioread([path,'音轨-3.wav']);3 \) k: e9 X! I2 g
    s3 = audioread([path,'音轨-4.wav']);
    9 d6 ?- I5 C) `. l2 As4 = audioread([path,'音轨-5.wav']);
    ( {+ D4 e0 a9 H& a6 Ys5 = audioread([path,'音轨-6.wav']);
    7 Q  [2 ^) S2 q) v2 j) _. es6 = audioread([path,'音轨-7.wav']);
      z7 n& _8 U& E. ]7 o% isignal = [s1,s2,s3,s4,s5,s6];# [4 e: r& j5 i2 G- ]
    M = size(signal,2);6 J2 h  \0 X2 {1 b9 l
    %%4 |/ f! m1 L" W' h
    t = 0;- h+ i6 c3 W( u1 X: j8 k1 n$ @$ Q' E5 ?

    $ V# ^" N5 H; R; v& m7 d! B% minimal searching grid# s; l/ j+ I3 r9 s# s( G* T
    step = 1;
    : G* n0 N2 q9 N- i9 l* M( S% {3 Q4 ^6 w! X1 X5 v6 Z1 R- c. D
    P = zeros(1,length(0:step:360-step));- K. ?6 I* {3 Y
    tic
      N" L% L: \: l/ r* Ih = waitbar(0,'Please wait...');" S# M. A6 O# e) e4 g
    for i = 0:step:360-step
    1 I3 {6 _2 h; P9 a& V    % Delay-and-sum beamforming
      r' S( Y: c- D. E% ]: d7 R; B    [ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);
    6 D* V& F  [6 d3 [# g: [    t = t+1;
    : Z+ @( K) C; c. n$ Q    %beamformed output energy
    - R" t1 V" k' O1 d1 y    P(t) = DS'*DS;7 B& T& A( L, H
        waitbar(i / length(step:360-step))- w* T& A+ Z4 J; {) Q& G  n; H
    end+ l  z/ f3 h; t# L$ b/ N
    toc
    0 w9 c+ R& N4 oclose(h)
    ' K+ z& J0 Z' Q$ B[m,index] = max(P);3 H; f0 Q. m: S- w. U8 x2 I8 D( G8 C0 @
    figure,plot(0:step:360-step,P/max(P))
    6 v  e8 [) M  {2 g8 w) z0 Lang = (index)*step3 E2 v# N# Z6 v# X. Q
      G) L! {6 _) A, E4 t, |5 h. p
    程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下( [1 K' n3 x7 ~/ s8 v1 Y
    6 ^* m) c$ B7 N+ J* S* q

    结果与预期相同

    PHAT加权

      与GCC-PHAT方法相同,这里也可以对幅度做归一化,只保留相位信息,使得到的峰值更明显,提高在噪声及混响环境下的性能 8 F, x) m3 T" g9 g) `- X% t) i
      上面代码中加上这一句

    3 o, L" E' a5 T# ^% Q" j
    %x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,));( y3 w. [: Z+ [( N$ T* `7 r
    测试同样的文件,结果如下
    : \' g/ Z2 {% O7 `$ G3 m* _5 `8 d2 p  V+ v7 L$ u' m6 S/ D
    对比可以看到,PHAT加权的方法性能更好
    5 |% X4 |' Z, {, ^' ?参考$ Y: j0 K) |( I* ]7 o
    1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》
    4 D( B* k9 R8 V# m  ^2 I2. 《传感器阵列波束优化设计与应用》: U- H; B0 [. [9 L" s
    ————————————————3 t5 z+ X8 J' e
    版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    4 z0 ]  ?0 l" j+ S4 u原文链接:https://blog.csdn.net/u010592995/article/details/81586504
    , q9 U) p+ n* J* }/ K
    * \2 h  @; c1 `+ ~6 P, e. r  _! i5 m# e  h$ R. d

    / p* V: p6 d: B) M4 L. C+ {" K
    % |, o3 I- c/ u. u3 O1 B, d/ W: J' T1 [* a/ k, }4 I7 X# [6 M; H' p+ I* K
    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-9-8 18:07 , Processed in 0.427322 second(s), 51 queries .

    回顶部