Python EMD分解重构降噪代码实现
EMD(Empirical Mode Decomposition,经验模态分解)是一种信号处理方法,用于将非平稳信号分解为一组固有模态函数(Intrinsic Mode Functions,IMFs)。下面是一个简单的Python代码示例,用于实现EMD分解、重构和降噪。
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import hilbert
def emd(signal, num_imfs):
imfs = []
residue = signal.copy()
for i in range(num_imfs):
# 提取当前IMF
imf = residue.copy()
imf_old = imf + 1
while np.sum(np.abs(imf - imf_old)) > 0.01:
imf_old = imf.copy()
# 计算均值和上、下包络
upper_envelope = get_envelope(imf, 'upper')
lower_envelope = get_envelope(imf, 'lower')
mean = (upper_envelope + lower_envelope) / 2
# 求解差分方程
imf = imf - mean
residue = residue - imf
imfs.append(imf)
imfs.append(residue)
return imfs
def get_envelope(signal, direction):
analytic_signal = hilbert(signal)
amplitude_envelope = np.abs(analytic_signal)
if direction == 'upper':
envelope = np.max(amplitude_envelope)
elif direction == 'lower':
envelope = np.min(amplitude_envelope)
return envelope
def reconstruct(imfs):
signal = np.sum(imfs, axis=0)
return signal
def denoise(signal, num_imfs):
imfs = emd(signal, num_imfs)
imfs[-1] = np.zeros_like(imfs[-1]) # 将最后一个IMF置零
denoised_signal = reconstruct(imfs)
return denoised_signal
# 示例使用
# 生成一个包含噪声的信号
t = np.linspace(0, 1, 1000)
signal = np.sin(2 * np.pi * 5 * t) + np.sin(2 * np.pi * 20 * t) + np.random.normal(0, 0.2, len(t))
# 对信号进行降噪
num_imfs = 5
denoised_signal = denoise(signal, num_imfs)
# 绘制原始信号和降噪后的信号
plt.figure(figsize=(10, 6))
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函数,用于将信号分解为一组IMFs。然后定义了get_envelope函数,用于计算信号的上、下包络。reconstruct函数用于将IMFs重构为原始信号。最后,denoise函数使用EMD分解、重构和降噪信号。
示例中使用了一个包含噪声的信号,并将其降噪为原始信号。可以根据需要修改信号和参数来进行实验。
原文地址: https://www.cveoy.top/t/topic/fHAi 著作权归作者所有。请勿转载和采集!