1bit数字信号互相关系数的计算
最近的一个项目里面需要对1bit的数字信号做相关,没有找到非常直接的解答,所以把互相关系数在数字信号的情况下做了一个推导,并用matlab验证了其正确性
推导过程
首先,我们将X和Y视为两个相同长度N的信号,每个信号都有两个可能的取值:0和1。
并且我们有以下定义:
- N11:表示X和Y同时为1的样本数量。
- N00:表示X和Y同时为0的样本数量。
- N10:表示X为1且Y为0的样本数量。
- N01:表示X为0且Y为1的样本数量。
接下来,我们用这些参数来估计协方差和标准差。
协方差的定义为:
C o v ( X , Y ) = E ( ( X − μ X ) ∗ ( Y − μ Y ) ) Cov(X, Y) = E((X-μX)*(Y-μY)) Cov(X,Y)=E((X−μX)∗(Y−μY))
其中,X和Y是对应的随机变量。μX是X的期望值(均值)。μY是Y的期望值(均值)。
将X和Y的样本均值代入协方差的定义中,可以得到:
C o v ( X , Y ) = E ( ( X − μ X ) ∗ ( Y − μ Y ) ) = E ( ( X − ( N 11 + N 10 ) / N ∗ X ) ∗ ( Y − ( N 11 + N 01 ) / N ∗ Y ) ) Cov(X, Y) = E((X-μX)*(Y-μY)) = E((X - (N11 + N10)/N*X) * (Y - (N11 + N01)/N*Y)) Cov(X,Y)=E((X−μX)∗(Y−μY))=E((X−(N11+N10)/N∗X)∗(Y−(N11+N01)/N∗Y))
= E ( X Y − X ( N 11 + N 01 ) / N − Y ( N 11 + N 10 ) / N + ( N 11 + N 01 ) ( N 11 + N 10 ) / ( N 2 ) ) = E(XY - X(N11 + N01)/N - Y(N11 + N10)/N + (N11 + N01)(N11 + N10)/(N^2)) =E(XY−X(N11+N01)/N−Y(N11+N10)/N+(N11+N01)(N11+N10)/(N2))
展开每一项:
E
(
X
Y
)
=
(
N
11
/
N
)
E(XY) = (N11 / N)
E(XY)=(N11/N)
E ( X ( N 11 + N 01 ) / N ) = ( N 11 + N 10 ) / N ∗ ( N 11 + N 01 ) / N E(X(N11 + N01)/N) = (N11 + N10)/N*(N11 + N01)/N E(X(N11+N01)/N)=(N11+N10)/N∗(N11+N01)/N
E ( Y ( N 11 + N 10 ) / N ) = ( N 11 + N 01 ) / N ∗ ( N 11 + N 10 ) / N E(Y(N11 + N10)/N) = (N11 + N01)/N*(N11 + N10)/N E(Y(N11+N10)/N)=(N11+N01)/N∗(N11+N10)/N
E ( ( N 11 + N 01 ) ( N 11 + N 10 ) / ( N 2 ) ) = ( N 11 + N 10 ) ( N 11 + N 01 ) / ( N 2 ) E((N11 + N01)(N11 + N10)/(N^2)) = (N11 + N10)(N11 + N01) / (N^2) E((N11+N01)(N11+N10)/(N2))=(N11+N10)(N11+N01)/(N2)
因此,将这些项代回协方差的表达式中,我们得到:
C
o
v
(
X
,
Y
)
=
(
N
11
∗
N
00
−
N
10
∗
N
01
)
/
N
2
Cov(X, Y) =(N11 * N00 - N10 * N01) /N^2
Cov(X,Y)=(N11∗N00−N10∗N01)/N2
σX:同理对于X的标准差,我们有:
σ
X
=
s
q
r
t
(
(
N
11
+
N
10
)
∗
(
N
01
+
N
00
)
/
N
2
)
σX = sqrt((N11 + N10) * (N01 + N00)/N^2)
σX=sqrt((N11+N10)∗(N01+N00)/N2)
σY:同理对于Y的标准差,我们有:
σ
Y
=
s
q
r
t
(
(
N
10
+
N
00
)
∗
(
N
11
+
N
01
)
/
N
2
)
σY = sqrt((N10 + N00) * (N11 + N01)/N^2)
σY=sqrt((N10+N00)∗(N11+N01)/N2)
接下来,我们可以将这些结果代入互相关系数的定义,得到:
r
=
C
o
v
(
X
,
Y
)
/
(
σ
X
∗
σ
Y
)
=
(
N
11
∗
N
00
−
N
10
∗
N
01
)
/
s
q
r
t
(
(
N
11
+
N
10
)
(
N
01
+
N
00
)
(
N
10
+
N
00
)
(
N
11
+
N
01
)
)
r = Cov(X, Y) / (σX * σY) = (N11 * N00 - N10 * N01) / sqrt((N11 + N10) (N01 + N00) (N10 + N00) (N11 + N01))
r=Cov(X,Y)/(σX∗σY)=(N11∗N00−N10∗N01)/sqrt((N11+N10)(N01+N00)(N10+N00)(N11+N01))
MATLAB仿真验证
计算1bit相关系数的代码如下
function [N11, N00, N10, N01, N1x, Nx0, r] = crossCorrelation(signal1, signal2)
N = length(signal1);
N11 = 0;
N00 = 0;
N10 = 0;
N01 = 0;
for i = 1:N
if signal1(i) && signal2(i)
N11 = N11 + 1;
elseif ~signal1(i) && ~signal2(i)
N00 = N00 + 1;
elseif signal1(i) && ~signal2(i)
N10 = N10 + 1;
elseif ~signal1(i) && signal2(i)
N01 = N01 + 1;
end
end
r = (N11 * N00 - N10 * N01) / sqrt((N11 + N01) * (N11 + N10) * (N00 + N01) * (N00 + N10));
end
与定义式计算结果比较
% 生成随机的二进制信号
N = 1000; % 信号长度
signal1 = randi([0, 1], 1, N);
% signal2 = randi([0, 1], 1, N);
noise= randi([0, 1], 1, 500);
signal2=[signal1(1:500),noise];
% 计算互相关系数
[N11, N00, N10, N01, N1x, Nx0, r] = crossCorrelation(signal1, signal2);
% 验证结果
cov_matrix = cov(signal1, signal2); % 计算协方差矩阵
cov_xy = cov_matrix(1, 2); % 获取信号1和信号2的协方差
std_x = std(signal1); % 计算信号1的标准差
std_y = std(signal2); % 计算信号2的标准差
r_verify = cov_xy / (std_x * std_y); % 计算验证的互相关系数
% 打印结果
disp(['N11: ', num2str(N11)]);
disp(['N00: ', num2str(N00)]);
disp(['N10: ', num2str(N10)]);
disp(['N01: ', num2str(N01)]);
disp(['计算得到的互相关系数 r: ', num2str(r)]);
disp(['验证的互相关系数 r_verify: ', num2str(r_verify)]);
结果如下