基本原理:分解+重构。小波分解是将原始信号通过一系列的低通和高通滤波器进行处理,把信号分解成不同尺度下的近似系数和细节系数。而小波重构则是分解的逆过程,它利用这些分解得到的系数,通过相应的低通和高通滤波器的逆变换,将系数重新组合还原成原始信号。
关键库:pywt
是 PyWavelets
库的别名,它是一个用于在 Python 中进行小波变换的开源库。小波变换是一种数学工具,类似于傅里叶变换,用于将信号分解成不同频率的成分。与傅里叶变换不同的是,小波变换能够同时提供信号的时间和频率信息,因此在信号处理、图像处理、数据分析等领域有着广泛的应用。
代码功能:利用自适应小波阈值滤波抑制正弦信号中的高频噪声。先生成含噪声的正弦信号,接着用 pywt.wavedec
进行小波分解得到各级系数,对细节系数自适应计算阈值并软阈值处理,再用 pywt.waverec
重构信号,最后绘图展示原始、含噪及去噪信号。
数据结构管理:代码中主要使用了 numpy
数组和 Python 列表。numpy
数组用于存储信号数据,如原始正弦信号、添加噪声后的信号以及重构后的信号。Python 列表 coeffs
和 new_coeffs
用于存储小波分解和处理后的系数。coeffs
存储多级分解得到的近似系数和细节系数,new_coeffs
存储经过自适应阈值处理后的系数。最后,基于 new_coeffs
列表中的系数和 numpy
数组的运算,使用 pywt.waverec
完成信号重构。
import pywt
import numpy as np
import matplotlib.pyplot as plt
# 生成正弦信号
t = np.linspace(0, 1, 1000)
signal = np.sin(2 * np.pi * 5 * t) # 5Hz 正弦信号
# 添加高斯噪声
noise = np.random.normal(0, 0.5, signal.shape)
noisy_signal = signal + noise
# 小波分解
wavelet = 'db4' # 选择小波基
level = 5 # 分解级别
coeffs = pywt.wavedec(noisy_signal, wavelet, level=level)
# 自适应阈值计算和软阈值处理
new_coeffs = []
for i, coeff in enumerate(coeffs):
if i == 0: # 近似系数不进行阈值处理
new_coeffs.append(coeff)
else:
# 计算自适应阈值
sigma = np.median(np.abs(coeff)) / 0.6745
threshold = sigma * np.sqrt(2 * np.log(len(coeff)))
# 软阈值处理
new_coeff = pywt.threshold(coeff, threshold, mode='soft')
new_coeffs.append(new_coeff)
# 小波重构
denoised_signal = pywt.waverec(new_coeffs, wavelet)
# 绘制结果
plt.figure(figsize=(12, 8))
plt.subplot(3, 1, 1)
plt.plot(t, signal, label='原始信号')
plt.title('原始信号')
plt.legend()
plt.subplot(3, 1, 2)
plt.plot(t, noisy_signal, label='带噪声的信号', color='orange')
plt.title('带噪声的信号')
plt.legend()
plt.subplot(3, 1, 3)
plt.plot(t, denoised_signal, label='去噪后的信号', color='green')
plt.title('去噪后的信号')
plt.legend()
plt.tight_layout()
plt.show()
输出结果: