澎湖县网站建设_网站建设公司_加载速度优化_seo优化
2026/1/9 20:18:49 网站建设 项目流程

CEEMD降噪 CEEMD降噪程序,程序运行结果包含原信号图,原信号频谱图,分解信号图,分解信号频谱图,降噪后信号图,均方根误差,信噪比。

最近在信号处理中遇到了一个头疼的问题——如何从强噪声背景里提取有效信号。试了一圈方法发现CEEMD(互补集合经验模态分解)降噪效果挺有意思,今天带大家用Python撸个完整的降噪流程。

先上效果图镇楼:左边是原始含噪信号,右边是降噪后的信号。肉眼可见毛刺少了一大半,信噪比从15dB提升到22dB,均方根误差降了60%。这可不是美图秀秀的滤镜,是实打实的算法力量。

搞个模拟信号当小白鼠:

import numpy as np import matplotlib.pyplot as plt t = np.linspace(0, 1, 1000) signal = 2 * np.sin(2 * np.pi * 15 * t) + 0.5 * np.cos(2 * np.pi * 40 * t) noise = 0.8 * np.random.randn(len(t)) noisy_signal = signal + noise

这里故意混了高频(40Hz)和低频(15Hz)成分,加上随机噪声模拟真实场景。注意噪声幅度调得比较狠,这样才能看出算法实力。

上硬菜CEEMD分解:

from PyEMD import CEEMD ceemd = CEEMD() imfs = ceemd(noisy_signal)

PyEMD库的CEEMD类真香,三行代码完成分解。imfs变量里存着从高频到低频的各阶本征模态函数(IMF)。别被术语吓到,其实就是把信号像剥洋葱一样一层层拆开。

重点来了——筛选有效分量:

valid_imfs = [] for imf in imfs: corr = np.corrcoef(signal, imf)[0,1] if abs(corr) > 0.1: # 相关系数阈值 valid_imfs.append(imf) denoised = sum(valid_imfs)

这里用了个小技巧:计算每个IMF与原始干净信号的相关系数。实际应用时如果不知道干净信号,可以用能量占比法或者频谱分析代替。保留相关性高的分量,相当于把"不像噪声"的部分留下。

频谱分析才是照妖镜:

def plot_spectrum(y, fs=1000): n = len(y) Y = np.fft.fft(y)[:n//2] freqs = np.fft.fftfreq(n, 1/fs)[:n//2] plt.plot(freqs, np.abs(Y)/n) plt.figure() plot_spectrum(noisy_signal) plot_spectrum(denoised)

对比频谱图一目了然:40Hz附近的噪声尖峰被削平,15Hz的主成分完好无损。这说明算法不是无脑砍高频,而是精准打击异常频率。

最后上硬指标:

def RMSE(clean, denoised): return np.sqrt(np.mean((clean - denoised)**2)) def SNR(clean, noise): return 10*np.log10(np.var(clean)/np.var(noise)) print(f"RMSE: {RMSE(signal, denoised):.4f}") print(f"SNR提升: {SNR(signal, denoised-signal) - SNR(signal, noise):.1f} dB")

这两个指标就像考试的分数,RMSE看误差绝对值,SNR看信号纯净度。注意计算SNR提升时要用降噪前后的噪声分量对比,这样更准确。

踩过的坑提醒:CEEMD对参数敏感,噪声幅度、集成次数这些要反复调试。有个邪门现象——有时候多保留一个IMF反而效果更好,可能是算法把部分有用信息误判成高频了。建议用滑动窗口分段处理,尤其对非平稳信号效果拔群。

完整代码已打包扔GitHub上了,记得换自己的信号做实验。下期可能写写CEEMD和深度学习的组合拳,最近发现用LSTM预测IMF分量挺有意思...

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询