溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python小波變換去噪

發(fā)布時間:2020-07-14 06:46:25 來源:網(wǎng)絡(luò) 閱讀:3890 作者:nineteens 欄目:編程語言

  一,小波去噪原理:

  信號產(chǎn)生的小波系數(shù)含有信號的重要信息,將信號經(jīng)小波分解后小波系數(shù)較大,噪聲的小波系數(shù)較小,并且噪聲的小波系數(shù)要小于信號的小波系數(shù),通過選取一個合適的閥值,大于閥值的小波系數(shù)被認為是有信號產(chǎn)生的,應(yīng)予以保留,小于閥值的則認為是噪聲產(chǎn)生的,置為零從而達到去噪的目的。

  小波閥值去噪的基本問題包括三個方面:小波基的選擇,閥值的選擇,閥值函數(shù)的選擇。

  (1) 小波基的選擇:通常我們希望所選取的小波滿足以下條件:正交性、高消失矩、緊支性、對稱性或反對稱性。但事實上具有上述性質(zhì)的小波是不可能存在的,因為小波是對稱或反對稱的只有Haar小波,并且高消失矩與緊支性是一對矛盾,所以在應(yīng)用的時候一般選取具有緊支的小波以及根據(jù)信號的特征來選取較為合適的小波。

  (2) 閥值的選擇:直接影響去噪效果的一個重要因素就是閥值的選取,不同的閥值選取將有不同的去噪效果。目前主要有通用閥值(VisuShrink)、SureShrink閥值、Minimax閥值、BayesShrink閥值等。

  (3) 閥值函數(shù)的選擇:閥值函數(shù)是修正小波系數(shù)的規(guī)則,不同的反之函數(shù)體現(xiàn)了不同的處理小波系數(shù)的策略。最常用的閥值函數(shù)有兩種:一種是硬閥值函數(shù),另一種是軟閥值函數(shù)。還有一種介于軟、硬閥值函數(shù)之間的Garrote函數(shù)。

  另外,對于去噪效果好壞的評價,常用信號的信噪比(SNR)與估計信號同原始信號的均方根誤差(RMSE)來判斷。

  二,在python中使用小波分析進行閾值去噪聲,使用pywt.threshold函數(shù)

  #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 的值設(shè)置為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 的值設(shè)置為12, 其余的值不變

  data_greater = pywt.threshold(data, 6, 'greater', 12)

  print(data_greater)

  # [12. 12. 12. 12. 12. 6. 7. 8. 9. 10.] 將小于6 的值設(shè)置為12,大于等于閾值的值不變化

  data_less = pywt.threshold(data, 6, 'less', 12)

  print(data_less)

  # [ 1. 2. 3. 4. 5. 6. 12. 12. 12. 12.] 將大于6 的值設(shè)置為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') # 將信號進行小波重構(gòu)

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

  運行結(jié)果如下:

  python小波變換去噪


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI