Python实现EMD分解重构降噪算法及代码示例
Python实现EMD分解重构降噪算法及代码示例
本文介绍如何使用Python实现经验模态分解 (EMD) 算法进行信号降噪。EMD是一种自适应的信号分解方法,特别适用于非线性、非平稳信号的分析。
代码实现
以下是一个使用EMD分解重构降噪的Python代码示例:pythonimport numpy as npimport matplotlib.pyplot as pltfrom scipy.signal import hilbert
def emd(signal, num_imfs): imfs = [] residue = signal.copy() for i in range(num_imfs): imf = residue.copy() while True: maxima = np.maximum(imf, 0) minima = np.minimum(imf, 0) max_env = hilbert(maxima) min_env = hilbert(-minima) mean_env = (max_env + min_env) / 2 imf_prev = imf imf = imf - mean_env if np.sum(np.abs(imf - imf_prev)) < 0.01: break imfs.append(imf) residue = residue - imf return imfs, residue
def reconstruct(imfs, residue): signal = residue.copy() for imf in imfs: signal += imf return signal
def denoise(signal, num_imfs): imfs, residue = emd(signal, num_imfs) denoised_signal = reconstruct(imfs, residue) return denoised_signal
示例用法# 生成带噪声的信号t = np.linspace(0, 1, 1000)signal = np.sin(2 * np.pi * 5 * t) + np.sin(2 * np.pi * 10 * t) + np.random.normal(0, 0.2, 1000)
使用EMD分解重构降噪denoised_signal = denoise(signal, num_imfs=2)
绘制原始信号和降噪后的信号plt.figure(figsize=(10, 4))plt.subplot(2, 1, 1)plt.plot(t, signal)plt.title('Original Signal')plt.subplot(2, 1, 2)plt.plot(t, denoised_signal)plt.title('Denoised Signal')plt.tight_layout()plt.show()
代码解析
-
emd(signal, num_imfs)函数: - 接受信号数据和分解的IMF数量作为输入。 - 使用循环迭代提取IMF分量。 - 在每次迭代中,通过计算上下包络线和均值来提取IMF。 - 返回提取的IMF列表和残差信号。 -
reconstruct(imfs, residue)函数: - 接受IMF列表和残差信号作为输入。 - 将所有IMF分量和残差信号相加,重构原始信号。 -
denoise(signal, num_imfs)函数: - 接受信号数据和分解的IMF数量作为输入。 - 调用emd函数进行EMD分解。 - 调用reconstruct函数重构信号,实现降噪。
示例用法
代码中示例部分首先生成了一个包含两个频率成分的模拟信号,并添加了高斯白噪声。然后,调用 denoise 函数对信号进行降噪处理,并将原始信号和降噪后的信号绘制出来进行对比。
总结
本文介绍了如何使用Python实现EMD分解重构降噪算法,并提供了完整的代码示例。EMD算法作为一种自适应的信号分解方法,在处理非线性、非平稳信号方面具有独特的优势,可以有效地应用于信号降噪和其他信号处理任务。
原文地址: https://www.cveoy.top/t/topic/fHAY 著作权归作者所有。请勿转载和采集!