QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4535|回复: 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
    5 I  Y- q& e% o8 r0 t* ?+ T. O9 @  声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),
    6 D! W9 a- `* ~/ Y3 J: Q
    ) l: |% u  E7 q/ O' \8 usteered-response power! Z1 _' a# i  W) c  e* O3 N
      可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。
    0 j; q3 V' Q  f6 U  Z  上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。 7 K: d) y7 j. r3 K6 s3 b* \: X
      其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现
    : i' b: G- |; m) j' W  p* B5 w0 ]# L" l$ x% C' n4 d0 I+ z
    频域宽带波束形成$ K$ |* n6 o9 A6 w
      频域宽带波束形成可以归类为DFT波束形成器,结构如下图 8 c0 P, w8 Q# x: T$ ?, Y- @
    $ T6 B" a! V- [8 E" e! _

    ' ~: \( z% P  |

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

    频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT
    ) e2 Y% s5 m5 \8 R4 g  n代码实现如下


      p* R; [4 o' n% e8 Nnction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle)8 g- G- a6 Y' U
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%; K; [  `* \/ z
    %frequency-domain delay-sum beamformer using circular array
    + R3 p3 X) {  O%   
    $ M, A( I, g9 }2 Q) N%      input :, p- I  V' Y) [4 q$ S
    %          x : input signal ,samples * channel
    ' v6 B& [5 F  [, W* W%          fs: sample rate
    9 s) m6 {$ c# [%          N : fft length,frequency bin number6 Q8 L9 q5 \* f9 [
    %frameLength : frame length,usually same as N
    9 r8 H2 R2 u, A" M) _%        inc : step increment0 s& ~) ~4 P# E5 q0 n: J$ v
    %          r : array element radius" F+ _4 d4 H4 }3 n0 _
    %      angle : incident angle# |" p" }; u, c2 ]* S
    %
    1 S% r+ _: l$ N%     output :4 p' |7 I: G; M0 {
    %         DS : delay-sum output
    , _6 o$ y3 ~4 j: E4 p' @%         x1 : presteered signal,same size as x. o0 P! }$ b' m7 R  C+ A1 W
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    + u* y0 m4 K6 l( h7 t  C4 I. H6 b, _6 y/ R! h5 C
    c = 340;! e1 M. W0 @6 q/ o! ]0 x0 d8 M+ H2 l
    Nele = size(x,2);
    $ N, U- B" ?, [6 D$ gomega = zeros(frameLength,1);
    , `6 t6 ~8 u' k  }6 ?0 ?% B, vH = ones(N/2+1,Nele);9 W& ^9 z" M% ?# I4 x( d

      K: c- g) q, Btheta = 90*pi/180; %固定一个俯仰角) B6 t3 ?: ^$ a7 N8 }
    gamma = [30 90 150 210 270 330]*pi/180;%麦克风位置  {. o2 M. V$ C6 t' p
    tao = r*sin(theta)*cos(angle(1)-gamma)/c;     %方位角 0 < angle <360
    3 ^1 O. I- v/ Q0 m- }6 qyds = zeros(length(x(:,1)),1);
    % `1 J; D! E& [2 R4 T8 V, Kx1 = zeros(size(x));! q6 q! S; U- }0 M+ _, }' n- b/ Q

    : z: |& J% e" Q8 `% frequency bin weights
    " G5 G! [+ w  r, }% for k = 2:1:N/2+1
    . x/ c8 Z# c% ffor k = 1:1:5000*N/fs& P) l. P; m' w, L! \% P
        omega(k) = 2*pi*(k-1)*fs/N;   ! V) R+ ?6 X1 W9 x- [
        % steering vector$ k  S  I% s. w! G( W
        H(k, = exp(-1j*omega(k)*tao);
    5 j/ ]4 N9 v# |6 Z; fend
    ; ^: [% {3 T0 e0 h% B# |2 n& V. O& X  ?9 t+ d
    for i = 1:inc:length(x(:,1))-frameLength3 S9 t5 c* s) B! \7 L8 s8 h. f

    " U  k, e  z( L    d = fft(bsxfun(@times, x(i:i+frameLength-1,,hamming(frameLength)));
    ) V7 l. G3 L4 {* a+ V1 K
    & j7 O2 ?6 ~; a0 V% H    x_fft=bsxfun(@times, d(1:N/2+1,,H);
    2 S* N8 u0 D+ S8 \
    * C; Y& L$ w8 H' h2 z    % phase transformed# w5 f3 h0 p8 X6 h6 z
        %x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,));
    - d; F9 O6 Y  C+ O% B3 Z; V8 k    yf = sum(x_fft,2);
    9 X5 N; s7 S) p9 I9 F    Cf = [yf;conj(flipud(yf(2:N/2)))];
    9 ^" K, R  P4 _6 {: z/ k
    3 V: a+ ?0 o6 x; K4 }9 o    % 恢复延时累加的信号4 b5 [, r3 D+ R' j' a1 W
        yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));
    , B5 |" D8 t1 m
    ) j" v2 Y, }+ j4 Z  g8 `    % 恢复各路对齐后的信号
    . Z. a: @( h+ Q2 o& d$ c    xf  = [x_fft;conj(flipud(x_fft(2:N/2,))];" O/ M6 p. u3 B, X8 P
        x1(i:i+frameLength-1, = x1(i:i+frameLength-1,+(ifft(xf));
    * b& n" S& ]% \3 Z4 C( B6 _end
    ! x& w6 O8 F5 g, a) V% r5 \DS = yds/Nele;  ' U* ^- F2 {! r8 U  D
    3 [2 V" \) C- S& g
    end; N* r" d) V5 g; T
    然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下& l9 X4 u" p7 G/ {
    2 C( |- J" R/ N  X' t
    %% SRP Estimate of Direction of Arrival at Microphone Array
    ; l" |. D" M: p* k% Frequency-domain delay-and-sum test
    ) }3 S  e4 R' @, r%  
    ; S- j) Y. |, w8 V& r1 Q( ~: b%%9 {" U9 G% E7 X! m; z& u; c
    6 d1 K- _% ^" K0 r- Y/ }
    % x = filter(Num,1,x0);
    4 n) ?/ ]* G8 Ec = 340.0;
    ) u' g' H5 F. `7 c6 _; W* f
    6 P4 S6 X* S3 C+ Z0 h% XMOS circular microphone array radius
    7 G& E# W: O% a, Fd = 0.0420;
    " C8 ~# {) g5 J9 O% more test audio file in ../../TestAudio/ folder( e9 Q  J( e$ A7 |- v4 t  [
    path = '../../TestAudio/XMOS/room_mic5-2/';
    6 A5 m2 d$ ?- s[s1,fs] = audioread([path,'音轨-2.wav']);
      p4 L0 ^3 K( Qs2 = audioread([path,'音轨-3.wav']);4 c7 o$ f2 A/ |( X: ^' _2 Z
    s3 = audioread([path,'音轨-4.wav']);$ |3 Z" C. Z. U! @
    s4 = audioread([path,'音轨-5.wav']);
    7 C! I* \2 c" d* q& Zs5 = audioread([path,'音轨-6.wav']);) |$ e# _2 O" j0 h* t& S" i
    s6 = audioread([path,'音轨-7.wav']);. y$ f1 z; u- [& l0 X- K$ y$ J% ^
    signal = [s1,s2,s3,s4,s5,s6];
    0 o8 R9 @- y5 ?; t1 YM = size(signal,2);
    * J; g: y/ f# ?; D9 v" {* c%%
    % A% t3 x8 x( p1 {" T. ^t = 0;
    ' D( c+ ~4 h0 s8 z! g$ F8 U) }% K  E# l9 K  x) \+ K
    % minimal searching grid& r6 {% g' B( J/ w. G) ^: E
    step = 1;
    + Q( l5 ?1 l# U' j6 I
      a. ^- z8 P$ K" cP = zeros(1,length(0:step:360-step));
    " U" q& ~0 x; b! y" l  rtic7 k! Z$ f0 e& q
    h = waitbar(0,'Please wait...');
    ) `  U3 V; w' ~2 ^* p5 F& Tfor i = 0:step:360-step' p' o/ e) O& H- B7 X
        % Delay-and-sum beamforming) n: x2 D- i3 T; i: v1 |) G
        [ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);9 k( ~/ T# R4 _% D7 X% `
        t = t+1;
    6 s0 u- P! {1 y0 M    %beamformed output energy
    ) w/ M6 P* X9 p% P7 S    P(t) = DS'*DS;
    , ^, v. s8 q1 s    waitbar(i / length(step:360-step)); G  Q, H% n: b! \$ \* F% {- b
    end. J) \7 m. L  ]# ~
    toc2 ~/ U1 N8 d" C) g  V6 V
    close(h)
    9 S+ Z' _, C( A6 D  W. P  z[m,index] = max(P);
    3 {) r1 ?/ W/ zfigure,plot(0:step:360-step,P/max(P))' I4 `: o: b3 z6 O5 F
    ang = (index)*step
    1 O$ `' V) {$ \
    4 m1 q) }3 K7 G1 R9 _程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下% ?2 j3 p$ _: I2 H

    8 F& K7 z' A& i7 i

    结果与预期相同

    PHAT加权

      与GCC-PHAT方法相同,这里也可以对幅度做归一化,只保留相位信息,使得到的峰值更明显,提高在噪声及混响环境下的性能
    + j1 ?% B, |5 o$ h4 j  上面代码中加上这一句


    9 _) g! F, ~# @1 H  C; M% W4 R%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,));
    $ r; m1 ?; D; v测试同样的文件,结果如下   p) R) t8 \( V& i7 a7 h

    0 W. j6 l+ b* y5 b: {0 G9 d对比可以看到,PHAT加权的方法性能更好
    " u$ _8 b8 q5 R* x$ Z, s. H参考
    9 O* S) `, @; U1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》 , F9 z5 v* V" s7 U- Q' i) d
    2. 《传感器阵列波束优化设计与应用》
    + n4 Q$ x* D+ ?6 W7 t0 X————————————————' T# `: r! P% t) {* a
    版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。- M# @) ^4 H+ \  `3 ?# M# O: r
    原文链接:https://blog.csdn.net/u010592995/article/details/815865040 N& q; c' T# V7 g: Y# b3 E
    ! w3 x: A, O2 ]" Q! H
    ' q, D1 b$ G' ?
    # @7 L9 Y( u0 Q9 t2 L

    # v. b6 T* L+ h- H* O
    ' P1 W2 \3 X4 P6 ^/ E
    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-6-9 20:04 , Processed in 0.548933 second(s), 50 queries .

    回顶部