从白噪声里提周期信号,用自适应滤波器搞定就挺省心的。尤其是 LMS 算法,简单又实用,代码也不复杂,用 MATLAB 一跑就出效果。像那种被高斯白噪声污染的正弦信号,分分钟能滤出来。延迟设个D=50
,收敛因子u
可以试下 0.001 和 0.02,效果不一样。误差信号一画,滤波效果立马就能看出来。
信号是s=sin(2*pi*t/10)
,周期 10,t
从 0 跑到 400,高斯白噪声用awgn
函数加,噪声设成 15dB 比较常见。LMS 就是通过更新权重w
,不断把误差e(n)
压下去。预测值y(n)
和真实值一比,有没有收敛一眼就看出来。
你也可以拿它来搞干扰对消,比如正弦形式的窄带干扰,同样加高斯噪声。滤波器还是能稳稳地干掉它。图一画出来,输入、期望、输出一对比,效果一目了然。
代码不长,用
for n = N+1:length(x)
x1 = x(n:-1:n-N+1);
y(n) = w' * x1;
e(n) = d(n) - y(n);
w = w + u * x1 * e(n);
end
就能实现核心逻辑。想调效果,记得多试试N
、u
、D
这些参数,滤波性能差别还挺大的。如果你也在做信号或者实时滤波相关的项目,蛮推荐直接用 MATLAB 跑这个 LMS 算法,省心又直观。下面这些资源也可以参考着看看,代码和都还不错: