Python实现小波变换去噪,利用Pywavelets处理脑电信号,代码参考

小波变换及pyWavelets的运用

  • 小波变换的数学原理
  • PyWavelets中几个函数的API
    • ==Wavelet==
    • ==Waverec==
    • ==threshold==
  • 代码
    • 注意事项以及我也没弄懂的地方

小波变换的数学原理

先略了,日后补上。

PyWavelets中几个函数的API

Wavelet

Waverec

threshold

代码

读取数据

// An highlighted block
import numpy as np
import matplotlib.pyplot as plt
import pywt
import pywt.data
from mne.io import concatenate_raws, read_raw_edf, read_raw_fif
from mne import read_events
import pyedflib
import math as m

file = pyedflib.EdfReader("S001R01.edf")
#number of channels: 64 信号信息
totalSignals = file.signals_in_file #totalSignals = 64
signal_labels = file.getSignalLabels() #label names of electrode in 10-10 system
#把data转为64x19920
''' -80 removes the ending 80 zero data points'''
data = np.zeros((totalSignals, file.getNSamples()[0]-80))
for i in np.arange(totalSignals):
    data[i, :] = file.readSignal(i)[:-80]

jupyternotebook绘图设置问题

plt.rcParams['figure.figsize'] = (20.0, 8.0)

小波变换,选用小波函数sym5

	mode =pywt.Modes.smooth
    w=pywt.Wavelet('sym5')
    a = data[23]
    ca = []
    cd = []
    for i in range(4):
        (a,d) = pywt.dwt(a,w,mode)
        ca.append(a)
        cd.append(d)
    sigmod=(np.median(abs(ca[3]))/0.6475)
    T=sigmod*m.sqrt(2*m.log(len(data[23]),10))
    lamda=T/(m.log(m.exp(1)+2*(len(ca[3])-1)))
    print (lamda)

通过阈值法来对A1部分进行阈值选择,其中阈值的选择如↑

ca[3]=pywt.threshold(data=ca[3], value=lamda, mode='soft', substitute=8*lamda)
coeff_list2 = [np.array(ca[3]),np.array(cd[3]),np.array(cd[2]),np.array(cd[1]),np.array(cd[0])]

newdata=pywt.waverec(coeff_list2,'sym5')
fig = plt.figure()
ax_main = fig.add_subplot(5,1,1)
ax_main.set_title('after')
ax_main.plot(newdata)
ax_main.set_xlim(0,len(newdata)-1)

ax = fig.add_subplot(5,1,2)
ax.set_title('orgin')
ax.plot(data[23])
ax.set_xlim(0,len(data[23])-1)
plt.show()

小波逆变换,并绘图

Python实现小波变换去噪,利用Pywavelets处理脑电信号,代码参考_第1张图片

注意事项以及我也没弄懂的地方

这里编译器是jupyter

你可能感兴趣的:(Python实现小波变换去噪,利用Pywavelets处理脑电信号,代码参考)