背景:假设想要提取一个周期信号的周期,但周期信号被噪声干扰,甚至已经无法直接得到信号周期,请问如何解决?
答:利用自相关函数找出被噪声掩盖的噪声周期。
一、算法原理
自相关函数的定义和特性详见:【20220627】【信号处理】自相关函数的定义、计算方法及应用
利用自相关函数 “周期信号的自相关函数依旧是同频率的周期信号” 的特性。该性质推导过程如下:
假设有一个周期信号为:
根据定义,其自相关函数为:
由于 的周期为 ,因此有:
则有:
因此,周期函数的自相关函数也为周期函数,并且周期等于原周期函数周期。
二、Matlab 仿真实例
自相关函数可以找出信号的重复模式(repeating patterns),如被噪声掩盖的周期信号,它常被用于信号处理中,用来分析函数或一系列值。
%% 自相关函数计算含噪信号周期
clear; clc; close all; warning off;
fs = 500; % 采样频率
Ts = 1 / fs; % 采样间隔
N = 1000; % 观测时长
t = (0 : N-1) * Ts;
f0 = 5; % 信号频率
xt = 5*cos(2 * pi * f0 * t) + 10*randn(1, N); % 周期函数叠加噪声
[R, tau] = xcorr(xt); % 计算自相关函数
figure(1); clf;
sp1 = subplot(2, 1, 1);
plot(xt, 'linewidth', 1.2); title('原始信号'); set(gca, 'fontsize', 14);
sp2 = subplot(2, 1, 2);
plot(tau(floor(N+1:end)), R(N+1:end), 'linewidth', 1.2); title('自相关函数曲线');
linkaxes([sp1, sp2], 'x');
set(gca, 'fontsize', 14);
set(gcf, 'position', [12, 60, 1450, 650]);
运行结果:
结果分析:原始信号中隐含了一个正弦函数,但从仿真图可以看出,原始信号已经受到了较强的噪声干扰,信号周期性已经不太明显,但周期信号的自相关函数依旧能够看出很强的周期性。当 时自相关最强,表现为自相关函数曲线取值最大;当 时,自相关函数取值最大;当 时,自相关函数取值最小。因此可以通过自相关函数曲线求出收到噪声干扰的周期信号的周期。