时延估计之互相关方法(Cross-Correlation Method, CC)

时延估计之互相关方法(Cross-Correlation Method, CC)

信号模型

在一个声学环境中,假如声场中只有一个麦克风,则传声器的输出信号可以写为:
x n ( k ) = α n s ( k − D n ) + b n ( k ) , x_n\left( k \right) =\alpha _ns\left( k-D_n \right) +b_n\left( k \right) , xn(k)=αns(kDn)+bn(k),
其中 α n \alpha _n αn满足 0 < α n < 1 0<\alpha _n<1 0<αn<1为一个衰减因子(由于声传播过程中的能量衰减), D n D_n Dn为从声源到麦克风之间的传播时间, s ( k ) s(k) s(k)为语音信号,通常被认为是宽带信号, b n ( k ) b_n(k) bn(k)为高斯随机噪声,通常认为声源信号与噪声信号是不相关的。在这个模型下,第 i i i个声源与 j j j个声源之间的到达时间差(TDOA)可以写作:
τ i j = D j − D i , \tau _{ij}=D_j-D_i, τij=DjDi,
其中 i , j = 1 , 2 , ⋯   , N , i,j=1,2,\cdots ,N, i,j=1,2,,N, i ≠ j i\ne j i=j,而时延估计(TDE)的目的就是得到 τ i j \tau_{ij} τij的估计 τ i j ^ \hat{\tau_{ij}} τij^

互相关方法(Cross-Correlation Method)

假如现在有两个传感器,每个传感器的输出分别用 x 1 ( k ) x_1(k) x1(k) x 2 ( k ) x_2(k) x2(k)表示,则两个信号之间的互相关函数可以写作:
r x 1 x 2 ( p ) = E [ x 1 ( k ) x 2 ( k + p ) ] . r_{x_1x_2}\left( p \right) =E\left[ x_1\left( k \right) x_2\left( k+p \right) \right] . rx1x2(p)=E[x1(k)x2(k+p)].
则由上面的第一个式子, x 1 ( k ) x_1(k) x1(k) x 2 ( k ) x_2(k) x2(k)表示为:
x 1 ( k ) = α 1 s ( k − D 1 ) + b 1 ( k ) , x_1\left( k \right) =\alpha _1s\left( k-D_1 \right) +b_1\left( k \right) , x1(k)=α1s(kD1)+b1(k),
x 2 ( k + p ) = α 2 s ( k − D 2 + p ) + b 2 ( k + p ) , x_2\left( k+p \right) =\alpha _2s\left( k-D_2+p \right) +b_2\left( k+p \right) , x2(k+p)=α2s(kD2+p)+b2(k+p),
r x 1 x 2 ( p ) = E [ [ α 1 s ( k − D 1 ) + b 1 ( k ) ] [ α 2 s ( k − D 2 + p ) + b 2 ( k + p ) ] ] = E [ α 1 α 2 s ( k − D 1 ) s ( k − D 2 + p ) + α 1 s ( k − D 1 ) b 2 ( k + p ) + α 2 b 1 ( k ) s ( k − D 2 + p ) + b 1 ( k ) b 2 ( k + p ) ] = α 1 α 2 r s s ( p + D 1 − D 2 ) + α 1 r s b 2 ( p + D 1 ) + α 2 r s b 1 ( p − D 2 ) + r b 1 b 2 ( p ) . r_{x_1x_2}\left( p \right) =E\left[ \left[ \alpha _1s\left( k-D_1 \right) +b_1\left( k \right) \right] \left[ \alpha _2s\left( k-D_2+p \right) +b_2\left( k+p \right) \right] \right] \\ =E\left[ \alpha _1\alpha _2s\left( k-D_1 \right) s\left( k-D_2+p \right) +\alpha _1s\left( k-D_1 \right) b_2\left( k+p \right) +\alpha _2b_1\left( k \right) s\left( k-D_2+p \right) +b_1\left( k \right) b_2\left( k+p \right) \right] \\ =\alpha _1\alpha _2r_{ss}\left( p+D_1-D_2 \right) +\alpha _1r_{sb_2}\left( p+D_1 \right) +\alpha _2r_{sb_1}\left( p-D_2 \right) +r_{b_1b_2}\left( p \right) . rx1x2(p)=E[[α1s(kD1)+b1(k)][α2s(kD2+p)+b2(k+p)]]=E[α1α2s(kD1)s(kD2+p)+α1s(kD1)b2(k+p)+α2b1(k)s(kD2+p)+b1(k)b2(k+p)]=α1α2rss(p+D1D2)+α1rsb2(p+D1)+α2rsb1(pD2)+rb1b2(p).
通过上面的假设: b n ( k ) b_n(k) bn(k)是高斯序列,且与源信号和其他传感器上的噪声不相关,则上式可以简化为:
r x 1 x 2 ( p ) = α 1 α 2 r s s ( p + D 1 − D 2 ) , r_{x_1x_2}\left( p \right) =\alpha _1\alpha _2r_{ss}\left( p+D_1-D_2 \right) , rx1x2(p)=α1α2rss(p+D1D2),
p = D 2 − D 1 p=D_2-D_1 p=D2D1 时,互相关函数 r x 1 x 2 r_{x_1x_2} rx1x2达到最大,所以通过互相关函数,我们可以得到 x 1 ( k ) x_1(k) x1(k) x 2 ( k ) x_2(k) x2(k)之间的TDOA为:
τ ^ 12 = a r g max ⁡ p    r x 1 x 2 ( p ) , \hat{\tau}_{12}=\mathrm{arg} \underset{p}{\max}\,\,r_{x_1x_2}\left( p \right) , τ^12=argpmaxrx1x2(p),
其中 p ∈ [ − τ m a x , τ m a x ] p\in[-\tau_{\rm max}, \tau_{\rm max}] p[τmax,τmax].

在实际的应用中我们可以通过借助FFT等高效计算相关函数:
r ^ x 1 x 2 ( p ) = 1 K ∑ k ′ = 0 K − 1 X 1 ( ω k ′ ) X 2 ∗ ( ω k ′ ) e j ω k ′ p , \hat{r}_{x_1x_2}\left( p \right) =\frac{1}{K}\sum_{k^{\prime}=0}^{K-1}{X_1\left( \omega _{k^{\prime}} \right) X_{2}^{*}\left( \omega _{k^{\prime}} \right) e^{j\omega _{k^{\prime}}p}}, r^x1x2(p)=K1k=0K1X1(ωk)X2(ωk)ejωkp,

Matlab代码

互相关方法函数的代码:

function [tau] = CC_function(X_mat,block_size)
%CC_FUNCTION : Cross-Correlation method for time delay estimation
%   input:
%           Xmat: multi-channel signal matrix,
%           block_size: snapshot length
%   output:
%           tau: TDE parameters 
M = size(X_mat,2);
data_length = size(X_mat,1);
% block_size = 2048;
x1_vect = X_mat(1:block_size,1);
x2_vect = X_mat(1:block_size,2);
%% Method.1 Using Matlab XCORR funciotn
% CCF = xcorr(x1_vect,x2_vect);
% half_CCF = CCF(ceil(length(CCF)/2)+1:end); %% remove r_xy(<=0)


%% Method.2 Using FFT
x1_fft = fft(x1_vect);
x2_fft = fft(x2_vect);
CCF = ifft((x1_fft.*conj(x2_fft)));
half_CCF = CCF(2:end); %% remove r_xy(0) 

%% time delay parameter
[value,tau] = max(half_CCF);
end

这里用了两种方法来计算互相关,一种是Matlab自带的xcorr函数,另一种是使用FFT来计算互相关函数。

测试代码:

clc
clear

% 读取音频文件
[h,fs] = audioread('yourpath\RWCP_type1_rir_circle_ane_imp320.wav');

% 对h的第一列求绝对值最大值和对应的索引
[value1,D_1] = max(abs(h(:,1)));

% 对h的第四列求绝对值最大值和对应的索引
[value2,D_2] = max(abs(h(:,4)));

% 计算实际的时间差
real_TDE = abs(D_2 - D_1);

% 读取语音文件
[x,fs] = audioread('yourpath\your speech file.wav',[1,fs]);

% 将x与h的第一列进行卷积
x1_vect = conv(x,h(:,1));

% 将x与h的第四列进行卷积
x2_vect = conv(x,h(:,4));

% 构建X矩阵,包含x1_vect和x2_vect
X_mat = [x1_vect, x2_vect];

% 定义块大小为1024
block_size = 1024;

% 调用CC_function函数计算估计的时间差
[estimated_TDE] = CC_function(X_mat, block_size);

测试结果
在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值