Python小波变换去噪的原理怎么理解
Admin 2022-05-23 群英技术资讯 645 次浏览
信号产生的小波系数含有信号的重要信息,将信号经小波分解后小波系数较大,噪声的小波系数较小,并且噪声的小波系数要小于信号的小波系数,通过选取一个合适的阀值,大于阀值的小波系数被认为是有信号产生的,应予以保留,小于阀值的则认为是噪声产生的,置为零从而达到去噪的目的。
小波阀值去噪的基本问题包括三个方面:小波基的选择,阀值的选择,阀值函数的选择。
(1) 小波基的选择:通常我们希望所选取的小波满足以下条件:正交性、高消失矩、紧支性、对称性或反对称性。但事实上具有上述性质的小波是不可能存在的,因为小波是对称或反对称的只有Haar小波,并且高消失矩与紧支性是一对矛盾,所以在应用的时候一般选取具有紧支的小波以及根据信号的特征来选取较为合适的小波。
(2) 阀值的选择:直接影响去噪效果的一个重要因素就是阀值的选取,不同的阀值选取将有不同的去噪效果。目前主要有通用阀值(VisuShrink)、SureShrink阀值、Minimax阀值、BayesShrink阀值等。
(3) 阀值函数的选择:阀值函数是修正小波系数的规则,不同的反之函数体现了不同的处理小波系数的策略。最常用的阀值函数有两种:一种是硬阀值函数,另一种是软阀值函数。还有一种介于软、硬阀值函数之间的Garrote函数。
另外,对于去噪效果好坏的评价,常用信号的信噪比(SNR)与估计信号同原始信号的均方根误差(RMSE)来判断。
#coding=gbk #使用小波分析进行阈值去噪声,使用pywt.threshold import pywt import numpy as np import pandas as pd import matplotlib.pyplot as plt import math data = np.linspace(1, 10, 10) print(data) # [ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.] # pywt.threshold(data, value, mode, substitute) mode 模式有4种,soft, hard, greater, less; substitute是替换值可以点进函数里看,data/np.abs(data) * np.maximum(np.abs(data) - value, 0) data_soft = pywt.threshold(data=data, value=6, mode='soft', substitute=12) print(data_soft) # [12. 12. 12. 12. 12. 0. 1. 2. 3. 4.] 将小于6 的值设置为12, 大于等于6 的值全部减去6 data_hard = pywt.threshold(data=data, value=6, mode='hard', substitute=12) print(data_hard) # [12. 12. 12. 12. 12. 6. 7. 8. 9. 10.] 将小于6 的值设置为12, 其余的值不变 data_greater = pywt.threshold(data, 6, 'greater', 12) print(data_greater) # [12. 12. 12. 12. 12. 6. 7. 8. 9. 10.] 将小于6 的值设置为12,大于等于阈值的值不变化 data_less = pywt.threshold(data, 6, 'less', 12) print(data_less) # [ 1. 2. 3. 4. 5. 6. 12. 12. 12. 12.] 将大于6 的值设置为12, 小于等于阈值的值不变
#-*-coding:utf-8-*- import matplotlib.pyplot as plt import pywt import math import numpy as np #get Data ecg=pywt.data.ecg() #生成心电信号 index=[] data=[] coffs=[] for i in range(len(ecg)-1): X=float(i) Y=float(ecg[i]) index.append(X) data.append(Y) #create wavelet object and define parameters w=pywt.Wavelet('db8')#选用Daubechies8小波 maxlev=pywt.dwt_max_level(len(data),w.dec_len) print("maximum level is"+str(maxlev)) threshold=0 #Threshold for filtering #Decompose into wavelet components,to the level selected: coffs=pywt.wavedec(data,'db8',level=maxlev) #将信号进行小波分解 for i in range(1,len(coffs)): coffs[i]=pywt.threshold(coffs[i],threshold*max(coeffs[i])) datarec=pywt.waverec(coffs,'db8')#将信号进行小波重构 mintime=0 maxtime=mintime+len(data) print(mintime,maxtime) plt.figure() plt.subplot(3,1,1) plt.plot(index[mintime:maxtime], data[mintime:maxtime]) plt.xlabel('time (s)') plt.ylabel('microvolts (uV)') plt.title("Raw signal") plt.subplot(3, 1, 2) plt.plot(index[mintime:maxtime], datarec[mintime:maxtime]) plt.xlabel('time (s)') plt.ylabel('microvolts (uV)') plt.title("De-noised signal using wavelet techniques") plt.subplot(3, 1, 3) plt.plot(index[mintime:maxtime],data[mintime:maxtime]-datarec[mintime:maxtime]) plt.xlabel('time (s)') plt.ylabel('error (uV)') plt.tight_layout() plt.show()
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
Python函数用法中定义、调用、参数传递和返回值是怎样的?下文的讲解详细,步骤过程清晰,对大家进一步学习和理解相关知识有一定的帮助。有这方面学习需要的朋友就继续往下看吧!
可以使用 >= 运算符判断当前集合是否为另一个集合的超集,即判断集合 b 中的所有元素是否都包含在集合 a 中。
这篇博客将介绍Canny边缘检测的概念,并利用cv2.Canny()实现边缘检测,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
bool() 函数用于将给定参数转换为布尔类型,如果没有参数,返回 False。 bool 是 int 的子类。
已知某公司旗下共有3款明星产品:产品A、产品B和产品C。为了解每款产品全年的销售额,公司对每款产品的年销售额进行了核算,核算之后的结果如表4-5所示。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008