提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
原理可参考:https://wenku.baidu.com/view/73439a6d5901020207409cd5.html
一、小波阈值
用例子介绍小波阈值去噪
参数说明
选取阈值的方法:直接影响去噪效果的一个重要因素就是阈值的选择,不同阈值选取将有不同的去噪效果。目前主要包括通用阈值(VisuShrink)、SureShrink阈值、 启发式阈值(HeurSure)、MinMax阈值。
阈值函数:阈值函数是修正小波系数的规则,不同的阈值函数体现了不同的处理小波系数的策略。常用的阈值函数有硬阈值函数(hard)、软阈值函数(soft)、介于软、硬阈值函数之间的Garrote函数。
小波函数:常用于小波分解去噪的小波函数包括db4、sym8 等。
分解层数:对于小波分解的层数一般依据经验得到,通常采用的层数为 5-8 层,分解的层数越多,得到的细节分量的频率越高。因时序信号通常有特定的采样频率 ,故分解层数不宜过高。
二、结合代码
1.分解
代码如下(示例):
path = 'D:/BaiduNetdiskDownload/打包/打包/12K轴承数据集/12k/g/fj/00.txt'
rd = np.loadtxt(path)#读取数据
methods_dict = {'visushrink': visu_shrink, 'sureshrink': sure_shrink, 'heursure': heur_sure, 'minmax': mini_max}
# 创建小波对象
wave = pywt.Wavelet('sym8')
# 分解 阈值处理
data_ = data[:]
(cA, cD) = pywt.dwt(data=rd, wavelet=wave)
var = get_var(cD) # 获取噪声方差
2.阈值去噪
代码如下(示例):
#定义sure_shrink阈值函数
def sure_shrink(var, coeffs):
N = len(coeffs)
sqr_coeffs = []
for coeff in coeffs:
sqr_coeffs.append(math.pow(coeff, 2))
sqr_coeffs.sort()
pos = 0
r = 0
for idx, sqr_coeff in enumerate(sqr_coeffs):
new_r = (N - 2 * (idx + 1) + (N - (idx + 1))*sqr_coeff + sum(sqr_coeffs[0:idx+1])) / N
if r == 0 or r > new_r:
r = new_r
pos = idx
thre = math.sqrt(var) * math.sqrt(sqr_coeffs[pos])
return thre
w = pywt.Wavelet('db8')
(cA, cD) = pywt.dwt(rd, w)
var = get_var(cD)
a = pywt.wavedec(rd, w, level=5) # 分解波
usecoeffs = []
usecoeffs.append(a[0]) # 向列表末尾添加对象
for k in a[1:]:
thre = sure_shrink(var, k)
k = pywt.threshold(k, thre, mode='soft')
usecoeffs.append(k) # 向列表末尾添加对象
recoeffs = pywt.waverec(usecoeffs, w)
3.重构
recoeffs = pywt.waverec(usecoeffs, w)
总结
cA, cD = pywt.dwt(signal, ‘wavelet’)
approximation coefficients = cA = 近似系数
detail coefficient = cD = 细节系数
一般近似系数代表信号中的低频信息,细节系数代表信号中的高频信息,低频信息则代表整段信号的整体特征,高频信息则代表信号中的细节特征