最近在学习小波阈值去噪的python实现方法,看了很多原理性的文章,但在实现的过程中还是遇到点麻烦,这里分享一个1D多阶的小波降噪示例:
运行结果:第一张图是正弦函数加入高斯噪声的原始数据,第二张图是降噪后的效果。
import pywt import matplotlib.pyplot as plt import random import numpy as np # 在0-2*pi的区间上生成100个点作为输入数据 X = np.linspace(0,2*np.pi,100,endpoint=True) Y = np.sin(2*X) # 对输入数据加入gauss噪声 # 定义gauss噪声的均值和方差 mu = 0 sigma = 0.12 for i in range(X.size): # X[i] += random.gauss(mu,sigma) Y[i] += random.gauss(mu,sigma) # 画出这些点 # plt.plot(X,Y,linestyle='-',marker='.') # plt.show() # print(Y) # w= pywt.Wavelet("db6") # cA1,cD1 =pywt.dwt(Y,wavelet=w,mode="constant") # print() # print(cA1) # print(cD1) print() # coeffs =pywt.wavedec(Y,wavelet="db6",level=4) # print(coeffs) #需要导入matplotlib.pyplot ,pywt, numpy 和pandas模块。 import matplotlib.pyplot as plt import pywt import numpy as np import pandas as pd s = Y wavelet = "db6" #将需要的数据保存在列表s中 w=pywt.wavedec(s, wavelet,level=3)#小波分解,pywt.wavedec(数据, 小波基,分解尺度) ### 分解得到的w是一个列表,w[0]是最大尺度的近似系数,w[1]是最大尺度的细节系数,w[2]是次大尺度的细节系数,以此类推 N=len(s) thr=round(np.sqrt(2*np.log(N)),4)#阈值获取,方式为sqtwolog for i in range(1,len(w)): print(w[i]) w[i]=pywt.threshold(w[i], thr,mode='soft') #阈值处理函数 rec_s=pywt.waverec(w, wavelet)#小波重构 plt.subplot(211) plt.plot(s,linewidth=0.5) plt.subplot(212) plt.plot(rec_s,linewidth=0.5) plt.show()
参考链接:(124条消息) 正在学习python小波阈值降噪,记录一下_stc30kt11的博客-CSDN博客_python 小波降噪