互相关函数(Cross-Correlation Function)
公式定义
1. 离散信号
- 对于两个离散信号 x [ n ] x[n] x[n] 和 y [ n ] y[n] y[n],它们的互相关函数 R x y [ m ] R_{xy}[m] Rxy[m] 定义如下:
- m m m 为整数,表示延迟(lag)量。可以是正数(x 滞后于 y)、负数(x 超前于 y)或零(两者对齐)。
-
R
x
y
[
m
]
R_{xy}[m]
Rxy[m] 表示在延迟
m
m
m 时,信号
x
x
x 和
y
y
y 的相似程度。其幅值受信号幅值影响,因此一般用其归一化形式。
R x y [ m ] = ∑ n = − ∞ ∞ x [ n ] ⋅ y [ n + m ] R_{xy}[m] = \sum_{n=-\infty}^{\infty} x[n] \cdot y[n + m] Rxy[m]=n=−∞∑∞x[n]⋅y[n+m]
2. 连续信号
- 对于两个连续信号
x
(
t
)
x(t)
x(t) 和
y
(
t
)
y(t)
y(t),它们的互相关函数
R
x
y
(
τ
)
R_{xy}(\tau)
Rxy(τ) 定义如下:
R x y ( τ ) = ∫ − ∞ ∞ x ( t ) ⋅ y ( t + τ ) d t R_{xy}(\tau) = \int_{-\infty}^{\infty} x(t) \cdot y(t + \tau) \, dt Rxy(τ)=∫−∞∞x(t)⋅y(t+τ)dt
3. 归一化互相关函数
为了消除信号幅度的影响,常使用归一化互相关函数(Normalized Cross-Correlation),其公式如下:归一化后的互相关函数
R
x
y
(
τ
)
R_{xy}(\tau)
Rxy(τ) 的取值范围在
[
−
1
,
1
]
[-1, 1]
[−1,1] 之间,值越接近 1 表示两个信号在对应延迟下越相似。
R
x
y
(
τ
)
=
∑
n
x
[
n
]
⋅
y
[
n
+
τ
]
∑
n
x
[
n
]
2
⋅
∑
n
y
[
n
]
2
R_{xy}(\tau) = \frac{\sum_{n} x[n] \cdot y[n + \tau]}{\sqrt{\sum_{n} x[n]^2 \cdot \sum_{n} y[n]^2}}
Rxy(τ)=∑nx[n]2⋅∑ny[n]2∑nx[n]⋅y[n+τ]
代码及实验
- 在信号处理中,互相关法是一种重要的分析手段。互相关函数主要用于衡量两个信号在时间上的相似性。它通过滑动一个信号相对于另一个信号,并计算重叠部分的相似程度,来识别信号之间的时间对齐关系。
- 如下两个离散信号
x
[
n
]
x[n]
x[n] 和
y
[
n
]
y[n]
y[n],其互相关函数图如下:
- 从时域图可以看出,两个信号长得比较像,但怎么表达两个函数长得像呢? 我们直观可以感觉到,信号 y [ n ] y[n] y[n]要比 x [ n ] x[n] x[n]延迟一些,幅值小一些,但二者形状上是比较像的。
- 通过作互相关,我们可以计算出二者在不同时间差异下的相似程度,则相似程度最大处的横坐标,即代表了二者信号的相位差。
- 我们首先对信号进行取样,取样长度 N = 1000 N=1000 N=1000,互相关函数幅值最大处 τ = 961 \tau=961 τ=961,因此 961 − ( 1000 − 1 ) = − 38 961-(1000-1)=-38 961−(1000−1)=−38,即信号 x [ n ] x[n] x[n]要比 y [ n ] y[n] y[n]超前38个采样点的时间。
- matlab实验代码如下:
% MATLAB代码演示互相关的意义 close all; clear all; % 参数设置 Fs = 1000; % 采样频率 (Hz) t = 0:1/Fs:1-1/Fs; % 时间向量 (1秒) f = 5; % 信号频率 (Hz) delay = 40; % y(n)相对于x(n)的延迟样本数 similarity = 0.8; % 相似程度系数 (0到1之间) % 生成信号x(n) x = sin(2*pi*f*t); % 生成信号y(n),通过相似程度系数调整,并添加延迟 y = similarity * sin(2*pi*f*(t - delay/Fs)); % 绘制x(n)和y(n)的时域图 figure('Name','互相关函数演示','Position',[400,400,1200,800]); subplot(2,1,1); plot(t, x, 'b', 'LineWidth', 1.5); hold on; plot(t, y, 'r--', 'LineWidth', 1.5); title('信号x(n)和y(n)的时域图'); xlabel('时间 (s)'); ylabel('幅度'); legend('x(n)', 'y(n)'); grid on; % 计算互相关函数,使用 'biased' 选项 N = length(x); R_xy = xcorr(x, y, 'biased'); % 使用有偏互相关 % 找到互相关函数的最大值及其对应的位置 [max_corr, max_idx] = max(R_xy); lag_max = max_idx - (N - 1); % 绘制互相关函数 subplot(2,1,2); stem(0:length(R_xy)-1, R_xy, 'k', 'LineWidth', 1.5); title(['互相关函数 R_{xy}(\tau) (最大值 = ', num2str(max_corr), ')']); xlabel('延迟 \tau (样本)'); ylabel('互相关幅度'); grid on; % 标记最大值位置 hold on; plot(lag_max, max_corr, 'ro', 'MarkerFaceColor', 'r'); text(lag_max, max_corr, ['(\tau = ', num2str(lag_max), ')'], 'Color', 'r', 'VerticalAlignment', 'bottom'); hold off; % 显示延迟信息 fprintf('信号y(n)相对于x(n)的延迟为 %d 个样本。\n', lag_max);
- 实验结果如下:其中没有归一化,因此纵坐标表示的相似程度会受信号幅值影响。
- 归一化一般采用能量归一化,使用如下代码:
% 计算互相关函数,使用 'biased' 选项 N = length(x); R_xy_norm = xcorr(x, y, 'coeff');
- 归一化之后的结果如下图: