Python小波分析庫Pywavelets的一點使用心得


# -*- coding: utf-8 -*-  
import numpy as np
import math
import matplotlib.pyplot as plt
import pandas as pd
import datetime 
from scipy import interpolate
from pandas import DataFrame,Series

import numpy as np  
import pywt  

data = np.linspace(1, 4, 7)  

# pywt.threshold方法講解:  
#               pywt.threshold(data,value,mode ='soft',substitute = 0 )  
#               data:數據集,value:閾值,mode:比較模式默認soft,substitute:替代值,默認0,float類型  

#data:   [ 1.   1.5  2.   2.5  3.   3.5  4. ]  
#output:[ 6.   6.   0.   0.5  1.   1.5  2. ]  
#soft 因為data中1小於2,所以使用6替換,因為data中第二個1.5小於2也被替換,2不小於2所以使用當前值減去2,,2.5大於2,所以2.5-2=0.5.....  

print(pywt.threshold(data, 2, 'soft',6))   


#data:   [ 1.   1.5  2.   2.5  3.   3.5  4. ]  
#hard data中絕對值小於閾值2的替換為6,大於2的不替換  
print (pywt.threshold(data, 2, 'hard',6))  


#data:   [ 1.   1.5  2.   2.5  3.   3.5  4. ]  
#data中數值小於閾值的替換為6,大於等於的不替換  
print (pywt.threshold(data, 2, 'greater',6) )

print (data  )
#data:   [ 1.   1.5  2.   2.5  3.   3.5  4. ]  
#data中數值大於閾值的,替換為6  
print (pywt.threshold(data, 2, 'less',6) )
[6.  6.  0.  0.5 1.  1.5 2. ]
[6.  6.  2.  2.5 3.  3.5 4. ]
[6.  6.  2.  2.5 3.  3.5 4. ]
[1.  1.5 2.  2.5 3.  3.5 4. ]
[1.  1.5 2.  6.  6.  6.  6. ]
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt

import pywt
import pywt.data


ecg = pywt.data.ecg()

data1 = np.concatenate((np.arange(1, 400),
                        np.arange(398, 600),
                        np.arange(601, 1024)))
x = np.linspace(0.082, 2.128, num=1024)[::-1]
data2 = np.sin(40 * np.log(x)) * np.sign((np.log(x)))

mode = pywt.Modes.smooth


def plot_signal_decomp(data, w, title):
    """Decompose and plot a signal S.
    S = An + Dn + Dn-1 + ... + D1
    """
    w = pywt.Wavelet(w)#選取小波函數
    a = data
    ca = []#近似分量
    cd = []#細節分量
    for i in range(5):
        (a, d) = pywt.dwt(a, w, mode)#進行5階離散小波變換
        ca.append(a)
        cd.append(d)

    rec_a = []
    rec_d = []

    for i, coeff in enumerate(ca):
        coeff_list = [coeff, None] + [None] * i
        rec_a.append(pywt.waverec(coeff_list, w))#重構

    for i, coeff in enumerate(cd):
        coeff_list = [None, coeff] + [None] * i
        if i ==3:
            print(len(coeff))
            print(len(coeff_list))
        rec_d.append(pywt.waverec(coeff_list, w))

    fig = plt.figure()
    ax_main = fig.add_subplot(len(rec_a) + 1, 1, 1)
    ax_main.set_title(title)
    ax_main.plot(data)
    ax_main.set_xlim(0, len(data) - 1)

    for i, y in enumerate(rec_a):
        ax = fig.add_subplot(len(rec_a) + 1, 2, 3 + i * 2)
        ax.plot(y, 'r')
        ax.set_xlim(0, len(y) - 1)
        ax.set_ylabel("A%d" % (i + 1))

    for i, y in enumerate(rec_d):
        ax = fig.add_subplot(len(rec_d) + 1, 2, 4 + i * 2)
        ax.plot(y, 'g')
        ax.set_xlim(0, len(y) - 1)
        ax.set_ylabel("D%d" % (i + 1))


#plot_signal_decomp(data1, 'coif5', "DWT: Signal irregularity")
#plot_signal_decomp(data2, 'sym5',
#                   "DWT: Frequency and phase change - Symmlets5")
plot_signal_decomp(ecg, 'sym5', "DWT: Ecg sample - Symmlets5")


plt.show()

72
5

 

 將數據序列進行小波分解,每一層分解的結果是上次分解得到的低頻信號再分解成低頻和高頻兩個部分。如此進過N層分解后源信號X被分解為:X = D1 + D2 + … + DN + AN 其中D1,D2,…,DN分別為第一層、第二層到等N層分解得到的高頻信號,AN為第N層分解得到的低頻信號。
————————————————
版權聲明:本文為CSDN博主「elite666」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/elite666/article/details/80687529


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM