精华内容
下载资源
问答
  • GCC-PHAT.zip

    2019-05-15 17:59:27
    根据加权函数的不同,广义互相关函数有多种不同的变形,其中广义互相关-相位变换方法(Generalized Cross Correlation PHAse Transformation,GCC-PHAT)方法应用最为广泛。GCC-PHAT方法本身具有一定的抗噪声和抗...
  • TDOA_GCC-PHAT.zip

    2021-08-19 09:47:41
    TDOA_GCC-PHAT.zip
  • 麦克风阵列声源定位 GCC-PHAT.pdf
  • 音视频开发(40)---麦克风阵列声源定位 GCC-PHAT.pdf
  • (matlab)gcc-phat是一种简单的声源定位处理方法,该代码可以对一个线性麦克风阵列(例程为8个)采集的连续声源信号(.wav)进行声源角度定位,声源信号文件可以为多声源不同时发声,但各个声源发声不同时且存在...
  • 针对麦克风阵列使用GCC-PHAT算法估计信号到达时差对加性噪声敏感,以及基于信噪比估计的连续值加权GCC-PHAT算法无法消除环境中类似风噪声的变化噪声干扰的情况,提出了一种抑制风噪声的频点加权GCC-PHAT算法。...
  • 麦克风阵列声源定位 GCC-PHAT

    万次阅读 多人点赞 2018-03-28 22:16:43
    利用麦克风阵列可以实现声源到达方向估计(direction-of-arrival (DOA) estimation),DOA估计的其中一种方法是计算到达不同阵元间的时间差,这里主要介绍经典的GCC-PHAT方法 背景 简单说明问题背景,信号模型如...

    麦克风阵列声源定位(一)

    利用麦克风阵列可以实现声源到达方向估计(direction-of-arrival (DOA) estimation),DOA估计的其中一种方法是计算到达不同阵元间的时间差,另外一种可以看这里,这篇主要介绍经典的GCC-PHAT方法

    背景
    简单说明问题背景,信号模型如下图,远场平面波,二元阵列
    这里写图片描述

    要计算得到 θ \theta θ,其实就是要求两个阵元接收到的信号时间差,现在问题变成到达时间差估计(Time-Difference-of-Arrival Estimation),因此,基于延时估计的DOA方法,其实也可以看做是分两步进行的,第一步是估计延时,第二步是计算角度,与之相对应的基于空间谱估计的DOA方法就是一步完成的。下面就分两步进行介绍

    ##1.延时估计
    ###1.1.互相关函数(cross-correlation function
    计算 y 1 ( k ) y_1(k) y1(k) y 2 ( k ) y_2(k) y2(k)的时间差,可以计算两个信号的互相关函数,找到使互相关函数最大的值即是这两个信号的时间差
    离散信号的互相关函数

    R ( τ ) = E [ x 1 ( m ) x 2 ( m + τ ) ] R(\tau)=E[x_1(m)x_2(m+\tau)] R(τ)=E[x1(m)x2(m+τ)]

    求时间差就是找到互相关函数最大时的点

    D = a r g m a x R ( n ) D=argmaxR(n) D=argmaxR(n)

    说的那么简单,那就用代码验证下

    %%
    % Load the chirp signal.
    load chirp;
    c = 340.0;
    Fs = 44100;
    %%
    
    d = 0.25;
    N = 2;
    mic = phased.OmnidirectionalMicrophoneElement;
    % array = phased.URA([N,N],[0.0724,0.0418],'Element',mic);
    array = phased.ULA(N,d,'Element',mic);
    
    %%
    % Simulate the incoming signal using the |WidebandCollector| System
    % object(TM).
    arrivalAng = 42;
    collector = phased.WidebandCollector('Sensor',array,'PropagationSpeed',c,...
        'SampleRate',Fs,'ModulatedInput',false);
    signal = collector(y,arrivalAng);
    
    x1 = signal(:,1);
    x2 = signal(:,2);
    
    N =length(x2);
    xc = xcorr(x1,x2,'biased');
    [k,ind] = max(xc);
    an = acos((ind-N)/Fs*340/d)*180/pi
    
    xc12 = zeros(2*N-1,1);
    m = 0;
    for i = -(N-1):N-1
        m = m+1;
        for t = 1:N
            if 0<(i+t)&&(i+t)<=N
                xc12(m) = xc12(m) + x2(t)*x1(t+i);
            end 
        end
    end
    xc12 = xc12/N;
    

    以上程序中的循环就是上面的定义公式,运行程序可以看到循环部分计算的互相关与直接调用matlab的xcorr结果相同(注意matlab中互相关默认没做归一化),找到互相关函数的最大值就可以得到时间差

    这里写图片描述

    1.2.广义互相关(generalized cross-correlation)

    理论上使用上面个介绍的CCF方法就可以得到时间差,但是实际的信号会有噪声,低信噪比会导致互相关函数的峰值不够明显,这会在找极值的时候造成误差。
    为了得到具有更陡峭极值的互相关函数,一般在频域使用一个加权函数来白化输入信号,这就是经典的广义互相关方法。
    由维纳-辛钦定理可知,随机信号的自相关函数和功率谱密度函数服从一对傅里叶变换的关系,即 x 1 、 x 2 x_1、x_2 x1x2的互功率谱可由下式计算

    P ( ω ) = ∫ − ∞ + ∞ R ( τ ) e − j ω τ d τ P(\omega)=\int_{-\infty }^{+\infty }R(\tau)e^{-j\omega\tau}d\tau P(ω)=+R(τ)ejωτdτ

    R ( τ ) = ∫ − ∞ + ∞ P ( ω ) e j ω τ d ω R(\tau)=\int_{-\infty }^{+\infty }P(\omega)e^{j\omega\tau}d\omega R(τ)=+P(ω)ejωτdω

    这一步是把互相关函数变换到了频域,哦对,上面说到是想白化互相关函数,那就把上面第二式添加一个系数

    R ~ ( τ ) = ∫ − ∞ + ∞ A ( ω ) P ( ω ) e j ω τ d ω \tilde{R}(\tau)=\int_{-\infty }^{+\infty }A(\omega)P(\omega)e^{j\omega\tau}d\omega R~(τ)=+A(ω)P(ω)ejωτdω

    设计不同的频域系数 A ( ω ) A(\omega) A(ω)对应着不同方法,这里只介绍 PHAT(phase transform)方法,即取系数如下:

    A ( ω ) = 1 ∣ P ( ω ) ∣ A(\omega) = \frac{1}{\left | P(\omega) \right |} A(ω)=P(ω)1

    基本思想就是求时间差只需要相位信息,舍弃不相关的幅度信息以提高健壮性,可以看到当 A ( ω ) = 1 A(\omega)=1 A(ω)=1的情况下就是经典互相关
    P ( ω ) P(\omega) P(ω)为复数,可以表示为 ∣ P ( ω ) ∣ ∗ e − j ω p \left |P(\omega)\right |*e^{-j\omega p} P(ω)ejωp,去掉幅度信息后,就只剩相位信息 e − j ω p e^{-j\omega p} ejωp了,要得到相位信息,可以用 P ( ω ) a b s ( P ( ω ) ) \frac{P(\omega)}{abs(P(\omega))} abs(P(ω))P(ω)计算,也可以直接用matlab中的angle函数计算,即 a n g l e ( P ( ω ) ) angle(P(\omega)) angle(P(ω))

    具体得到更陡峭的峰值的理论解释如下,详情参见《麦克风阵列信号处理》P198

    这里写图片描述

    几行代码验证下:

    x1 = [1,2,3,7,9,8,3,7]';
    x2 = [4,5,6,5,4,3,8,2]';
    
    [tau,R,lag] = gccphat(x1,x2) 
    
    N = length(x1)+length(x2)-1;
    NFFT = 32;
    P = (fft(x1,NFFT).*conj(fft(x2,NFFT)));
    A = 1./abs(P);
    R_est1 = fftshift(ifft(A.*P));
    range = NFFT/2+1-(N-1)/2:NFFT/2+1+(N-1)/2;
    R_est1 = R_est1(range);
    
    R_est2 = fftshift(ifft(exp(1i*angle(P))));
    R_est2 = R_est2(range);
    
    

    可以看到,三种不同写法得到的R_est1 、R_est2 与matlab自带函数gccphat计算得到的R相等。

    那上面例子中的宽带语音信号,用GCC-PHAT方法得到具有陡峭峰值互相关函数,找到互相关最大时的点,结合采样频率 F s 与 与 麦 克 风 间 距 d Fs与与麦克风间距d Fsd,就可以得到方向信息。频域计算互相关参考另一篇博客

    ##2.角度计算
    上面的内容计算了两个麦克风的延时,实际中假设阵列中麦克风个数为 N N N,则所有麦克风间两两组合共有 N ( N − 1 ) / 2 N(N-1)/2 N(N1)/2对,记第 k k k个麦克风坐标为 ( x k , y k , z k ) (x_k,y_k,z_k) (xk,yk,zk),声源单位平面波传播向量 u ⃗ = ( u , v , w ) \vec{u}=(u,v,w) u =(u,v,w),如果麦克风 k , j k,j k,j之间的延时为 τ k j \tau_{kj} τkj,则根据向量关系有下式,其中c为声速,

    c ∗ τ k j = − ( x k ⃗ − x j ⃗ ) ∗ u ⃗ c*\tau_{kj} = -(\vec{x_k}-\vec{x_j})*\vec{u} cτkj=(xk xj )u

    这样看起来不够直观,那就代入坐标写成标量形式如下:

    c ∗ τ k j = u ∗ ( x k − x j ) + v ∗ ( y k − y j ) + w ∗ ( z k − z j ) c*\tau_{kj}=u*(x_k-x_j)+v*(y_k-y_j)+w*(z_k-z_j) cτkj=u(xkxj)+v(ykyj)+w(zkzj)

    当有多个麦克风时,每两个麦克风就可以得到一组上式, N 个 麦 克 风 就 会 有 N ∗ ( N − 1 ) / 2 个 等 式 N个麦克风就会有N*(N-1)/2个等式 NN(N1)/2,声源单位传播向量 u ⃗ = ( u , v , w ) \vec{u}=(u,v,w) u =(u,v,w) 有三个未知数,因此最少只需要三组等式,也就是三个麦克风就可以计算出声源方向,这里就先假定 N = 3 N=3 N=3,可以得到方程组如下:

    c ∗ τ 21 = u ∗ ( x 2 − x 1 ) + v ∗ ( y 2 − y 1 ) + w ∗ ( z 2 − z 1 ) c*\tau_{21}=u*(x_2-x_1)+v*(y_2-y_1)+w*(z_2-z_1) cτ21=u(x2x1)+v(y2y1)+w(z2z1)
    c ∗ τ 31 = u ∗ ( x 3 − x 1 ) + v ∗ ( y 3 − y 1 ) + w ∗ ( z 3 − z 1 ) c*\tau_{31}=u*(x_3-x_1)+v*(y_3-y_1)+w*(z_3-z_1) cτ31=u(x3x1)+v(y3y1)+w(z3z1)
    c ∗ τ 23 = u ∗ ( x 2 − x 3 ) + v ∗ ( y 2 − y 3 ) + w ∗ ( z 2 − z 3 ) c*\tau_{23}=u*(x_2-x_3)+v*(y_2-y_3)+w*(z_2-z_3) cτ23=u(x2x3)+v(y2y3)+w(z2z3)

    写成矩阵形式

    这里写图片描述

    求出 u ⃗ = ( u , v , w ) \vec{u}=(u,v,w) u =(u,v,w) 后,由正余弦关系就有了角度值了

    θ = a c o s ( 1 w ) \theta=acos(\frac{1}{w}) θ=acos(w1)

    α = a c o s ( u s i n ( a c o s ( 1 w ) ) ) \alpha=acos(\frac{u}{sin(acos(\frac{1}{w}))}) α=acos(sin(acos(w1))u)

    当麦克风数量 N &gt; 3 N&gt;3 N>3时,其实所有组合信息对于角度值的计算是有冗余的,这个时候可以求出所有组合的角度值,然后利用最小二乘求出最优解,这样可以利用到所有的麦克风的信息来提高角度估计的稳定性

    References:

    1. J. Benesty, J. Chen, and Y. Huang, Microphone Array Signal Processing. Berlin, Germany: Springer-Verlag, 2008.
    2. J. Dibiase. A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberent Environments using Microphone Arrays. PhD thesis, Brown University, Providence, RI, May 2000.
    3. J.-M. Valin, F. Michaud, J. Rouat, D. Letourneau, Robust Sound Source Localization Using a Microphone Array on a Mobile Robot. Proc. IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS), pp. 1228-1233, 2003.
    展开全文
  • 声源定位之GCC-PHAT算法 1.GCC-PHAT介绍 Generalized Cross Correlation-Phase Transform,GCC-PHAT 广义互相关-相位变换 Notes: ①Generalized adj.笼统的;普遍的;概括性的;全面的 ②Cross Correlation 互相关 ③...

    声源定位之GCC-PHAT算法

    1.GCC-PHAT介绍
    Generalized Cross Correlation-Phase Transform,GCC-PHAT
    广义互相关-相位变换

    Notes:
    ①Generalized adj.笼统的;普遍的;概括性的;全面的
    ②Cross Correlation 互相关
    ③Correlation n.相互关系;相关;关联
    ④Phase n.阶段;时期;月相;相位
    ⑤Transform v.使改变形态;使改变外观(或性质);变换

    2.远场模型
    远场模型

    如图所示,s(k)为声音信号位于远场,视为平面波,入射角为θ,两个麦克风y1(k)、y2(l)之间的距离为d。
    在这里插入图片描述

    当我们算出入射角θ时,即可定位出声音信号的位置。
    当声源位于近场时,可以估计声源到达传感器的角度,并且能够估计声源与麦克风之间的距离。
    但声源位于远场时,可以估计入射角度,但难以确定声源与麦克风阵列的距离。

    3.互相关方法
    互相关函数,CCF,Cross-Correlation Function
    对于两个观测信号y1(k)、y2(k)之间的互相关函数定义为

    当p=τ时,τ为相对时延,互相关值达到其最大值
    在这里插入图片描述
    Notes:互相关方法易于实现,但容易受多种因素影响,如信号自相关、混响,另外还有空间混叠。

    4.广义互相关方法
    广义互相关函数,GCCF,Generalized CCF
    与互相关方法相同,但此时两个麦克风之间的TDOA估计可以等效为能够使麦克风输出的滤波信号之间的CCF最大的时间间隔
    在这里插入图片描述
    GCC函数:
    在这里插入图片描述

    广义互频谱:
    在这里插入图片描述

    互频谱:
    在这里插入图片描述
    这个公式实际应该是CC函数的互相关函数傅里叶变换

    y信号离散傅里叶变化:
    在这里插入图片描述

    Notes:
    ①DOA(到达方向估计)
    ②TDOA(到达时间差)

    5.相位变换
    相位变换,Phrase Transform ,PHAT
    TDOA的估计信息是通过互频谱相位而不是幅度表示的。简单的舍弃幅度而仅保留相位:
    在这里插入图片描述
    理想GCC函数:
    在这里插入图片描述

    6.具体定位实现(matlab)

    clc
    clear 
    close all
    
    %加载一段声音(matlab自带敲锣声)
    load gong;
    %采样频率
    Fs = 8192;  
    %采样周期
    dt=1/Fs;
    %music_src为声源
    music_src=y;       
    
    %设置两个麦克风坐标
    mic_d=1;
    mic_x=[-mic_d mic_d];
    mic_y=[0 0];
    plot(mic_x,mic_y,'x');
    axis([-5 5 -5 5])
    hold on;
    quiver(-5,0,10,0,1,'color','black');
    quiver(0,-5,0,10,1,'color','black');
    
    %声源位置
    s_x=10;
    s_y=10;
    plot(s_x,s_y,'o');
    quiver(s_x,s_y,-s_x-mic_d,-s_y,1);
    quiver(s_x,s_y,-s_x+mic_d,-s_y,1);
    
    %求出距离
    dis_s1=sqrt((mic_x(1)-s_x).^2+(mic_y(1)-s_y).^2);
    dis_s2=sqrt((mic_x(2)-s_x).^2+(mic_y(2)-s_y).^2);
    c=340;
    delay=abs((dis_s1-dis_s2)./340);
    
    %设置延时
    music_delay = delayseq(music_src,delay,Fs);
    figure(2);
    subplot(211);
    plot(music_src);
    axis([0 length(music_src) -2 2]);
    subplot(212);
    plot(music_delay);
    axis([0 length(music_delay) -2 2]);
    
    %gccphat算法,matlab自带
    [tau,R,lag] = gccphat(music_delay,music_src,Fs);
    disp(tau);
    figure(3);
    t=1:length(tau);
    plot(lag,real(R(:,1)));
    
    %cc算法
    [rcc,lag]=xcorr(music_delay,music_src);
    figure(4);
    plot(lag/Fs,rcc);
    [M,I] = max(abs(rcc));
    lagDiff = lag(I);
    timeDiff = lagDiff/Fs;
    disp(timeDiff);
    
    %gcc+phat算法,根据公式写
    RGCC=fft(rcc);
    rgcc=ifft(RGCC*1./abs(RGCC));
    figure(5);
    plot(lag/Fs,rgcc);
    [M,I] = max(abs(rgcc));
    lagDiff = lag(I);
    timeDiff = lagDiff/Fs;
    disp(timeDiff);
    
    
    %计算角度,这里假设为平面波
    dis_r=tau*c;
    angel=acos(tau*c./(mic_d*2))*180/pi;
    if dis_s1<dis_s2
        angel=180-angel;
    end
    disp(angel);
    
    展开全文
  • 针对相位变换加权广义互相关方法( GCC-PHAT)对噪声的影响较为敏感的缺点,本文通过削弱噪音互谱、加权信 噪比、应用相干函数等手段对原始的相位变换加权函数( PHAT)进行了改进,得到了一种改进的相位变换加权函数 ( ...
  • GCC-PHAT算法

    千次阅读 2019-12-29 15:45:31
    GCC-PHAT是一个计算AOA的算法。 这里的AOA是指信号入射到与阵列垂直的线的夹角。 画个图做个示意: 这里AB为两个microphone, 虚线为入射信号,这里计算AOA的前提是信号是平面波,即两个虚线是平行的。 那么AOA即为...

    GCC-PHAT是一个计算AOA的算法。

    这里的AOA是指信号入射到与阵列垂直的线的夹角。
    画个图做个示意:

    在这里插入图片描述
    这里AB为两个microphone, 虚线为入射信号,这里计算AOA的前提是信号是平面波,即两个虚线是平行的。
    那么AOA即为 θ \theta θ, 范围为[-90,90]. 与AB垂直时,角度为0.

    这里AB的距离为L, τ \tau τ 为到达时间差,c为声音速度。

    假设到达两个microphone的信号为:
    在这里插入图片描述

    1. 用cross-correlation计算 τ \tau τ
      在这里插入图片描述
    2. 计算AOA β \beta β
      在这里插入图片描述
      这里有一个问题,就是当信噪比低时用cross-correlation直接计算得到的D不是太准。那么有一种方法,就是可以用PSD去做一个weight,效果会好很多。

    我们知道信号相关与PSD是一个傅里叶变换对,那么先求PSD:

    1. 求PSD
      在这里插入图片描述
    2. normalize PSD,再做傅里叶变换得到weight后的相关
      在这里插入图片描述
      3.求D
      在这里插入图片描述
      实践证明这种方式效果更好。需要注意的是,这里得到的只是AOA, 并不是对于平面上的旋转角和仰角。这个角的名字叫broadside angle of arrival, 三个角中,知道两个才能求另外一个,详情可以看这里

    只有两个microphone只能求AOA,但是三个不共线的microphone就可以求其他的角度了。

    对于任意一对麦克风k,j,有:
    在这里插入图片描述
    这里u是信号传播的单位向量。通过三对麦克风我们就可以求出u, 当然,如果你的麦克风数量更多,可以用最小二乘算出更精确的值;那么最后就可以求出旋转角和仰角:

    θ = t a n − 1 ( y x ) \theta=tan^{-1}(\frac{y}{x}) θ=tan1(xy)
    α = t a n − 1 ( z ( x 2 + y 2 ) ) \alpha=tan^{-1}(\frac{z}{\sqrt{(x^2+y^2)}}) α=tan1((x2+y2) z)

    最后聊一下AOA的精度:
    前面有
    在这里插入图片描述
    也就是说 β = a r c s i n ( c τ L ) \beta=arcsin(\frac{c\tau}{L}) β=arcsin(Lcτ)

    那么 τ \tau τ最小为 1 f \frac{1}{f} f1, 那么

    β = a r c s i n ( c L f ) \beta=arcsin(\frac{c}{Lf}) β=arcsin(Lfc)

    这里取c=340m/s, L=0.065m,f=44100Hz,得到

    β = 6.812 \beta=6.812 β=6.812°

    参考:Generalized cross-correlation

    展开全文
  • 麦克风阵列声源定位 GCC-PHAT   版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010592995/article/details/79735198 麦克风阵列声源定位(一) 利用麦克风阵列可以实现声源...

    麦克风阵列声源定位 GCC-PHAT

     

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010592995/article/details/79735198

    麦克风阵列声源定位(一)

    利用麦克风阵列可以实现声源到达方向估计(direction-of-arrival (DOA) estimation),DOA估计的其中一种方法是计算到达不同阵元间的时间差,另外一种可以看这里,这篇主要介绍经典的GCC-PHAT方法

    背景 
    简单说明问题背景,信号模型如下图,远场平面波,二元阵列 
    这里写图片描述

    要计算得到θθ,其实就是要求两个阵元接收到的信号时间差,现在问题变成到达时间差估计(Time-Difference-of-Arrival Estimation),因此,基于延时估计的DOA方法,其实也可以看做是分两步进行的,第一步是估计延时,第二步是计算角度,与之相对应的基于空间谱估计的DOA方法就是一步完成的。下面就分两步进行介绍

    1.延时估计

    1.1.互相关函数(cross-correlation function

    计算y1(k)y1(k)与y2(k)y2(k)的时间差,可以计算两个信号的互相关函数,找到使互相关函数最大的值即是这两个信号的时间差 
    离散信号的互相关函数 


    R(τ)=E[x1(m)x2(m+τ)]R(τ)=E[x1(m)x2(m+τ)]

     

    求时间差就是找到互相关函数最大时的点 


    D=argmaxR(n)D=argmaxR(n)

     

    说的那么简单,那就用代码验证下

    %%
    % Load the chirp signal.
    load chirp;
    c = 340.0;
    Fs = 44100;
    %%
    
    d = 0.25;
    N = 2;
    mic = phased.OmnidirectionalMicrophoneElement;
    % array = phased.URA([N,N],[0.0724,0.0418],'Element',mic);
    array = phased.ULA(N,d,'Element',mic);
    
    %%
    % Simulate the incoming signal using the |WidebandCollector| System
    % object(TM).
    arrivalAng = 42;
    collector = phased.WidebandCollector('Sensor',array,'PropagationSpeed',c,...
        'SampleRate',Fs,'ModulatedInput',false);
    signal = collector(y,arrivalAng);
    
    x1 = signal(:,1);
    x2 = signal(:,2);
    
    N =length(x2);
    xc = xcorr(x1,x2,'biased');
    [k,ind] = max(xc);
    an = acos((ind-N)/Fs*340/d)*180/pi
    
    xc12 = zeros(2*N-1,1);
    m = 0;
    for i = -(N-1):N-1
        m = m+1;
        for t = 1:N
            if 0<(i+t)&&(i+t)<=N
                xc12(m) = xc12(m) + x2(t)*x1(t+i);
            end 
        end
    end
    xc12 = xc12/N;

    以上程序中的循环就是上面的定义公式,运行程序可以看到循环部分计算的互相关与直接调用matlab的xcorr结果相同(注意matlab中互相关默认没做归一化),找到互相关函数的最大值就可以得到时间差 


    这里写图片描述

     

    1.2.广义互相关(generalized cross-correlation)

    理论上使用上面个介绍的CCF方法就可以得到时间差,但是实际的信号会有噪声,低信噪比会导致互相关函数的峰值不够明显,这会在找极值的时候造成误差。 
    为了得到具有更陡峭极值的互相关函数,一般在频域使用一个加权函数来白化输入信号,这就是经典的广义互相关方法。 
    由维纳-辛钦定理可知,随机信号的自相关函数和功率谱密度函数服从一对傅里叶变换的关系,即x1、x2x1、x2的互功率谱可由下式计算 


    P(ω)=∫+∞−∞R(τ)e−jωτdτP(ω)=∫−∞+∞R(τ)e−jωτdτ 


    R(τ)=∫+∞−∞P(ω)ejωτdωR(τ)=∫−∞+∞P(ω)ejωτdω

     

    这一步是把互相关函数变换到了频域,哦对,上面说到是想白化互相关函数,那就把上面第二式添加一个系数 


    R~(τ)=∫+∞−∞A(ω)P(ω)ejωτdωR~(τ)=∫−∞+∞A(ω)P(ω)ejωτdω

     

    设计不同的频域系数A(ω)A(ω)对应着不同方法,这里只介绍 PHAT(phase transform)方法,即取系数如下: 


    A(ω)=1|P(ω)|A(ω)=1|P(ω)|

     

    基本思想就是求时间差只需要相位信息,舍弃不相关的幅度信息以提高健壮性,可以看到当A(ω)=1A(ω)=1的情况下就是经典互相关 
    P(ω)P(ω)为复数,可以表示为|P(ω)|∗e−jωp|P(ω)|∗e−jωp,去掉幅度信息后,就只剩相位信息e−jωpe−jωp了,要得到相位信息,可以用P(ω)abs(P(ω))P(ω)abs(P(ω))计算,也可以直接用matlab中的angle函数计算,即angle(P(ω))angle(P(ω)),

    具体得到更陡峭的峰值的理论解释如下,详情参见《麦克风阵列信号处理》P198 


     
    这里写图片描述

     

    几行代码验证下:

    x1 = [1,2,3,7,9,8,3,7]';
    x2 = [4,5,6,5,4,3,8,2]';
    
    [tau,R,lag] = gccphat(x1,x2) 
    
    N = length(x1)+length(x2)-1;
    NFFT = 32;
    P = (fft(x1,NFFT).*conj(fft(x2,NFFT)));
    A = 1./abs(P);
    R_est1 = fftshift(ifft(A.*P));
    range = NFFT/2+1-(N-1)/2:NFFT/2+1+(N-1)/2;
    R_est1 = R_est1(range);
    
    R_est2 = fftshift(ifft(exp(1i*angle(P))));
    R_est2 = R_est2(range);
    

    可以看到,三种不同写法得到的R_est1 、R_est2 与matlab自带函数gccphat计算得到的R相等。

    那上面例子中的宽带语音信号,用GCC-PHAT方法得到具有陡峭峰值互相关函数,找到互相关最大时的点,结合采样频率Fs与与麦克风间距dFs与与麦克风间距d,就可以得到方向信息。频域计算互相关参考另一篇博客

    2.角度计算

    上面的内容计算了两个麦克风的延时,实际中假设阵列中麦克风个数为NN,则所有麦克风间两两组合共有N(N−1)/2N(N−1)/2对,记第kk个麦克风坐标为(xk,yk,zk)(xk,yk,zk),声源单位平面波传播向量u⃗ =(u,v,w)u→=(u,v,w),如果麦克风k,jk,j之间的延时为τkjτkj,则根据向量关系有下式,其中c为声速, 


    c∗τkj=−(xk→−xj→)∗u⃗ c∗τkj=−(xk→−xj→)∗u→

     

    这样看起来不够直观,那就代入坐标写成标量形式如下: 


    c∗τkj=u∗(xk−xj)+v∗(yk−yj)+w∗(zk−zj)c∗τkj=u∗(xk−xj)+v∗(yk−yj)+w∗(zk−zj)

     

    当有多个麦克风时,每两个麦克风就可以得到一组上式,N个麦克风就会有N∗(N−1)/2个等式N个麦克风就会有N∗(N−1)/2个等式,声源单位传播向量u⃗ =(u,v,w)u→=(u,v,w)有三个未知数,因此最少只需要三组等式,也就是三个麦克风就可以计算出声源方向,这里就先假定N=3N=3,可以得到方程组如下: 


    c∗τ21=u∗(x2−x1)+v∗(y2−y1)+w∗(z2−z1)c∗τ21=u∗(x2−x1)+v∗(y2−y1)+w∗(z2−z1) 
    c∗τ31=u∗(x3−x1)+v∗(y3−y1)+w∗(z3−z1)c∗τ31=u∗(x3−x1)+v∗(y3−y1)+w∗(z3−z1) 
    c∗τ23=u∗(x2−x3)+v∗(y2−y3)+w∗(z2−z3)c∗τ23=u∗(x2−x3)+v∗(y2−y3)+w∗(z2−z3)

     

    写成矩阵形式 


    这里写图片描述

     

    求出u⃗ =(u,v,w)u→=(u,v,w)后,由正余弦关系就有了角度值了 


    θ=acos(1w)θ=acos(1w) 


    α=acos(usin(acos(1w)))α=acos(usin(acos(1w)))

     

    当麦克风数量N>3N>3时,其实所有组合信息对于角度值的计算是有冗余的,这个时候可以求出所有组合的角度值,然后利用最小二乘求出最优解,这样可以利用到所有的麦克风的信息来提高角度估计的稳定性

    展开全文
  • 目录远场模型自由场信号模型互相关方法(Cross-Correlation,CC)广义互相关方法(Generalized Cross-correlation, GCCGCC-PHAT方法matlab实现 参考文献下载地址:Microphone_Array_Signal_Processing(中文版+英文...
  • 目前基于麦克风阵列的声源定位方法大致可以分为三类:基于最大输出功率的可控波束形成技术、基于高分辨率谱图估计技术和基于声音时间差(time-delay estimation,TDE)的声源...GCC-PHAT 基于广义互相关函数的时延估计
  • 如果将$\gamma_f$定义为$\frac{1}{|\phi_f^{xy}|}$,那么这种估计方法称为为GCC-PHAT。PAHT表示phase transform,因为做了幅值的归一化之后,相当于只留下了相位信息。 语音信号处理中,我们通常在短时频域上进行。...
  • 声源测向: TDOA-GCC-PATH方法

    千次阅读 2019-04-09 10:01:00
    声源测向: TDOA-GCC-PATH方法 ... 收藏链接:http://www.funcwj.cn/2018/05/10/gcc-phat-for-tdoa-estimate/ posted @ 2019-04-09 10:01 douzujun 阅读(...) 评论(...) 编辑 收藏 ...
  • 麦克风阵列声源定位 SRP-PHAT

    万次阅读 多人点赞 2018-08-11 14:35:59
    DOA  声源定位方法一般可...1.《SRP-PHAT-A High-Accuracy, Low-Latency Technique for Talker Localization in Reverberant Environments Using Microphone Arrays》 2. 《传感器阵列波束优化设计与应用》
  • gcc-2008-proceedings

    2011-01-20 12:40:43
    MILEPOST GCC: machine learning based research compiler 7 Grigori Fursin et al. Using GCC Instead of Grep and Sed 21 Taras Glek & David Mandelin Middle-End Array Expressions 33 Richard Guenther Adding ...
  • 通过广义互相关函数GCC求信号的时延,程序简单易懂
  • it is a these about sound source localization GCC-phat
  • 为了增强相位变换加权广义互相关方法(GCC-PHAT)这一常用时延估计方法对噪声的鲁棒性,提出了一种基于频率自适应选择的改进算法。该算法利用较短的语音数据(32ms)估计出每个频率的协方差矩阵,从而计算出每个频率...
  • 麦克风阵列语音增强beamforming算法

    万次阅读 2017-11-27 17:34:16
    delay and sum关键步骤在于计算延时, 可以通过GCC-PHAT方法进行计算, 即广义互相关-相位变换方法. GCC-PHAT(广义互相关-相位变换) x(n) x(n) 和y(n) y(n) 的互相关函数是将x(n) x(n) 保持不动, y(n) y(n) 左移m个...
  • 并实现经典的TDOA估计算法GCC-PHAT。 用法 apply-delay-and-sum,apply-gsc,apply-mvdr是三个容器,它们接受一个多通道wav文件并输出相应的单通道波束成形wav文件。 sh run.sh 档案清单 tdoa.h ds.h gsc.h mvdr.h是...
  • 该存储库包含一个工具,用于可视化基于GCC-PHAT的定位算法(请参见[0]和[1])。 它利用为以下目的编写的三元组插件: 特征提取,即实际的GCC-PHAT计算, 分类(线性SVM,然后是S型变换),以及 合并(即,将指定持续...
  • PHAT-开源

    2021-05-02 11:27:59
    PHAT(Princeton Hardcore管理员工具)旨在成为基于Web的(PHP / PostgreSQL)网络和系统管理门户,以帮助管理员收集和响应网络上发生的数据和事件。
  • GCC-PHAT:广义互相关-相变(TDOA估计) SRP-PHAT:转向响应功率-相位变换 参考文件 论文1 标题:近距离目标的到达方向(DOA)估计技术的比较 作者:瑙曼·安瓦尔·拜格(Nauman Anwar Baig)和穆罕默德·比拉勒·...
  • 具有相位变换的广义互相关(GCC-PHAT) 多信号分类(MUSIC) 对于声音分离: 延迟和(DAS) 最小方差无失真响应(MVDR) 线性约束最小方差(LCMV) 广义旁瓣抵消器(GSC),时间和频率变化以及基于SNR的动态梯度 ...
  • 我试图用python实现GCC-PHAT。在该方法类似于以下两个环节:link1和link2GCC-PHAT和使用FFT的正常互相关之间的唯一区别似乎是除以幅度。在这是我的代码:import numpy as npimport matplotlib.pyplot as pltfrom ...

空空如也

空空如也

1 2 3 4 5
收藏数 83
精华内容 33
关键字:

gcc-phat