QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4581|回复: 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% }1 H7 X$ t. s5 R. M8 J8 n
      声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),4 K! F* F! A7 J, K# }; Z) ?

    - k2 P$ k# H8 {4 ^/ Qsteered-response power
    6 s, e! s0 N9 M+ z' l  ]  可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。 ' }+ `* P! g* z5 V, o- ]) b
      上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。 : @( y# F1 d& C' }8 r
      其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现
    8 [' E: O& L: f8 ?; ?7 Z
    . p7 Z, S" y% k8 _) |频域宽带波束形成
    0 t5 Q, l! K) L- J* z; C; k$ L  频域宽带波束形成可以归类为DFT波束形成器,结构如下图 * U$ d: [, z: w( B: Y2 z
    7 I) b* S7 A8 E& A

    4 |* q/ Q2 l- b

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

    频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT * M6 f5 w: [- X2 ^! B0 R
    代码实现如下


    & U8 W: d9 ?! e7 g0 ^* fnction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle)3 D$ F1 |0 x3 Q& h/ z2 Q
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$ ]3 ]4 E" J7 M" n
    %frequency-domain delay-sum beamformer using circular array
    , e% U+ J5 |4 z9 g2 R%   
    ! i2 @% [9 O2 _%      input :
    1 X0 Q9 T# C) C) w%          x : input signal ,samples * channel
    " `6 s- l( z4 T5 J1 |& V5 K%          fs: sample rate
    ( |# ?  X$ f" R9 F%          N : fft length,frequency bin number% E4 @4 R3 v7 ]- t  a2 F
    %frameLength : frame length,usually same as N
    3 ?$ V; k7 v6 [0 K4 P- F%        inc : step increment
    % U$ f" j2 U" l- j%          r : array element radius  b8 ]) m" W9 b( S4 H1 ^+ s
    %      angle : incident angle  l: Q' T* S. [" K; M, e) X
    %
    ! Z2 W. g" e" z* R- A$ d%     output :
    : G0 z" b* T/ a4 y' f6 G%         DS : delay-sum output
    ( C+ h+ g; z1 ~) [' m- W* H%         x1 : presteered signal,same size as x
    1 o" M3 B3 h& @4 W%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 Y+ p5 Q+ Y. D

    8 {4 q8 l* t6 Vc = 340;
    1 [2 [) {7 r6 mNele = size(x,2);4 f0 [; E' I" K; U  g
    omega = zeros(frameLength,1);. P5 S5 n% z* M" [& v- L/ u! I. P
    H = ones(N/2+1,Nele);& i% k; `' Q( J* o* ?. H6 L

    " ~4 G5 E7 E& R6 M! Stheta = 90*pi/180; %固定一个俯仰角  S6 k% Z/ e7 K. p$ ^/ C$ {
    gamma = [30 90 150 210 270 330]*pi/180;%麦克风位置- b" F0 B2 ^' w! [$ J4 \& ?7 n
    tao = r*sin(theta)*cos(angle(1)-gamma)/c;     %方位角 0 < angle <3603 V* s2 v* a7 y, w7 s
    yds = zeros(length(x(:,1)),1);0 I+ S; o* P4 D; o7 F" d( @
    x1 = zeros(size(x));
    5 q: m% Q/ n' d# T) G9 }! q$ [2 t. H* j+ U# g$ S
    % frequency bin weights
    / X$ N; m( E# @1 w8 u" `" I% Y% for k = 2:1:N/2+1
    , l5 L" B$ N- f- N" C8 Z0 x$ ffor k = 1:1:5000*N/fs' u1 S, G' u, ~4 c: M+ j$ s
        omega(k) = 2*pi*(k-1)*fs/N;   
    / k$ [3 W9 S* M# w' v9 W    % steering vector1 F% i3 ]3 R" B0 }8 k4 b/ a
        H(k, = exp(-1j*omega(k)*tao);
    + Y" \+ i9 n+ I, Y# K$ Aend" ~- s1 Y( U  a3 r8 ^* H; T

    + l7 I  Y! _. s8 B9 Tfor i = 1:inc:length(x(:,1))-frameLength( ]5 t& ?6 ~- ~- q& s. D- y

    8 N/ L* f* D, f! K4 Q2 ^9 `    d = fft(bsxfun(@times, x(i:i+frameLength-1,,hamming(frameLength)));
    0 W) K' N0 p6 }) g. C/ t2 m5 `. E! c2 ]+ P- m  r/ O
        x_fft=bsxfun(@times, d(1:N/2+1,,H);; L% c8 N$ b- U- q
    ; R* v7 u) X) _. p/ c# |
        % phase transformed
    4 E( F0 Q2 q3 y2 S* ^  _# t    %x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,));" K. q( \( {: K' f4 l
        yf = sum(x_fft,2);$ ~1 \/ R/ V4 V# n: ]4 k
        Cf = [yf;conj(flipud(yf(2:N/2)))];
    $ X$ S: n* \$ I! a" m/ o
    ' b) s" u1 D+ @3 F: _5 ?3 k    % 恢复延时累加的信号
    * P6 a. c4 F% V# c    yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));* U+ Q8 e( e* Q0 {

    5 Z: V! o' C' j- q    % 恢复各路对齐后的信号
    , c9 O9 G3 N. v7 s3 w- }: Y    xf  = [x_fft;conj(flipud(x_fft(2:N/2,))];
    3 U8 `2 ], T* ?    x1(i:i+frameLength-1, = x1(i:i+frameLength-1,+(ifft(xf));; B; g+ u3 ?7 h' Z" v
    end
    1 ^& r; N# T4 }; \& U- KDS = yds/Nele;  
    5 i5 f8 ^! E+ Z. j8 Y4 w, j
    . K' i% S  A2 D3 H" t, x, L. t# Fend5 E" H, J2 S5 @5 w' G7 Q4 l
    然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下4 @: i9 o; s3 W4 n0 G3 Q% T
    4 ]' ~# c: J8 O6 Y( H3 H- t( `* z9 A, p
    %% SRP Estimate of Direction of Arrival at Microphone Array3 i% o3 x: m$ V7 m. d- E
    % Frequency-domain delay-and-sum test6 W4 D+ r4 l) N' \5 _/ M; V3 F* p
    %  
    5 a. K* N9 n1 Z6 T8 q" Q( `%%1 ~4 n1 J( \7 y4 R, V

    2 H  T7 p$ F, |% E% x = filter(Num,1,x0);- Q4 k! \/ S6 J  w  f
    c = 340.0;7 l. r: F8 k8 X
    4 Y& c) N; R) T7 D2 a1 r$ \; u: v0 l
    % XMOS circular microphone array radius# Y( x; N/ R4 N" L; c
    d = 0.0420;
    6 g8 |/ I! h8 t, j) X% more test audio file in ../../TestAudio/ folder/ C5 _& m, |; s- X+ \* {
    path = '../../TestAudio/XMOS/room_mic5-2/';
    7 F5 I% a/ }4 Z6 Q' J! P# T/ z( s[s1,fs] = audioread([path,'音轨-2.wav']);
    1 i% v4 n. J' o7 s$ Is2 = audioread([path,'音轨-3.wav']);8 H( i" R$ J* g- N5 U7 M
    s3 = audioread([path,'音轨-4.wav']);4 h% O! M0 D' O0 |% r, z& p- R  Y
    s4 = audioread([path,'音轨-5.wav']);
    : \, b5 s$ t2 g7 x, Z: Es5 = audioread([path,'音轨-6.wav']);
    ' j6 I. r' }! \0 D; o! ls6 = audioread([path,'音轨-7.wav']);" \$ C$ J/ O! f) Y& v+ q* g
    signal = [s1,s2,s3,s4,s5,s6];
    7 v4 D+ r6 R; N! Z. p- rM = size(signal,2);& m; D! K' ?5 C2 C
    %%
    + L5 i& F- g" c/ Z9 {t = 0;
    8 m9 `  n* a% ]  T9 o9 U$ i+ Q
    % minimal searching grid
    2 b0 Y$ @; H% A: Jstep = 1;
    . V3 E- A9 D4 i* o/ b0 s& C" i* ~/ J9 e) w0 V/ `: s" G5 |
    P = zeros(1,length(0:step:360-step));; y  I, Z( y1 o! _5 p3 ^2 a5 I
    tic. n. @, a2 Z1 r
    h = waitbar(0,'Please wait...');9 h- i4 y% [! s* |8 \0 j( f: g
    for i = 0:step:360-step
    ( z+ ]8 S% i( ], X1 N    % Delay-and-sum beamforming
    1 K# q' d. A( a- q, W    [ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);
    0 y! n: \9 t+ x' l  k1 f* ^    t = t+1;
    ( L5 ]+ f2 U0 ^3 ?    %beamformed output energy1 D" Q$ k7 |( I3 U
        P(t) = DS'*DS;
    1 j- Z4 g) ]" }- x3 c    waitbar(i / length(step:360-step))! y& b+ B2 _' d  d8 M; c
    end1 X- N  w: g7 l8 e" c
    toc! V4 M3 p0 ^) u5 Z4 i( T6 Q" m
    close(h)
    ! s' @. R% j0 @+ L, M* g; p, n" @[m,index] = max(P);; {3 ~9 V( }* ^& _2 M" G: `
    figure,plot(0:step:360-step,P/max(P))
    ' `( F4 F- \, ~! g, k% w% tang = (index)*step$ C+ v4 O. d. o# [# \
    5 A) B* g7 e8 y9 a
    程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下
    8 {. m) r6 o$ d# u
    * u# E7 C& k# ]' g8 y- o

    结果与预期相同

    PHAT加权

      与GCC-PHAT方法相同,这里也可以对幅度做归一化,只保留相位信息,使得到的峰值更明显,提高在噪声及混响环境下的性能 ( w5 W" U+ {1 u2 O
      上面代码中加上这一句

    7 S5 E: S7 L& W* x$ M( {+ _* ^
    %x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,));
    ; Z+ F9 \' G  T* z1 d测试同样的文件,结果如下 2 h# B2 G- D! j/ M+ S9 u

    5 N# b! `, D4 Z对比可以看到,PHAT加权的方法性能更好2 _1 l9 }7 B3 W! j0 l: {5 X
    参考
    3 \1 p: E; c& f' S1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》 ; P  F& Z. A  ^$ i+ H( g& B
    2. 《传感器阵列波束优化设计与应用》0 k, k9 O; _: M8 w
    ————————————————% k8 x/ c7 t# t  R( Z% w+ B5 F- K
    版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    # a& u( v3 W6 m+ ^4 ?1 |2 c原文链接:https://blog.csdn.net/u010592995/article/details/815865048 B0 m' {2 z( s9 ]! s# Y8 ]% a- p# K
    ) E: M8 o% n4 s, C$ w. n6 w
    ( a& E4 E( \0 Y* F( x! {
    ; L/ Y# Q8 X/ R
    1 z, V4 t0 c2 t/ @

    , m# H. I- v& 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-7-27 04:01 , Processed in 0.337202 second(s), 51 queries .

    回顶部