QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4504|回复: 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
    4 ]+ s$ x" S* F  声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),
    9 d' ?% T1 f$ ?5 K: q4 R0 L8 `' I6 e
    steered-response power
    0 f% o( d2 |0 W) M7 |5 m  可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。
      q7 {, b  N$ u! }1 j- Y  上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。
    % ^# s1 R: V' M% D# E  其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现$ b6 ~- d: y& ]+ g( u- G
    8 ]8 b4 |4 @% w, l
    频域宽带波束形成# \5 K6 [1 J1 J% `
      频域宽带波束形成可以归类为DFT波束形成器,结构如下图
    0 o3 P2 O( b/ P8 z* ~# T
    1 y4 q( }- L5 C' ~+ m
    7 J0 O: Q! _# |0 D7 `1 K" Q9 W

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

    频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT 4 P9 j' }# n2 a+ m
    代码实现如下


    # R# k" ^; ?0 |- k; ]* @; Lnction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle)
    / |- f6 ?& l9 ^4 T2 U, w%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    . F* ?6 ?9 D. b%frequency-domain delay-sum beamformer using circular array
    3 h5 b) p! h$ S5 p%   9 n* H( S# T" N2 B9 j: V
    %      input :
    # _% Z4 P" Q- ]3 p) x$ ?%          x : input signal ,samples * channel
    " l5 K6 _; h* i# n2 `  H/ ]%          fs: sample rate1 t% b- @! f6 K' n
    %          N : fft length,frequency bin number
    4 X! }  S* w. O2 W: i! }%frameLength : frame length,usually same as N
    3 [  v" a, t7 O+ J" y%        inc : step increment  y" h7 a1 {( l, B' f% f
    %          r : array element radius
    " ]; i+ }; t$ X# V- V) c%      angle : incident angle
    $ V+ H( Z! K" `: \9 m/ n- o3 W%
    % @' F9 |3 m1 {' I* A%     output :
    $ d. j; g3 c! O3 Q5 q+ |1 Z9 J3 g%         DS : delay-sum output9 h1 `3 l: ^# L6 f0 T
    %         x1 : presteered signal,same size as x# G" Y4 L9 v- x: j+ k# b
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 l  M$ E9 f5 q. q& T  ^( c% w8 M

    $ K0 B' u. x$ ^3 k/ Lc = 340;
    * f4 k( X0 H. G8 dNele = size(x,2);
    " |1 o1 @+ o, U1 U4 d6 Q3 f# v4 Homega = zeros(frameLength,1);" _3 ?0 m- T8 Z6 L5 B
    H = ones(N/2+1,Nele);9 N/ J- w' M+ T1 |1 s
    ) j! o5 ]" r+ ?' I' E7 u, @
    theta = 90*pi/180; %固定一个俯仰角' @: ?3 s$ n+ w( e$ H( a
    gamma = [30 90 150 210 270 330]*pi/180;%麦克风位置/ {' U7 J0 j* ]. ]+ P# L
    tao = r*sin(theta)*cos(angle(1)-gamma)/c;     %方位角 0 < angle <360% N7 h0 Z6 ]0 Y4 l( h! Y
    yds = zeros(length(x(:,1)),1);4 g/ }0 X+ w+ C! x
    x1 = zeros(size(x));; O' z) O/ S2 \* B" c. l

    # _$ D$ Z% v! _% frequency bin weights: r* p" }9 |# H3 Y5 y; e
    % for k = 2:1:N/2+1! S( m6 _: f/ }( G
    for k = 1:1:5000*N/fs) `% Z" k$ _, W7 K
        omega(k) = 2*pi*(k-1)*fs/N;   + R1 X0 X6 Y' f( _3 z  K
        % steering vector
    5 L! A% R. u3 ?. ^! p6 w    H(k, = exp(-1j*omega(k)*tao);- M; R. p2 ~* i! w
    end& |$ Y7 y) W/ W3 m, b
    1 b) ]/ ?' ~5 N- Q' k. f( k1 x
    for i = 1:inc:length(x(:,1))-frameLength
    # w5 D$ p4 `9 z; K9 I1 a" |& N/ Y! {0 a5 }2 d" m8 r
        d = fft(bsxfun(@times, x(i:i+frameLength-1,,hamming(frameLength)));
    , B2 [& ^' W$ f% J' b5 v  r& `: ~& O. f  Y+ r
        x_fft=bsxfun(@times, d(1:N/2+1,,H);
    ' e4 r: c% A: h9 k; k- s- H0 c
    : A7 G* }" ]( u4 r0 w& ?( ]" W0 W! T, {    % phase transformed
    1 L' W/ t+ K& {0 ^- R. v6 \3 D    %x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,));
    & e. f! X2 u/ U0 w7 x+ H: T- E    yf = sum(x_fft,2);& E. k7 s, H. J6 y+ c
        Cf = [yf;conj(flipud(yf(2:N/2)))];+ s) l2 f+ q8 z3 G+ w( d

    $ d: @" _! U: M* ^  s# d    % 恢复延时累加的信号
    5 C$ R1 m  `8 @) B7 P$ P# i8 u3 s    yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));
      T' l- s7 o8 X( j0 S! c) t
    7 L, V1 \8 h5 U1 R# k- o5 {2 Z( u    % 恢复各路对齐后的信号
    8 C- o% o6 f5 |, z    xf  = [x_fft;conj(flipud(x_fft(2:N/2,))];
    ! m3 {0 o% b/ Q- s$ e; }) p    x1(i:i+frameLength-1, = x1(i:i+frameLength-1,+(ifft(xf));
    # v7 t4 J1 u" C9 g9 p5 o* h( zend& c; Y# P6 k6 ~& B8 b" w: U
    DS = yds/Nele;  
    % }7 W+ Z6 Y3 X/ G( f5 f& O$ ]1 V+ P# V- ~) d: v0 e7 c
    end
    9 \( i  p2 N$ W1 X然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下
    / t! W. H3 I) y0 [' M! h0 U3 B/ x4 s' d. z0 J
    %% SRP Estimate of Direction of Arrival at Microphone Array
    & T5 _& H& |0 o: t% Frequency-domain delay-and-sum test  H# I7 x6 n! }, M1 z7 K  Z/ M
    %  " A( z* \( a$ t4 G/ a
    %%
    " c" p& [9 v  Q! i+ L% A" i6 c$ h8 \
    % x = filter(Num,1,x0);/ X. w5 _0 a5 Q7 e. L
    c = 340.0;
    ' P7 A  G: _4 Z: L4 m5 }# C8 `/ E: I/ S6 _1 ~7 u% _- p) Q
    % XMOS circular microphone array radius" N: S- X' z% _3 g- P
    d = 0.0420;; E6 i7 V! s# ^
    % more test audio file in ../../TestAudio/ folder
    * ~* J0 u6 [1 U% x! apath = '../../TestAudio/XMOS/room_mic5-2/';( c! a6 b. R& c- T
    [s1,fs] = audioread([path,'音轨-2.wav']);3 t6 G5 p+ }1 Y! T
    s2 = audioread([path,'音轨-3.wav']);
    ( _2 E; f5 t7 W! y1 A2 js3 = audioread([path,'音轨-4.wav']);
    ' X6 w2 b) K; M7 X- }s4 = audioread([path,'音轨-5.wav']);
    5 z3 K% Q0 u& v+ V3 Q5 L2 o, p& [s5 = audioread([path,'音轨-6.wav']);
    $ w* E. g! @% W* p& X7 x& |s6 = audioread([path,'音轨-7.wav']);) {8 ?  T- A: }0 S
    signal = [s1,s2,s3,s4,s5,s6];! K- T0 z0 [' Z$ X) K- I0 L
    M = size(signal,2);% T0 Y; O, x& M: c+ c6 M
    %%, x- d9 p# {& y, O9 G
    t = 0;) ^) Q1 M6 a/ \2 E; t% g
    5 R9 {! A( C0 V7 n6 f
    % minimal searching grid
    ! {' ^4 }5 e$ Wstep = 1;
    3 F6 k  ^6 `2 u" \( r( h5 E4 H$ H0 c! h& J6 q: X
    P = zeros(1,length(0:step:360-step));0 ]# V. q! w; ~/ N4 z4 l5 W
    tic1 q/ x; S' Q1 s# l3 W3 d0 m' M9 G
    h = waitbar(0,'Please wait...');5 z* i5 r, E3 T
    for i = 0:step:360-step& Y# H& Q9 _( {3 P) D
        % Delay-and-sum beamforming$ K, P# M1 C- ]. r) ~- W' N: B
        [ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);: h0 S! ?- o5 O" H/ @8 J
        t = t+1;
    " n# x5 x$ z+ S! v    %beamformed output energy1 a6 k9 b0 G3 z4 ~# M7 i6 q
        P(t) = DS'*DS;" j; V/ J. d3 {& ^# M  ~
        waitbar(i / length(step:360-step))1 l" d8 {3 m' K( p
    end
    ( o/ t6 B. V" {( ~# Qtoc5 S4 F, P; f: B4 q# @8 D3 p
    close(h) 2 @) \. l9 l7 k% s: C
    [m,index] = max(P);
    % F4 f# D) X$ F, ^0 Z% Wfigure,plot(0:step:360-step,P/max(P))* Q( H# N# s% D7 _9 N1 s
    ang = (index)*step
    * x8 I6 g& c( ^5 P8 A( E
    1 q) G6 U4 L7 M程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下: d  s) e) J) F! A) p: B/ |. B

    3 Q& }: `4 f! |9 N! ^$ `2 {8 e

    结果与预期相同

    PHAT加权

      与GCC-PHAT方法相同,这里也可以对幅度做归一化,只保留相位信息,使得到的峰值更明显,提高在噪声及混响环境下的性能 : i+ |% N; q1 {: n) {' u
      上面代码中加上这一句


    % I4 _' u) C6 E% `' K$ u%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,));  f) K; k! e+ ]# t2 i
    测试同样的文件,结果如下
    . @! v2 B8 l& w. z  V' R4 v# W( n$ s* N1 t6 _7 _/ x
    对比可以看到,PHAT加权的方法性能更好
    - b9 ]' Y7 l9 |7 _& ~- O0 m0 O参考7 Q: K% ?- q  U
    1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》
    6 v% X8 U) H; }( Z2. 《传感器阵列波束优化设计与应用》
    ) A# c2 \* V5 ~5 Y7 |8 c————————————————' a4 I# v3 @; K6 ?
    版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。! {. R- ~; F2 x+ n+ p2 d5 z) T
    原文链接:https://blog.csdn.net/u010592995/article/details/81586504# i# k8 ]+ s7 g5 L. S

    ; I: e5 g6 t( X7 g/ d
    " @- b5 G, P, D3 E
    . P! r* S2 Y  R( m  U& g
    & z8 V2 S/ V8 ?7 S# m$ _) f! A
    * f- j1 N5 m# |  I
    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-4-21 13:17 , Processed in 0.573692 second(s), 51 queries .

    回顶部