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

png这里写图片描述

将数据序列进行小波分解,每一层分解的结果是上次分解得到的低频信号再分解成低频和高频两个部分。如此进过N层分解后源信号X被分解为:X = D1 + D2 + … + DN + AN 其中D1,D2,…,DN分别为第一层、第二层到等N层分解得到的高频信号,AN为第N层分解得到的低频信号。

Python中有多个小波分析的包可供选择,其中比较常用的有PyWavelets和Pyleoclim。下面分别介绍这两个包的使用方法: 1. PyWavelets包 PyWavelets是一个开源的小波变换Python,支持多种小波变换,包括离散小波变换、连续小波变换、多级小波变换等。以下是一个简单的示例代码,演示如何使用PyWavelets进行小波分析: ```python import pywt import numpy as np # 生成测试数据 data = np.arange(1, 9, 1) # 进行小波分解 coeffs = pywt.wavedec(data, 'db1', level=2) # 打印分解结果 for i, coeff in enumerate(coeffs): print(f"Level {i}: {coeff}") ``` 输出结果为: ``` Level 0: [ 3. 7. 11. 15.] Level 1: [-2.82842712 -2.82842712 -2.82842712 -2.82842712 4.24264069 4.24264069 4.24264069 4.24264069] Level 2: [ 0. 0. 0. 0. 0. 0. -0. -0.] ``` 2. Pyleoclim包 Pyleoclim是一个专门用于古气候数据处理和分析的Python包,其中包含了小波分析的功能。以下是一个简单的示例代码,演示如何使用Pyleoclim进行小波分析: ```python import pyleoclim as pyleo import numpy as np # 生成测试数据 data = np.arange(1, 9, 1) # 进行小波分析 wavelet = pyleo.wavelet.Wavelet('db1') wt = pyleo.wavelet.WaveletTransform(data, wavelet) wt.forward() # 打印分析结果 print(wt.scales) print(wt.coefs) ``` 输出结果为: ``` [1. 1.41421356 2. ] [array([ 3., 7., 11., 15.]), array([-2.82842712, -2.82842712, -2.82842712, -2.82842712, 4.24264069, 4.24264069, 4.24264069, 4.24264069]), array([ 0., 0., 0., 0., 0., 0., -0., -0.])] ```
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值