python小波变换_一维数据小波阈值去噪-python实现

简介

处理的一维数据类型:.asc微震文件

小波层数:5 小波基:sym8

阈值公式:

,cD1为第一层分解的细节系数,N为数据长度

阈值函数:软硬阈值折中的方法

2.代码

#模块调用

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

import math

import pywt

#封装成函数

def sgn(num):

if(num > 0.0):

return 1.0

elif(num == 0.0):

return 0.0

else:

return -1.0

def wavelet_noising(new_df):

data = new_df

data = data.values.T.tolist() # 将np.ndarray()转为列表

w = pywt.Wavelet('sym8')

# [ca3, cd3, cd2, cd1] = pywt.wavedec(data, w, level=3) # 分解波

[ca5, cd5, cd4, cd3, cd2, cd1] = pywt.wavedec(data, w, level=5) # 分解波

length1 = len(cd1)

Cd1 = np.array(cd1)

abs_cd1 = np.abs(Cd1)

median_cd1 = np.median(abs_cd1)

sigma = (1.0 / 0.6745) * median_cd1

lamda = sigma * math.sqrt(2.0 * math.log(float(length1), math.e))

usecoeffs = []

usecoeffs.append(ca5) # 向列表末尾添加对象

#软硬阈值折中的方法

a = 0.5

for k in range(length1):

if (abs(cd1[k]) >= lamda):

cd1[k] = sgn(cd1[k]) * (abs(cd1[k]) - a * lamda)

else:

cd1[k] = 0.0

length2 = len(cd2)

for k in range(length2):

if (abs(cd2[k]) >= lamda):

cd2[k] = sgn(cd2[k]) * (abs(cd2[k]) - a * lamda)

else:

cd2[k] = 0.0

length3 = len(cd3)

for k in range(length3):

if (abs(cd3[k]) >= lamda):

cd3[k] = sgn(cd3[k]) * (abs(cd3[k]) - a * lamda)

else:

cd3[k] = 0.0

length4 = len(cd4)

for k in range(length4):

if (abs(cd4[k]) >= lamda):

cd4[k] = sgn(cd4[k]) * (abs(cd4[k]) - a * lamda)

else:

cd4[k] = 0.0

length5 = len(cd5)

for k in range(length5):

if (abs(cd5[k]) >= lamda):

cd5[k] = sgn(cd5[k]) * (abs(cd5[k]) - a * lamda)

else:

cd5[k] = 0.0

usecoeffs.append(cd5)

usecoeffs.append(cd4)

usecoeffs.append(cd3)

usecoeffs.append(cd2)

usecoeffs.append(cd1)

recoeffs = pywt.waverec(usecoeffs, w)

return recoeffs

#主函数

path ='C:\\Users\\Administrator\\Desktop\\data\\08_863628460_0005_0.asc'#数据路径

#提取数据

data = pd.read_csv(path)

data = data.iloc[:, 1]

plt.plot(data)

plt.show()

print(data)

data_denoising = wavelet_noising(data)#调用小波去噪函数

plt.plot(data_denoising)#显示去噪结果

3.去噪效果

去噪前:

去噪后:

4.总结

如有疑问,欢迎指出。

你可能感兴趣的:(python小波变换)