原理讲解

傅里叶变换
关于傅里叶变换的基本概念在此我们就不再赘述了,
下面我们主要将傅里叶变换的不足。即我们知道傅里叶变化可以分析信号的频谱,那么为什么还要提出小波变换?答案“对非平稳过程,傅里叶变换有局限性”。看如下一个简单的信号:

做完FFT(傅里叶变换)后,可以在频谱上看到清晰的四条线,信号包含四个频率部分。一切没有问题,但是,如果是非平稳信号呢?

如上图,最上边的是频率始终不变的平稳信号。而下边两个则是频率随着时间改变的非平稳信号,它们同样包含和最上信号相同频率的四个成分。做FFT后,我们发现这三个时域上有巨大差异的信号,频谱(幅值谱)却非常一致。尤其是下边两个非平稳信号,我们从频谱上无法区分它们,因为它们包含的四个频率的信号的成分确实是一样的,只是出现的先后顺序不同。
可见,傅里叶变换处理非平稳信号有先天缺陷。它只能获取一段信号总体上包含哪些频率的成分,但是对各成分出现的时刻并无所知。因此,时域相差很大的两个信号,可能频谱一样。

然而平稳信号大多是制造出来的,自然界的大量信号几乎都是非平稳的。
短时傅里叶变换

一个简单可行的方法就是——加窗。 “把整个时域过程分解成无数个等长的小过程,每个小过程近似平稳,再傅里叶变换,就知道在哪个时间点上出现了什么频率了。”这就是短时傅里叶变换。
看图:

时域上分成一段一段做FFT,不就知道频率成分随着时间的变化情况了吗?
使用STFT存在一个问题,我们应该用多宽的窗函数?
窗太宽太窄都有问题:

小波变换
那么你可能会想到,让窗口大小变起来,多做几次STFT不就可以了吗?!没错,小波变换就有着这样的思路。
但事实上小波并不是这么做的(有人认为“小波变换就是根据算法,加不等长的窗,对每一小部分进行傅里叶变换”,这是不准确的。小波变换并没有采用窗的思想,更没有做傅里叶变换。)
至于为什么不采用可变窗的STFT呢,我认为是因为这样做冗余会太严重,STFT做不到正交化,这也是它的一大缺陷。
于是小波变换的出发点和STFT还是不同的。STFT是给信号加窗,分段做FFT;而小波直接把傅里叶变换的基给换了——将无限长的三角函数基换成了有限长的会衰减的小波基。这样不仅能够获取频率,还可以定位到时间了~
解释:
来我们回顾一下傅里叶变换吧,没弄清傅里叶变换为什么能得到信号各个频率成分的同学也可以再借我的图理解下。
傅里叶变换把无限长的三角函数作为基函数:

这个基函数会伸缩,平移(其实是两个正交基的分解)。缩得窄,对应高频;伸得宽,对应低频。然后这个基函数不断和信号做相乘。某一个尺度(宽窄)下乘出来的结果,就可以理解成信号所包含的当前尺度对应频率成分有多少。于是,基函数会在某些尺度下,与信号相乘得到一个很大的值,因为此时二者有一种重合关系。那么我们就知道信号包含该频率的成分的多少。

看,这两种尺度能乘出一个大的值(相关度高),所以信号包含较多的这两个频率成分,在频谱上这两个频率会出现两个峰。

以上,就是粗浅意义上傅里叶变换的原理。
如前边所说,小波做的改变就在于,将无限长的三角函数基换成了有限长的会衰减的小波基。

从公式可以看出,不同于傅里叶变换,变量只有频率ω,小波变换有两个变量:尺度a(scale)和平移量 τ(translation)。尺度a控制小波函数的伸缩,平移量 τ控制小波函数的平移。尺度就对应于频率(反比),平移量 τ就对应于时间。

当伸缩、平移到这么一种重合情况时,也会相乘得到一个大的值。这时候和傅里叶变换不同的是,这不仅可以知道信号有这样频率的成分,而且知道它在时域上存在的具体位置。

而当我们在每个尺度下都平移着和信号乘过一遍后,我们就知道信号在每个位置都包含哪些频率成分。

原理部分参考文献
原理部分参考来源

小波变换原理

感谢大佬,感谢大佬。

代码部分

简单例子,python版
读取数据

import matplotlib.pyplot as plt
import matplotlib; matplotlib.use('TkAgg')
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
import pywt
import pywt.data
txt = pd.read_csv('电价.csv',header=None,names=['时间','当前时刻电价'])
print(txt.head())


#小波降噪与重构画图

txt=np.array(txt)
def plot_signal_decomp(data, w,title):data = data[:, -1]  # 只对电价数据进行去噪重构mode = pywt.Modes.smooth"""Decompose and plot a signal S.S = An + Dn + Dn-1 + ... + D1"""w = pywt.Wavelet(w)#选取小波函数a = dataca = []#近似分量cd = []#细节分量for i in range(1):(a, d) = pywt.dwt(a, w, mode)#进行1阶离散小波变换ca.append(a)cd.append(d)rec_a = []rec_d = []for i, coeff in enumerate(ca):coeff_list = [coeff, None] + [None] * irec_a.append(pywt.waverec(coeff_list, w))#重构for i, coeff in enumerate(cd):coeff_list = [None, coeff] + [None] * irec_d.append(pywt.waverec(coeff_list, w))fig = plt.figure()plt.subplot(3, 1,1)plt.plot(data,label='原始电价数据曲线')plt.legend()plt.subplot(3, 1,2)plt.plot(rec_a[-1],'r', label='电价数据曲线趋势')plt.legend()plt.subplot(3, 1,3)plt.plot(rec_d[0],'g', label='电价数据曲线噪声')plt.legend()plt.show()
plot_signal_decomp(txt, 'sym5','sym5')#这里选择sym5小波,小波还有

#获取重构后的趋势部分和噪声

def choose(data, w):data=data[:,-1]#只对电价数据进行去噪重构mode = pywt.Modes.smoothw = pywt.Wavelet(w)  # 选取小波函数a = dataca = []  # 近似分量cd = []  # 细节分量for i in range(1):#1阶变换(a, d) = pywt.dwt(a, w, mode)  # 进行1阶离散小波变换 dwt为分解ca.append(a)cd.append(d)rec_a = []rec_d = []for i, coeff in enumerate(ca):coeff_list = [coeff, None] +[None] * i#填充长度rec_a.append(pywt.waverec(coeff_list, w))  # waverec重构rec_a=np.array(rec_a[-1])#-1取最后一个基波rec_a=rec_a.reshape(-1,1)for i, coeff in enumerate(cd):coeff_list = [None, coeff] + [None] * irec_d.append(pywt.waverec(coeff_list, w))#取出所有噪声波,1阶变换,有3个噪声rec_d=np.array(rec_d)return  rec_a,rec_d#取出趋势,噪声
trainingrec_a, trainingrec_d=choose(txt, 'sym5')#训练集电价趋势 和噪声

trainingrec_a为趋势
trainingrec_d为噪声

算例2 多阶变换 代码


import numpy as np
import matplotlib.pyplot as plt
import matplotlib; matplotlib.use('TkAgg')
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
import pywt #导入小波包#==============生成数据==============
X=np.random.uniform(90,100,100) #生成范围90-100的数,数据100个#============小波绘图==============
def plot_signal_decomp(data, w,title):""":param data: 要进行小波分解重构的数据:param w: 小波基名称:param title: 绘图名称:return: 图"""mode = pywt.Modes.smoothw = pywt.Wavelet(w)  # 选取小波函数a = dataca = []  # 近似分量 ,趋势cd = []  # 细节分量,噪声n=3   #定义阶数,这里定义3阶for i in range(n):#3阶(a, d) = pywt.dwt(a, w, mode)  # 进行n阶离散小波变换ca.append(a)#存放趋势cd.append(d)#存储噪声rec_a = []#存放重构后的趋势rec_d = []#存放重构后的噪声for i, coeff in enumerate(ca):coeff_list = [coeff, None] + [None] * irec_a.append(pywt.waverec(coeff_list, w))  # 重构for i, coeff in enumerate(cd):coeff_list = [None, coeff] + [None] * irec_d.append(pywt.waverec(coeff_list, w))print('趋势个数len(rec_a):',len(rec_a))print('噪声个数len(rec_d):',len(rec_d))#趋势只要最后一个,噪声全要。 加原始数据个数。所以子图个数=n+1+2fig = plt.figure()for  i  in range(n+2):if i==n+1:plt.subplot(n+2, 1, i+1)plt.plot(data, label='原数据曲线')plt.legend()elif i==n:plt.subplot(n+2, 1, i+1)plt.plot(rec_a[-1], 'g', label='数据曲线趋势')plt.legend()else:plt.subplot(n+2, 1, i+1)plt.plot(rec_d[i], 'r', label='数据曲线噪声%d'%(i+1))plt.legend()plt.show()plot_signal_decomp(X, 'sym5','sym5')#这里选择sym5小波,小波还有#=======获取重构后的数据========
def choose(data, w):""":param data: 要进行小波分解重构的数据:param w: 小波基:return: 趋势 和噪声"""mode = pywt.Modes.smoothw = pywt.Wavelet(w)  # 选取小波函数a = dataca = []  # 近似分量cd = []  # 细节分量n = 3  # 定义阶数,这里定义3阶for i in range(n):  # 3阶(a, d) = pywt.dwt(a, w, mode)  # 进行n阶离散小波变换ca.append(a)  # 存放趋势cd.append(d)  # 存储噪声rec_a = []  # 存放重构后的趋势rec_d = []  # 存放重构后的噪声for i, coeff in enumerate(ca):coeff_list = [coeff, None] + [None] * irec_a.append(pywt.waverec(coeff_list, w))  # 重构for i, coeff in enumerate(cd):coeff_list = [None, coeff] + [None] * irec_d.append(pywt.waverec(coeff_list, w))#返回最后一个趋势、所有噪声 return rec_a[-1],rec_dtrainingrec_a, trainingrec_d=choose(X, 'sym5')#所有趋势 和噪声
print('趋势\n',trainingrec_a)
print('噪声1\n',trainingrec_d[0])
print('噪声2\n',trainingrec_d[1])
print('噪声3\n',trainingrec_d[2])

最后得到的是 趋势和3部分噪声。。重构一般是:舍弃一部分噪声,如(保留2部分噪声)。重构结果=噪声1+噪声2+趋势。。或者只要趋势。。 原式数据=噪声1+噪声2+噪声3+趋势。若不舍弃噪声,小波分解没有意义。。

小波降噪与重构例子 python相关推荐

  1. 利用python的强大函数库,实现波形的小波降噪、带通滤波、时阈分析、FFT波形转换

    import math import matplotlib.pyplot as plt import pywt import pandas as pd import numpy as np impor ...

  2. 用matlab对信号降噪,信号的小波降噪 matlab仿真程序

    信号的小波降噪 小波分析的重要应用之一就是用于信号降噪.在此,简要地阐述一下小波分析对信号降噪的基本原理. 我们知道,一个含噪的一维信号模型可表示为如下形式: 其中, 为含噪信号, 为有用信号, 为噪 ...

  3. matlab wdencmp函数,图像的小波阈值降噪_小波降噪函数 - 全文

    小波降噪的方法有多种,如利用小波分解与重构的方法滤波降噪.利用小波变换模极大值的方法去噪.利用信号小波变换后空域相关性进行信噪分离.非线性小波阈值方法去噪.平移不变量小波降噪法,以及多小波降噪等等.归 ...

  4. 哈儿小波分解和重构(降维和升维)实现算法

    [0]README 0.1)本文旨在讲解 哈儿小波变换(分解和重构)进行数据的降维和升维: [timestamp: 1703281610]时隔几个月再来review 哈儿小波变换算法的具体思路: 1) ...

  5. 基于MATLAB的图像平滑滤波降噪(去噪)系统(通信毕业设计)(中值滤波,维纳滤波,小波降噪,均值滤波,椒盐噪声)

    基于MATLAB GUI的平滑滤波降噪系统设计 此系统可以作为毕业设计,可以尝试在此基础上稍微可以加一些其他方法. 此系统设计了GUI界面,首先点击打开图像来导入图像,再加入不同的噪声,用多种方法来降 ...

  6. 小波分析、小波降噪matlab代码实现

    小波分析.小波降噪matlab代码实现 软阈值.硬阈值.固定阈值三种方式 1. 简介 2. 操作步骤 3. 直接上代码 4. 运行结果显示 1. 噪声信号图像 2. 硬阈值去噪图像 3. 软阈值去噪图 ...

  7. python小波分解与重构_小波分解和重构

    小波变换能够很好地表征一大类以低频信息为主要成分的信号, 小波包变换可以对高频部分提供更精细的分解 详见(http://www.cnblogs.com/welen/articles/5667217.h ...

  8. 自适应小波阈值去噪python_基于python的小波阈值去噪算法

    小波图像去噪原理 图像和噪声在经小波变换后具有不同的统计特性:图像本身的能量对应着幅值较大的小波系数,主要集中在低频(LL)部分:噪声能量则对应着幅值较小的小波系数,并分散在小波变换后的所有系数中.基 ...

  9. 【图像去噪】基于matlab快速跨尺度小波降噪泊松损坏图像去噪【含Matlab源码 1893期】

    ⛄一.图像去噪及滤波简介 1 图像去噪 1.1 图像噪声定义 噪声是干扰图像视觉效果的重要因素,图像去噪是指减少图像中噪声的过程.噪声分类有三种:加性噪声,乘性噪声和量化噪声.我们用f(x,y)表示图 ...

最新文章

  1. 微软职位内部推荐-SDEII
  2. 一篇文章告诉你如何成为数据科学家
  3. Perturbed Masking:和参数无关的预训练模型分析方法
  4. RESTful测试工具RESTClient
  5. Python字符串index()方法应用案例一则
  6. 服务器webpack构建性能,webpack构建和性能优化探索
  7. 中国软件服务业政策和形势_赵小凡
  8. excel和html互相转换,Excel2016与Html格式之间的互相转换
  9. 电子护照阅读器|酒店机场高铁自助机录入系统
  10. 腾讯T2大牛手把手教你,非科班的B站惊险之旅
  11. 实验三 16位机指令系统实验报告
  12. 34万奖金!第三届厦门国际银行数创金融杯金融营销大赛来啦!
  13. 24. GD32F103C8T6入门教程-IAP升级教程
  14. [FAQ09811][NW]如何区分MNO和MVNO
  15. 在《css禅意花园》中所学到的
  16. 初中计算机考试wps文字,初中信息技术WPS表格测试题
  17. AW codec驱动跨平台移植
  18. ZooKeeper之分布式环境搭建
  19. 并发系列三:证明分代年龄、无锁、偏向锁、轻量锁、重(chong)偏向、重(chong)轻量、重量锁
  20. sum 矩阵求和 matlab

热门文章

  1. 【多线程高并发】深入理解JMM产生的三大问题【原子性、可见性、有序性】
  2. vue循环渲染子组件视图不更新问题
  3. 第三方分享接口api
  4. JavaScript——易班优课YOOC课群在线测试禁止右键和复制解决方案
  5. Python——文本进度条
  6. FineReport——JDBC 连接 MySQL8.0 版本数据库
  7. 回文字符串(Palindromic_String)
  8. Rightmost Digit
  9. 【mybatis学习记录】mybatis的各种查询 一对一关联查询(4种方式) 一对多(2种方式)
  10. Android使用suspendCancellableCoroutine将回调转换为协程