简介
处理的一维数据类型:.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.总结
如有疑问,欢迎指出。