从白噪声里提周期信号,用自适应滤波器搞定就挺省心的。尤其是 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
就能实现核心逻辑。想调效果,记得多试试NuD这些参数,滤波性能差别还挺大的。

如果你也在做信号或者实时滤波相关的项目,蛮推荐直接用 MATLAB 跑这个 LMS 算法,省心又直观。下面这些资源也可以参考着看看,代码和都还不错: