QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4546|回复: 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
    / q' q) e9 g7 t6 `' F' @3 t1 I5 C  声源定位方法一般可分为三类,一种是基于TDOA的两步算法(two-stage algorithm),一种是基于空间谱估计如MUSIC等,还有就是基于beamforming的方法,也就是这里要介绍的可控波束响应(steered-response power),
    ; f9 N) t4 Z' i
    ' }& a8 v1 v# \: W3 f! @8 [4 [steered-response power
    + @% k, P) x/ B# b4 t* \0 H+ H  可控波束响应是利用波束形成(beamforming)的方法,对空间不同方向的声音进行增强,得到声音信号最强的方向就被认为是声源的方向。
    $ e) q& F+ Z0 M  上一篇中简单介绍了麦克风阵列的背景知识,最简单的SRP就是利用延时-累加(delay-and-sum)的方法,寻找输出能量最大的方向。 - ~% U, s5 b$ X# I
      其中,语音信号为宽带信号,因此需要做宽带波束形成,这里我们在频域实现  P- T; V: O8 Y& B4 w( P, @
    ( G; ]- W1 x" U/ G6 R' _% j
    频域宽带波束形成
    $ v! n8 @# a4 @, I9 L) P  频域宽带波束形成可以归类为DFT波束形成器,结构如下图 9 J, Q6 k: U% p5 |) |7 E

    7 e: v  u$ M5 @/ S' o: p' }7 Q* I/ y, |9 C8 A8 t

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

    频域宽带延时累加波束形成的基本过程就是信号分帧加窗->DFT->各频点相位补偿->IDFT
    $ S( L* v) h' o( I+ X* T代码实现如下


    : I! ], q6 `8 h/ ]nction [ DS, x1] = DelaySumURA( x,fs,N,frameLength,inc,r,angle)
    ( M1 P( u  {, e! [) n; M$ |%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    ) k! O+ `8 p& V( q% a% M%frequency-domain delay-sum beamformer using circular array
    # I* m) ~$ f# v8 d%   
    ) Y5 o! F' H, A6 U* [" ^7 y6 z%      input :
    / J5 }! c; _- S& q%          x : input signal ,samples * channel
    , b+ X# V$ z% m; _1 T. D+ b%          fs: sample rate
    " h, _* S4 X$ v9 q% d5 e" L%          N : fft length,frequency bin number( o4 @# _6 h4 f) v; j
    %frameLength : frame length,usually same as N9 C4 X/ @( g8 V: p! l
    %        inc : step increment
    7 X: {0 e" d0 }. N& v4 E7 [6 y%          r : array element radius( T# `: k. K  [# K
    %      angle : incident angle7 U! O' }( F- h; l8 y
    %
    1 A( ^7 N2 t; u& Q: a0 B1 m%     output :# L7 z/ g  o2 f' e
    %         DS : delay-sum output
    & T% B4 x4 R! k8 [: I%         x1 : presteered signal,same size as x
    $ q: o% h3 u- r' W9 V. U2 Z5 t%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 v! e8 J4 n5 V' f

    2 A( t) M' l7 p8 }c = 340;
    ' K8 e" g; @7 v* H" A6 h: ONele = size(x,2);
    % ]# y. ]$ ~+ T' j! C8 tomega = zeros(frameLength,1);/ J& V' `# A1 D" Z8 P# ^. Y
    H = ones(N/2+1,Nele);$ Q7 V; a3 n  @: n

    4 @8 w$ i7 L1 L8 r6 R3 v% Rtheta = 90*pi/180; %固定一个俯仰角
    5 S! s; {, ~9 O  C2 ]2 ?3 Rgamma = [30 90 150 210 270 330]*pi/180;%麦克风位置
    2 q* z% J* {- D, r0 |tao = r*sin(theta)*cos(angle(1)-gamma)/c;     %方位角 0 < angle <360
    * z3 k9 A* c- Z& c0 Z) pyds = zeros(length(x(:,1)),1);9 z' K3 k, c4 u: B
    x1 = zeros(size(x));
    6 K; R8 J: l; \5 |
    / Y9 A# F$ w5 X% frequency bin weights
    8 }  \+ o1 z( \% for k = 2:1:N/2+1* ]6 [4 g5 F( l; a/ m
    for k = 1:1:5000*N/fs
    . }. l0 Q7 p2 }; _% R' `3 x    omega(k) = 2*pi*(k-1)*fs/N;   ! g, p) q- D2 I+ e7 L( C( \
        % steering vector& r; U' Q" l( ?5 |) M. l
        H(k, = exp(-1j*omega(k)*tao);
    - U" D7 D  F, }' Uend% y2 U, p) p5 j+ }6 \# S
    5 u  K" P& D" ?
    for i = 1:inc:length(x(:,1))-frameLength0 Y+ i7 _9 R, J. g/ K
    % i9 S9 I  n+ W2 u# y7 K, U
        d = fft(bsxfun(@times, x(i:i+frameLength-1,,hamming(frameLength)));
    - v+ ]/ J! g4 Q: G
    , i% z7 m: r5 d/ H  P  q    x_fft=bsxfun(@times, d(1:N/2+1,,H);& U) R3 ]2 u! g% e4 w
    : P5 D: v5 F$ o0 T' @+ L7 K- @
        % phase transformed
    * ?8 j1 E$ y: x8 F% b& Q* d( |" w    %x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,));
    : B& U3 I, k. [) w, {    yf = sum(x_fft,2);' `5 R, w+ s7 B6 x' F5 W) a
        Cf = [yf;conj(flipud(yf(2:N/2)))];
    ' a3 |( J0 d( M1 P; w1 _1 X5 X  M8 v; N5 D) P) U
        % 恢复延时累加的信号
    3 g# P! Z/ H; q' t5 k3 P! D7 W    yds(i:i+frameLength-1) = yds(i:i+frameLength-1)+(ifft(Cf));' d! o( n8 X* a/ `; A4 {2 B: J; k
    ; l$ J. X- w  O& f  m5 Z
        % 恢复各路对齐后的信号
    ( D7 x3 ~/ U) {6 R) i3 k    xf  = [x_fft;conj(flipud(x_fft(2:N/2,))];. K0 ^. V/ R* L! V  ^* d
        x1(i:i+frameLength-1, = x1(i:i+frameLength-1,+(ifft(xf));
    : Q6 a. |! J5 [: Y/ c- Oend* }! }! \. p8 w
    DS = yds/Nele;  
    , a' n- Y6 _% K, B/ h
    & ^) n! t+ P( L( l( t& T  Cend' ]5 D! Q0 @9 y
    然后遍历各个角度重复调用这个函数,测试实际录音数据,代码如下
    " J2 R$ Q8 D; J2 X3 N, o( E4 [! t) l/ |4 y6 T/ x
    %% SRP Estimate of Direction of Arrival at Microphone Array
    & Z3 S8 t$ _) ~# p# u' c7 h0 E% Frequency-domain delay-and-sum test, A, T4 g. e6 \: A; q5 s9 f7 C4 c
    %  
    ( p  G0 U2 C5 N2 a% P4 q/ h%%6 K/ v% o2 Q5 z' Q" k
    & M, a6 t- F3 c$ s
    % x = filter(Num,1,x0);7 L4 ~. G+ e& J4 Z, N6 @8 i
    c = 340.0;
    * o* J- O; l; t# K: n# g, G$ x9 @9 e" M7 U. Y: j  Z' `
    % XMOS circular microphone array radius# N& `  Q" I0 z# U8 u: M: T
    d = 0.0420;
    ' x8 k$ y' `# w4 T1 W% more test audio file in ../../TestAudio/ folder3 L9 e& @9 O1 T% k7 |
    path = '../../TestAudio/XMOS/room_mic5-2/';
    - D- A% R/ t/ o5 d" a' _. {[s1,fs] = audioread([path,'音轨-2.wav']);- N: y" Z% c* p$ Q: G' G
    s2 = audioread([path,'音轨-3.wav']);3 c: x$ e! F7 _9 m8 o( J
    s3 = audioread([path,'音轨-4.wav']);
    & F" C0 T' t8 V8 us4 = audioread([path,'音轨-5.wav']);( z4 u* ?, t' b6 k2 Z9 B9 \) J' e
    s5 = audioread([path,'音轨-6.wav']);  a) B8 n' s7 [, A! o& e
    s6 = audioread([path,'音轨-7.wav']);) o- Z9 a  }* w% N
    signal = [s1,s2,s3,s4,s5,s6];
    $ N" m2 X# ^( Y& YM = size(signal,2);
    4 t  L* ]0 ?$ g, E) J1 E& R%%6 m. `! c, [/ w  {7 N- q
    t = 0;
    ; H3 Y/ s( l! Z8 R' }& X' X
    4 Z. b- k. M9 Q# ^5 E% X% minimal searching grid" I& N! h$ z/ ]
    step = 1;7 W! g) I  v8 S# C9 ]4 p. d
    ( y, U; ?( m/ {
    P = zeros(1,length(0:step:360-step));
    4 h- l6 `8 b0 ?, d/ u6 ]* N4 f0 H1 mtic' i9 g1 B: C+ k& o5 l7 Z
    h = waitbar(0,'Please wait...');3 I3 p( o5 U! J* v- W" N/ s
    for i = 0:step:360-step) U+ |( u* v/ z/ G. N: G# A$ j
        % Delay-and-sum beamforming1 v. x1 T8 s/ {6 @
        [ DS, x1] = DelaySumURA(signal,fs,512,512,256,d,i/180*pi);
    2 @8 \" C, I' m/ i    t = t+1;
    - i0 R6 B, e1 T7 ^! }; `( {    %beamformed output energy
    6 o7 g7 S+ o) `" L+ y* |! ]4 {, b    P(t) = DS'*DS;
    2 \8 B; Y( E3 _$ s6 k$ X/ S    waitbar(i / length(step:360-step))
    . M+ ?1 X" B5 x) T! tend0 o3 ]4 S8 Q2 ?8 n. a! U( w
    toc. @' W! v- C' ~: p5 V& p
    close(h)
    7 u- l) C$ c2 F* n7 x8 G[m,index] = max(P);
    $ G1 z3 d3 M7 I3 ]figure,plot(0:step:360-step,P/max(P))7 V) w. S7 X: q$ p( ]) v3 V
    ang = (index)*step
    ' ^( Z4 _$ Z. p8 {7 K0 N' H
    ! P- ]" j% f5 x3 Q& n+ T7 @程序中用的是圆阵,可以进行二维方向角扫描,不过这里为了简便就固定了俯仰角,只扫描方位角,结果如下
    / g3 P' {  N8 n3 {$ {; m* c: p2 }4 n+ F- v

    结果与预期相同

    PHAT加权

      与GCC-PHAT方法相同,这里也可以对幅度做归一化,只保留相位信息,使得到的峰值更明显,提高在噪声及混响环境下的性能 # [+ w7 @7 w7 x
      上面代码中加上这一句


    ) c4 r1 {/ T4 k/ @, G: G3 h%x_fft = bsxfun(@rdivide, x_fft,abs(d(1:N/2+1,));
    . Y; k* O4 ^3 O4 d& [. k; c测试同样的文件,结果如下
    / c+ ~7 h# b# R( ?' _
    4 a5 l7 O9 Q7 H4 A对比可以看到,PHAT加权的方法性能更好
    % V7 z0 ?$ U) i7 a# O/ Q参考
    : P2 c( h+ B$ B1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》 6 U# _3 f/ X2 `, M! i
    2. 《传感器阵列波束优化设计与应用》
    1 Y1 L# |+ v5 q* h————————————————7 |8 u: L& |" G0 @. Y. A
    版权声明:本文为CSDN博主「373955482」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。1 C, B( W1 ?; G. @# H0 x
    原文链接:https://blog.csdn.net/u010592995/article/details/81586504
    5 u3 @! _7 h0 n. e7 u( `4 {% ~6 v8 y

    $ r* R; t: j" O2 d' b% e
    & W: W4 |; j: H+ P; D
    * ]' m; e! h* t" h4 [6 Q; P# j
    3 v# h+ ~! x1 {. F& {
    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-16 04:58 , Processed in 0.425566 second(s), 51 queries .

    回顶部