Bootstrap

信号处理:互相关函数

互相关函数(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]2ny[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(10001)=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');
    
  • 归一化之后的结果如下图:
    在这里插入图片描述
;