给我一个用Python小波包降噪的示例
时间: 2024-03-09 19:44:49 浏览: 18
好的,以下是一个用Python实现小波包降噪的示例:
```python
import pywt
import numpy as np
import matplotlib.pyplot as plt
# 生成一个模拟信号
t = np.linspace(0, 1, 200, endpoint=False)
x = np.sin(2*np.pi*10*t) + np.sin(2*np.pi*20*t)
# 添加高斯白噪声
xn = x + np.random.randn(len(x)) * 0.5
# 构建小波包树
w = pywt.Wavelet('db4')
maxlevel = pywt.dwt_max_level(len(xn), w.dec_len)
wp = pywt.WaveletPacket(data=xn, wavelet='db4', mode='symmetric', maxlevel=maxlevel, start_level=0)
# 选取需要保留的小波包节点
nodes = ['a', 'd']
for level in range(maxlevel):
nodes += [node.path for node in wp.get_level(level+1) if node.path not in nodes]
# 将其余小波包系数置为0
for node in wp.get_level(maxlevel, 'naturalorder'):
if node.path not in nodes:
node.data.fill(0)
# 重构信号
xrec = wp.reconstruct(update=True)
# 绘制原始信号、带噪信号和降噪后的信号
plt.plot(t, x, 'r', label='Original signal')
plt.plot(t, xn, 'g', label='Noisy signal')
plt.plot(t, xrec, 'b', label='Denoised signal')
plt.legend()
plt.show()
```
在这个示例中,我们先生成一个模拟信号,然后添加高斯白噪声。接着,我们构建小波包树,并选取需要保留的小波包节点。最后,将其余小波包系数置为0,重构信号,得到降噪后的信号。最后,我们绘制出原始信号、带噪信号和降噪后的信号,以便比较它们的差异。