import pywt
import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import math
####################一些参数和函数############
def sgn(num):
if(num > 0.0):
return 1.0
elif(num == 0.0):
return 0.0
else:
return -1.0
###软硬阈值折衷法 a 参数
a=0.3
#read data
data = pd.read_csv('C:\\Users\\1701\Desktop\\wt06860_1.csv')
#y_value为原信号
x1 = np.array(data['WIND_SPEED'])
y_values = data['REAL_POWER']
plt.subplot(211)
plt.scatter(x1, y_values, s=10)
#小波基的选取
db = pywt.Wavelet('db5')#选用db5小波
#[ca3, cd3, cd2, cd1] = pywt.wavedec(x1, db1)
maxlev = pywt.dwt_max_level(len(data), db.dec_len)#计算应该分几层
coeffs = pywt.wavedec(y_values, db, level=3)
recoeffs = pywt.waverec(coeffs, db)
print(recoeffs)
#求通用阈值
thcoeffs =[]
for i in range(1, len(coeffs)):
tmp = coeffs[i].copy()
Sum = 0.0
for j in coeffs[i]:
Sum = Sum + abs(j)
N = len(coeffs[i])
Sum = (1.0 / float(N)) * Sum
sigma = (1/0.6745)*Sum
lamda = sigma * math.sqrt(2.0 * math.log(float(N), math.e)) #采用通用的阈值
for k in range(len(tmp)):
if(abs(tmp[k]) >= lamda):
tmp[k] = sgn(tmp[k]) * (abs(tmp[k]) - a * lamda)
else:
tmp[k] = 0.0
thcoeffs.append(tmp)
#print(thcoeffs)
usecoeffs = []
usecoeffs.append(coeffs[0])
usecoeffs.extend(thcoeffs)
print(usecoeffs)
#recoeffs为去噪后信号
recoeffs = pywt.waverec(usecoeffs, db)
plt.subplot(212)
plt.scatter(x1, recoeffs, s=5)
plt.show()
**
**滤波完后发现效果不是很好,正在改进中。。。求大佬指导