温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

python小波变换去噪

发布时间:2020-07-14 06:46:25 来源:网络 阅读:3882 作者:nineteens 栏目:编程语言

  一,小波去噪原理:

  信号产生的小波系数含有信号的重要信息,将信号经小波分解后小波系数较大,噪声的小波系数较小,并且噪声的小波系数要小于信号的小波系数,通过选取一个合适的阀值,大于阀值的小波系数被认为是有信号产生的,应予以保留,小于阀值的则认为是噪声产生的,置为零从而达到去噪的目的。

  小波阀值去噪的基本问题包括三个方面:小波基的选择,阀值的选择,阀值函数的选择。

  (1) 小波基的选择:通常我们希望所选取的小波满足以下条件:正交性、高消失矩、紧支性、对称性或反对称性。但事实上具有上述性质的小波是不可能存在的,因为小波是对称或反对称的只有Haar小波,并且高消失矩与紧支性是一对矛盾,所以在应用的时候一般选取具有紧支的小波以及根据信号的特征来选取较为合适的小波。

  (2) 阀值的选择:直接影响去噪效果的一个重要因素就是阀值的选取,不同的阀值选取将有不同的去噪效果。目前主要有通用阀值(VisuShrink)、SureShrink阀值、Minimax阀值、BayesShrink阀值等。

  (3) 阀值函数的选择:阀值函数是修正小波系数的规则,不同的反之函数体现了不同的处理小波系数的策略。最常用的阀值函数有两种:一种是硬阀值函数,另一种是软阀值函数。还有一种介于软、硬阀值函数之间的Garrote函数。

  另外,对于去噪效果好坏的评价,常用信号的信噪比(SNR)与估计信号同原始信号的均方根误差(RMSE)来判断。

  二,在python中使用小波分析进行阈值去噪声,使用pywt.threshold函数

  #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_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, 小于等于阈值的值不变

  三,在python中使用ecg心电信号进行小波去噪实验

  import matplotlib.pyplot as plt

  import pywt

  # Get data:

  ecg = pywt.data.ecg() # 生成心电信号

  index = []

  data = []

  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.04 # Threshold for filtering

  # Decompose into wavelet components, to the level selected:

  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无锡人流多少钱 http://www.bhnfkyy.com/

  maxtime = mintime + len(data) + 1

  plt.figure()

  plt.subplot(2, 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)

  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()

  运行结果如下:

  python小波变换去噪


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI