时延估计之互相关方法(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(k−Dn)+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=Dj−Di,
其中
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(k−D1)+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(k−D2+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(k−D1)+b1(k)][α2s(k−D2+p)+b2(k+p)]]=E[α1α2s(k−D1)s(k−D2+p)+α1s(k−D1)b2(k+p)+α2b1(k)s(k−D2+p)+b1(k)b2(k+p)]=α1α2rss(p+D1−D2)+α1rsb2(p+D1)+α2rsb1(p−D2)+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+D1−D2),
当
p
=
D
2
−
D
1
p=D_2-D_1
p=D2−D1 时,互相关函数
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′=0∑K−1X1(ωk′)X2∗(ωk′)ejωk′p,
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);
测试结果