基于小波变换的时间序列降噪

栏目: 编程工具 · 发布时间: 6年前

内容简介:由于生产环境中各类因素的影响,使得监控数据特别是时间序列数据里存在许多噪声。这些噪声严重影响了进一步的定量分析和数据挖掘,有必要预先去噪。但是时间序列本身具有非线性和信噪比高的特点,采用传统的高斯去噪、中值滤波等方法往往存在诸多缺陷。而小波理论是根据时频局部化的要求而发展起来的,具有自适应和数学显微镜性质,特别适合非平稳、非线性信号的处理。关于小波变换数学推导详见

0x00 背景

由于生产环境中各类因素的影响,使得监控数据特别是时间序列数据里存在许多噪声。这些噪声严重影响了进一步的定量分析和数据挖掘,有必要预先去噪。

但是时间序列本身具有非线性和信噪比高的特点,采用传统的高斯去噪、中值滤波等方法往往存在诸多缺陷。而小波理论是根据时频局部化的要求而发展起来的,具有自适应和数学显微镜性质,特别适合非平稳、非线性信号的处理。

0x01 小波去噪的基本原理

关于小波变换数学推导详见 Wavelet

小波顾名思义就是一个很小的波,其积分大概为0,小波按照形状种类分为六种。小波分解个人觉得类似于傅里叶变换,就是将已有的波分解为很多个可以小的波形。

时间序列去噪采用的较广泛的方法为非线性阈值处理法,其原理是通过小波变换后有用信号的能量集中于少数小波系数上,而白噪声在小波变换域上仍然分散在大量小波系数之上。因而相对来说,有用信号的小波系数值必然大于那些能量分散且幅值较小的噪声的小波系数值。因此,从频谱的幅度上看,有用信号和噪声可以实现分离。该方法主要步骤为:

  1. 选择合适的正交小波基和分解层数j,对含噪信号进行小波变换分解到j层;

  2. 对分解得到的小波系数进行阈值处理,可以使用两种处理方法:硬阈值和软阈值法。

硬阈值法保留较大的小波系数并将较小的小波系数置零;软阈值法将较小的小波系数置零,而对较大的小波系数向零收缩。根据相关推导证明了软阈值法去噪后的估计信号是原始信号的近似最优估计,并且具有更广泛的适用性。

关于分解层数的问题,根据多分辨率分析理论,高层分解的小波系数对应的是低频部分,而低频部分主要由信号构成。因此分解层次越高,去掉的低频成分越多,去噪效果越明显,但失真度也增大。为保守起见,分解层次不宜太高,最大不超过5层。对波动性更强的序列如CPU-time序列,一般不超过4层。根据我这段时间对线上时间序列监控数据的实践来讲,基于db4小波函数分解到3-4层可以取得不错的效果。

0x02 Matlab 实现一维小波降噪

常用库函数

  • wavedec: 一维信号的多尺度分解,将返回诸多细节系数和每个系数的长度;
  • waverec: 一维信号小波分解系数的重构,将返回重构后的信号;
  • wdencmp: 对一维或二维信号的压缩或者去噪;

降噪效果

基于小波变换的时间序列降噪

从上图中可以看出,小波降噪的效果还是比较理想的。

Matlab代码

clc;  
clear;  
% 获取噪声信号  
S=importdata('data_0391');
sig = S(1:1400);

% 信号的分解  
[c,l]=wavedec(sig,4,'db4');

%提取四层细节分量和近似分量
a1=appcoef(c,l,'db4',1);
d1=detcoef(c,l,1);
a2=appcoef(c,l,'db4',2);
d2=detcoef(c,l,2);
a3=appcoef(c,l,'db4',3);
d3=detcoef(c,l,3);
a4=appcoef(c,l,'db4',4);
d4=detcoef(c,l,4);

% 重构小波分解向量,其中第一、二层的细节分量被置零
dd1=zeros(size(d1));
dd2=zeros(size(d2)); 
c1=[a4 d4 d3 dd2 dd1];
aa1=waverec(c1,l,'db4');

% 作图  
subplot(211),   
plot(sig), title('原始噪声信号');  
plot(212)
plot(aa1,'b')
title('1&2层的细节分量置零后的重构信号')

0x03 Python 实现一维小波降噪

pyWavelet 的主要特点:

  1. 类似 Matlab Wavelet Toolbox 的使用;
  2. 1D, 2D 正反离散小波变换;
  3. 70 多个内置小波滤波器。

Python代码

import pywt

# 小波滤噪
def wavelet_denoising(data):
    # 小波函数取db4
    db4 = pywt.Wavelet('db4')
    if type(data) is not types.NoneType:
        # 分解
        coeffs = pywt.wavedec(data, db4)
        # 高频系数置零
        coeffs[len(coeffs)-1] *= 0
        coeffs[len(coeffs)-2] *= 0
        # 重构
        meta = pywt.waverec(coeffs, db4)
        return meta

参考文献

[1] https://www.wikiwand.com/en/Wavelet

[2] https://www.kancloud.cn/digest/imageproebow/122469

[3] https://pywavelets.readthedocs.io/en/latest/

[4] https://github.com/PyWavelets/pywt


以上所述就是小编给大家介绍的《基于小波变换的时间序列降噪》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

疯狂HTML 5/CSS 3/JavaScript讲义

疯狂HTML 5/CSS 3/JavaScript讲义

李刚 / 电子工业出版社 / 2012-5-1 / 69.00元

疯狂HTML 5/CSS 3/JavaScript讲义,ISBN:9787121168635,作者:李刚 编著一起来看看 《疯狂HTML 5/CSS 3/JavaScript讲义》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具