小波变换原理简要实现和分析
傅里叶变换是频谱分析的重要工具,适用于周期性平稳信号,但是对于非平稳信号而言,效果较差。
其实质是卷积求正弦波相关性,由于正弦波不是能量有限信号,对无差别做一个全部卷积,算出来的结果不考虑时间。
小波变换也是频谱分析的重要工具,基函数为能量有限信号,也可以进行时域分析。针对不同的信号,可以更换不同的基函数。
建议看看:形象易懂讲解算法I——小波变换 - Alexander - 博客园 (cnblogs.com)
一般有母小波、父小波。母小波就是基函数,父小波是尺度函数,他们都是正交归一化的基向量。父小波是信号在不同尺度空间下的近似。如下所示,为母小波的系数求法,a是尺度,尺度与频率是反比关系,为了保证归一化,要除以根号a。
关于父小波:小波变换完美通俗讲解系列之 (二) - 知乎 (zhihu.com)
上式的第一项是父小波,第二项则是母小波。
下面是cwt的一个小小实现,抄自(26条消息) python连续小波分析CWT_python 小波变换_赵孝正的博客-CSDN博客
(26条消息) 脑电信号处理学习笔记(一)——pywt_pywt.wavedec_牛杂师傅的博客-CSDN博客
import numpy as np import pywt import matplotlib matplotlib.use('TkAgg') import matplotlib.pylab as plt sampling_rate = 1024 # 采样频率 t = np.arange(0, 1.0, 1.0/sampling_rate) # 0-1.0之间的数,步长为1.0/sampling_rate f1 = 100 # 频率 f2 = 200 f3 = 300 data = np.piecewise(t, [t < 1, t < 0.8, t < 0.3], [lambda t: np.sin(2 * np.pi * f1 * t), lambda t: np.sin(2 * np.pi * f2 * t), lambda t: np.sin(2 * np.pi * f3 * t)] ) wavename = "cgau8" # 小波函数 totalscal = 256 # totalscal是对信号进行小波变换时所用尺度序列的长度(通常需要预先设定好) fc = pywt.central_frequency(wavename) # 计算小波函数的中心频率 cparam = 2 * fc * totalscal # 常数c scales = cparam/np.arange(totalscal, 1, -1) # 为使转换后的频率序列是一等差序列,尺度序列必须取为这一形式(也即小波尺度) [cwtmatr, frequencies] = pywt.cwt(data, scales, wavename, 1.0/sampling_rate) # 连续小波变换模块 plt.figure(figsize=(8, 4)) plt.subplot(211) # 第一整行 plt.plot(t, data) plt.xlabel(u"time(s)") plt.title(u"300Hz 200Hz 100Hz Time spectrum") plt.subplot(212) # 第二整行 plt.contourf(t, frequencies, abs(cwtmatr)) plt.ylabel(u"freq(Hz)") plt.xlabel(u"time(s)") plt.subplots_adjust(hspace=0.4) #调整边距和子图的间距 hspace为子图之间的空间保留的高度,平均轴高度的一部分 plt.show()
关于如何选取基函数,请移步到:(26条消息) 小波滤波小波基、阈值、阈值函数的选择_小波基函数的选取_狂奔的 蜗牛的博客-CSDN博客
此外提供一些方法 查看小波形态
import matplotlib.pyplot as plt wavelet=pywt.ContinuousWavelet('gaus8') [psi,xval] = wavelet.wavefun( level=10)#或者写length=1024 plt.plot(xval,psi) plt.title("Gaussian Wavelet of order 1024") plt.show()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理