信号处理工程师最头疼的莫过于面对一段未知特性的噪声数据——它究竟是平稳的还是非平稳的?这个问题直接决定了后续分析方法的选取。今天我们不谈艰深的理论,而是用MATLAB的autocorr函数,带你在5分钟内通过图形化分析掌握判断技巧。
工欲善其事,必先利其器。我们先来快速配置MATLAB环境:
matlab复制% 基础环境配置
clear all; close all; clc;
rng(2023); % 固定随机种子保证结果可复现
fs = 1000; % 采样频率1kHz
t = 0:1/fs:1; % 1秒时间序列
关键工具解析:
autocorr函数:本次分析的核心武器,计算并绘制信号自相关xcorr函数:更底层的互相关计算函数,可自定义归一化方式findpeaks函数:辅助识别自相关图中的特征峰提示:建议在运行代码前先执行
clear all清除工作区变量,避免旧数据干扰
理解差异最好的方式就是自己创造差异。我们先生成典型的平稳和非平稳噪声样本:
matlab复制% 高斯白噪声(典型平稳噪声)
stationary_noise = 0.5*randn(size(t));
figure;
subplot(2,1,1);
plot(t, stationary_noise);
title('平稳噪声时域波形');
xlabel('时间(s)'); ylabel('幅值');
subplot(2,1,2);
autocorr(stationary_noise);
title('自相关函数');
平稳噪声的特征:
matlab复制% 时变均值噪声(典型非平稳噪声)
nonstationary_noise = sin(2*pi*2*t) + 0.3*randn(size(t));
figure;
subplot(2,1,1);
plot(t, nonstationary_noise);
title('非平稳噪声时域波形');
xlabel('时间(s)'); ylabel('幅值');
subplot(2,1,2);
autocorr(nonstationary_noise);
title('自相关函数');
非平稳噪声的特征:
现在进入最关键的部分——如何通过自相关图判断信号特性。我们通过几个典型案例来掌握这个技能。
| 特征模式 | 平稳信号表现 | 非平稳信号表现 |
|---|---|---|
| 零延迟峰值 | 尖锐单峰 | 可能伴随次级峰 |
| 衰减速度 | 快速衰减到置信区间 | 缓慢衰减或周期性波动 |
| 置信区间 | 大部分延迟点在区间内 | 多个延迟点超出区间 |
matlab复制% 混合信号分析案例
mixed_signal = filter(1,[1 -0.9], randn(size(t))); % 有色噪声
figure;
autocorr(mixed_signal);
title('有色噪声自相关图');
注意:当看到自相关图缓慢衰减时,可能是有色噪声(一种特殊的平稳噪声),需要结合其他特征判断
除了肉眼观察,我们可以用代码量化分析:
matlab复制[acf, lags] = autocorr(mixed_signal, 'NumLags', 20);
acf_metrics = table(lags', acf, 'VariableNames', {'延迟点数','自相关系数'});
disp(acf_metrics);
% 计算衰减到0.2以内所需的延迟点数
decay_point = find(abs(acf)<0.2, 1);
disp(['衰减到0.2内所需延迟:' num2str(decay_point)]);
实际工程中常会遇到更复杂的情况,这里分享几个实用技巧:
对于时变特性明显的信号,可采用分段分析:
matlab复制segment_len = 100; % 每段100个采样点
for k = 1:floor(length(t)/segment_len)
segment = nonstationary_noise((k-1)*segment_len+1:k*segment_len);
[acf_seg] = autocorr(segment, 'NumLags', 15);
% 存储各段acf特征进行分析...
end
自相关与FFT联合分析可提高判断准确度:
matlab复制figure;
subplot(1,2,1);
autocorr(nonstationary_noise);
title('自相关');
subplot(1,2,2);
pwelch(nonstationary_noise,[],[],[],fs);
title('功率谱');
典型关联特征:
即使是经验丰富的工程师也会掉进这些陷阱:
周期性平稳信号:如正弦波+白噪声,自相关图也会呈现周期性
瞬态干扰:短时脉冲会影响自相关计算
数据长度不足:短数据会导致自相关估计不准
matlab复制% 数据长度影响演示
short_signal = nonstationary_noise(1:50);
figure;
autocorr(short_signal);
title('短数据自相关(可能失真)');
在实际项目中,我经常遇到传感器数据因环境干扰表现出伪非平稳特性。有次花了三天时间设计复杂算法,最后发现只是传感器供电不稳导致的。这个教训让我养成了先检查硬件再分析数据的习惯——自相关分析虽然强大,但也要考虑数据采集环节可能引入的假象。