一,小波去噪原理:
信号产生的小波系数含有信号的重要信息,将信号经小波分解后小波系数较大,噪声的小波系数较小,并且噪声的小波系数要小于信号的小波系数,通过选取一个合适的阀值,大于阀值的小波系数被认为是有信号产生的,应予以保留,小于阀值的则认为是噪声产生的,置为零从而达到去噪的目的。
Python一维信号的小波分解去噪重构(理解好这个,以下程序比较容易懂)
二、程序
- 在python中使用ecg心电信号进行小波去噪实验(含部分解析)
# 使用小波分析进行阈值去噪声,使用pywt.threshold
'''
1.准备数据
2.创建小波对象并定义参数
3.小波分解
4.小波重构
5.绘图
'''
import matplotlib.pyplot as plt
import pywt
# Get data:
ecg = pywt.data.ecg() # 生成心电信号,这是pywt自带的数据集
index = []
data = []
for i in range(len(ecg)-1):
X = float(i)
Y = float(ecg[i])
index.append(X)
data.append(Y)
# 创建小波对象并定义参数:
w = pywt.Wavelet('db8') # 选用Daubechies8小波
maxlev = pywt.dwt_max_level(len(data), w.dec_len)
print("maximum level is " + str(maxlev))
threshold = 0.04 # Threshold for filtering
# 分解为小波分量,直至选定的水平:
coeffs = pywt.wavedec(data, 'db8', level=maxlev) # 将信号进行小波分解
plt.figure()
for i in range(1, len(coeffs)):
coeffs[i] = pywt.threshold(coeffs[i], threshold*max(coeffs[i])) # 将噪声滤波
datarec = pywt.waverec(coeffs, 'db8') # 将信号进行小波重构
mintime = 0
maxtime = mintime + len(data) + 1
plt.figure()
plt.subplot(2, 1, 1) #两行1列第一个位置
plt.plot(index[mintime:maxtime], data[mintime:maxtime])
plt.xlabel('time (s)')
plt.ylabel('microvolts (uV)')
plt.title("Raw signal")
plt.subplot(2, 1, 2) #两行1列第二个位置
plt.plot(index[mintime:maxtime], datarec[mintime:maxtime-1])
plt.xlabel('time (s)')
plt.ylabel('microvolts (uV)')
plt.title("De-noised signal using wavelet techniques")
plt.tight_layout() #自动调整子图参数,使之填充整个图像区域
plt.show()
三、结果