ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Matlab小波分析实战:从信号去噪到故障诊断的完整指南

Matlab小波分析实战:从信号去噪到故障诊断的完整指南 搞信号处理的人几乎都绕不过小波变换这个名字。这几年我陆续在Matlab里写过不少小波相关的程序从最早的故障诊断到后来的心电信号去噪、图像融合甚至地震数据分析说实话小波变换Wavelet TransformWT确实是我用过最顺手、也最值得深挖的工具之一。它不像傅里叶变换那样把时间信息完全抹掉也不像短时傅里叶那样需要在时间和频率分辨率之间做痛苦的取舍。小波变换用一个可以伸缩平移的“小波窗口”把信号拆成不同尺度、不同位置的分量既能看到全局趋势又能锁定瞬态突变这种能力在工程分析里太实用了。这篇文章我不打算给你念教科书而是以一个“在Matlab里反复折腾过小波程序”的过来人身份把这套东西的来龙去脉、关键函数、完整流程和踩坑经验一次性讲清楚。无论你是刚入门的小白还是被课题逼着写代码的研究生或者是做工业信号分析的老工程师这篇文章都能让你少走很多弯路。这篇文章的核心是一条完整可复现的Matlab小波分析主线从理解小波变换的核心思想到掌握Matlab小波工具箱的常用函数再到用真实风格的代码完成信号去噪与突变检测最后是那些文档里压根不会写、但实践中特别容易出问题的细节。1. 小波变换到底解决了什么问题1.1 从傅里叶的“老毛病”说起在聊小波之前必须先聊聊傅里叶变换。傅里叶变换的核心操作是拿一堆不同频率的正弦波去“拟合”原始信号最终得到的是信号里有哪些频率成分以及各自的幅度有多大。理论上它非常漂亮但放到工程实测数据里就有点尴尬了——它默认把信号当成“无限长且平稳”的东西来处理变换完你会看到频率谱却完全不知道某个频率成分是出现在第1秒还是第10秒。有人会说那用短时傅里叶变换STFT加个窗一段一段地分析不就行了确实可以部分缓解但你一旦把窗长定死就意味着时间分辨率和频率分辨率被你同时焊死了。窗宽了频率分辨得清但时间上变得迟钝窗窄了时间捕捉变灵敏可频率又糊成一团。真实信号里的很多特征恰恰是“低频持续很久、高频只闪烁一瞬”比如机器轴承的早期故障冲击、心电信号里的QRS波群这种信号用固定窗口的STFT去处理怎么调都觉得别扭。1.2 小波变换的核心思想小波变换的思路其实很好理解不再用固定的正弦波而是用一个被称为“母小波”的有限长波形作为探针。这个探针有两大本事——伸缩和平移。伸缩尺度a控制小波的“胖瘦”尺度大时小波被拉宽对应低频、长时间范围的观察尺度小时小波被压缩对应高频、瞬间的细节捕捉。平移参数b控制小波的“位置”把探针沿时间轴移动扫描信号在不同时刻的局部情况。通过改变尺度和位置小波变换实际上是在做两个维度的扫描得到的结果被叫做“时频图”或“尺度图”。它不再用固定窗口而是用“可变窗口”来自适应分析信号——高频段用窄窗口获得高时间分辨率低频段用宽窗口获得高频率分辨率。这正符合自然信号的一般规律也是小波变换被称为“数学显微镜”的根本原因。这里需要给你吃一颗定心丸小波变换的数学公式看起来复杂又是积分又是内积的但在Matlab里做小波分析核心调用就那么几个函数绝大部分的数学细节工具箱都帮你处理好了。搞懂原理是为了让你知道“你在干什么”而不是让你去手推积分。2. Matlab小波工具箱里的核心函数和框架2.1 小波工具箱整体认知Matlab从很早的版本就内置了小波分析工具箱Wavelet Toolbox经过这么多年的迭代功能已经非常完善。你可以通过ver命令查看是否安装了该工具箱。一般来说R2016a之后的版本对离散小波变换DWT、连续小波变换CWT、小波包变换WPT等核心功能支持得都很好我自己的测试环境从2018a到2023b都没出现兼容性问题。工具箱的函数大致分成以下几类离散小波变换DWT与反变换IDWT这是最常见的一维信号处理入口对应函数dwt/idwt。多层分解与重构对应wavedec/waverec一次搞定多尺度分解和完整重构。细节系数提取对应detcoef/appcoef用来拿某个尺度上的细节分量或近似分量。阈值去噪对应wthresh/wden/wdenoise用于消噪处理。连续小波变换CWT对应cwt用于时频分析、尺度图绘制。小波包变换对应wpdec/wprcoef用于更精细的频带划分。2.2 最常用的离散小波变换流程我自己的习惯是对于一维信号分析只要不是特别复杂的情况十几行代码就能跑通完整流程。一个标准的离散小波分析流程可以拆成以下四步信号预处理把原始信号加载进来去均值、去趋势必要时先做一次简单的直流分量消除。选择小波基和分解层数第一道关键决策后面专门讲。多层分解或单层分解调用wavedec一次性得到多层系数或者用dwt只做一层。系数处理与重构去噪就做阈值处理检测突变就盯着细节系数的峰值需要看时频特征就画尺度图。这里我贴一段最常见、也最适合当模板的代码先建立一个整体印象%% 多层小波分解与关键系数提取示例 % 原始信号 Fs 1000; % 采样率 1000 Hz t (0:999) / Fs; % 时间轴 x sin(2*pi*50*t) 0.5*sin(2*pi*200*t); % 50Hz 200Hz 混合信号 % 选择小波基与分解层数 wname db4; level 5; % 多层分解 [C, L] wavedec(x, level, wname); % 提取第3层细节系数与近似系数 d3 detcoef(C, L, 3); % 细节系数高频部分 a3 appcoef(C, L, wname, 3); % 近似系数低频部分 % 从系数重建第3层细节信号 d3_sig wrcoef(d, C, L, wname, 3);这代码能跑通而且能让你直观看到小波分解的产物长什么样。注意C是拼接在一起的系数向量长度等于信号长度L是一个行向量记录每一层分解后各个分量的起始位置和长度。这是典型的Matlab风格——所有尺度的系数拼成一串通过L来界定归属。2.3 用代码理解“多分辨率分析”为了让你真正理解多分辨率分析我给你解释一下上面这段代码背后到底发生了什么。当你让wavedec对信号做5层分解时它的执行逻辑是这样的第一轮原始信号通过一个低通滤波器Lo_D和一个高通滤波器Hi_D分别得到近似系数cA1和细节系数cD1同时信号长度减半第二轮再用同样的方式处理cA1得到cA2和cD2如此往复5轮最终结果是1个第5层的近似系数以及从第1层到第5层的5组细节系数。所有系数拼接成C而L记录着每一段的起始索引和长度。为什么说这是“多分辨率”因为每一轮处理都把上一轮的近似系数当作新信号而低通滤波后的信号采样率在概念上可以视为减半所以第1层对应原始信号的高频半区比如FS/4到FS/2附近的细节第2层对应FS/8到FS/4附近的细节以此类推。层数越高看到的频带越低同时时间分辨率越粗。这就是小波变换能兼顾“低频看趋势、高频看细节”的原因。3. 完整实操案例含噪信号去噪与突变点检测3.1 案例背景与信号模拟理论讲得再多不如一个能跑的案例实在。下面我以一个典型的机械振动信号场景来模拟一个正常工作的旋转机械振动信号中包含一个基频正弦分量、一个二倍频分量然后受到环境噪声干扰同时在某个时刻出现一次短暂的冲击模拟轴承局部故障。模拟这个信号的代码如下%% 模拟含噪振动信号 Fs 2048; % 采样率 2048 Hz t (0:2047) / Fs; % 1秒信号 f1 50; % 基频 50 Hz f2 150; % 二倍频 150 Hz实际还有三倍频等 clean sin(2*pi*f1*t) 0.4*sin(2*pi*f2*t); % 干净信号 imp zeros(size(t)); imp(800:810) exp(-((0:10) - 5).^2 / 2) * 2; % 830ms附近一个高斯冲击 x clean imp 0.5*randn(size(t)); % 叠加噪声和冲击这里我故意让噪声幅度开到0.5相当于信噪比比较低去噪难度适中。冲击信号只有11个采样点在1秒信号里占比不到0.5%肉眼几乎看不出来这对后面的突变检测是个很现实的挑战。3.2 小波基和分解层数的选择策略这是整个流程里最影响结果的一步也是很多新手容易卡住的地方。先说小波基选择。小波基的种类很多常用的大致有这么几类Haardb1最简单阶跃特性好但不光滑频域局部性差。Daubechies系列db2~db45光滑性和紧支撑性平衡得不错是工程应用首选我大部分时间都用db4或db8。Symlets系列sym2~sym45对称性更好相位失真更小适合对波形形状敏感的信号。Coiflets系列coif1~coif5对称性和光滑性均衡但计算量稍大。biorthogonal系列bior1.1~bior6.8用于图像处理较多可以完美重构。对于机械振动和生物医学信号我推荐优先试db4、db8和sym8它们在“对瞬态冲击的敏感性”和“重构信号的平滑程度”之间平衡得最好。不要迷信某个小波基万能最好的方法是对比几个候选基的去噪结果选信噪比最高的那个代码就多两行循环的事。再说是分解层数。选层数的核心逻辑是让最高层近似分量的频率范围大致覆盖信号里需要保留的最低频成分。工程上有一种经验做法每向下一层细节分量对应频带的上限是上一层的1/2也就是说第j层细节对应的频带上限是Fs/(2^(j1))到Fs/(2^j)。如果你的有用信号最低是20Hz采样率是2000Hz那你需要让第J层以下的细节频率上限低于20Hz粗略估算2000/(2^(J1)) 20得到J 5左右。当然这只是快速估算实际操作时我通常直接取4到6层再对比分解结果选择最优值。3.3 小波阈值去噪的完整代码小波阈值去噪的经典套路分三步分解、阈值化细节系数、重构。Matlab里有现成的高层函数wdenoise但我觉得手动控制每个环节更有利于理解原理也方便后续调参。我常用的去噪代码是这样的%% 小波阈值去噪完整流程 wname db4; level 5; % 步骤1多层分解 [C, L] wavedec(x, level, wname); % 步骤2估计噪声标准差使用第一层细节系数 cD1_est detcoef(C, L, 1); sigma median(abs(cD1_est)) / 0.6745; % 稳健估计噪声标准差 thr sigma * sqrt(2 * log(length(x))); % 通用阈值sqtwolog % 步骤3对每层细节系数做软阈值处理 C_thr C; idx_start 1; for j 1:level % 取出当前层细节系数在C中的索引范围 d_idx cumsum(L); % 细节系数的起点和终点L的最后一项是近似系数长度 if j 1 start_idx 1; else start_idx L(1) sum(L(2:j)); end end_idx start_idx L(j1) - 1; d_coeffs C(start_idx:end_idx); % 软阈值处理 d_coeffs wthresh(d_coeffs, s, thr); C(start_idx:end_idx) d_coeffs; end % 步骤4重构 x_denoised waverec(C_thr, L, wname);上面对索引的处理写得比较细是怕你直接照抄时踩坑。其实还有更简洁的阈值函数wdencmp但手动写索引是为了让你理解C和L的结构这比一次性跑通更重要。等你自己能熟练处理C的结构了再换wdencmp也很容易。你可能会问为什么噪声标准差用median(abs(cD1_est)) / 0.6745来估计因为高斯白噪声经过小波变换后在第一层细节系数里仍然近似服从高斯分布而高斯分布的绝对值中位数与标准差之间有一个固定比例关系大约是0.6745倍标准差对应50%分位数所以用这个公式做稳健估计。这种估计方法对单个离群点不敏感比直接用std稳健很多。3.4 突变点检测用细节系数锁定冲击时刻去噪完成后我们还想定位之前模拟的那个冲击。小波变换对瞬态突变非常敏感信号里的突变在细节系数上会形成明显的峰值。最简单的做法是直接找第一层或第二层细节系数的极大值位置。%% 基于细节系数的突变点检测 d1_sig wrcoef(d, C_thr, L, wname, 1); % 用阈值处理后的系数重建第1层细节 [d1_abs, idx_sort] sort(abs(d1_sig), descend); time_axis t; % 如果你保留了时间轴 fprintf(最大突变点位置: %.4f s\n, t(idx_sort(1)));在我这个模拟信号里冲击设置在0.391秒附近由于噪声的存在直接用原始信号找最大值很容易被噪声带偏但用第一层细节系数的绝对值找最大值通常能准确定位到冲击时刻。原理是白噪声的能量均匀分布在整个时间轴上而冲击信号能量集中在很窄的时间窗内经过第一层带通滤波后噪声幅度被摊薄冲击却因为频率成分丰富而在细节系数里保留了较大的幅值。这个方法在机械故障诊断里经常用来定位轴承冲击的周期。3.5 去噪效果评价不能光靠“看着干净”去噪效果不能只靠眼睛看需要量化评价。我经常用两个指标信噪比SNRSNR 10 * log10( sum(clean.^2) / sum((x_denoised - clean).^2) )单位dB越高越好。均方根误差RMSERMSE sqrt( mean((x_denoised - clean).^2) )越小越好。注意这里的clean是我们模拟信号时知道的干净信号真实应用中没有这个参考所以这种评价通常只用在算法对比和参数优化的离线测试中。我自己做算法选型时会写一个双层循环外层遍历几种小波基内层遍历几种阈值规则最后统计哪个组合在SNR和RMSE上综合最优。这个过程建议你也跑一下会让你对小波基的选择有直观感受而不是停留在理论上。4. 阈值规则详解选错了结果差一半4.1 几种经典阈值规则在写小波去噪程序时阈值怎么定直接决定输出质量。Matlab的thselect函数支持多种阈值规则我在表里给你整理了一下规则名称调用方式特点适用场景通用阈值thselect(x, sqtwolog)阈值最大去噪彻底但容易把有用信号的高频细节一并抹掉信噪比很低、重点看趋势的场合无偏风险阈值thselect(x, rigrsure)基于Stein无偏风险估计阈值较小保留细节好信号相对光滑、含有弱细节成分启发式阈值thselect(x, heursure)综合sqtwolog与rigrsure自动选择信噪比适中、不确定选哪种时极大极小阈值thselect(x, minimaxi)阈值略小于通用阈值兼顾去噪和保真含较多弱突变、希望保留边缘细节我在实际项目里的经验是先用heursure快速看效果再做精细调参。如果信号本身很脏、主要目标是看大体趋势直接用sqtwolog最省心如果信号里有需要保留的瞬态尖峰比如心电信号里的R波那用rigrsure或者minimaxi效果要好得多。4.2 硬阈值还是软阈值wthresh函数的第二个参数只有两个选择h硬阈值和s软阈值。这两个差别非常大。硬阈值是“绝对值大于阈值的系数保留原值否则置零”看起来很合理但在阈值附近会产生不连续的跳变重构出来的信号容易有伪吉布斯振荡——具体表现就是信号上出现一些原本不存在的小毛刺。软阈值是“大于阈值的系数整体向零收缩一个阈值量”它能保持系数连续性重构信号更平滑但有系统性的幅度压缩可能造成冲击幅值略微偏小。现在稍微新一点的工具包默认常常推荐软阈值但如果你做的是故障特征提取希望保持冲击的真实幅度硬阈值在某些场景反而更好。我的习惯是先软后硬对比两次的SNR和实际波形再做决定施工中不要教条化。4.3 分层阈值和全局阈值怎么选前面写的代码用的是每层同一个阈值thr这是最简单的方案。但实际场景中噪声在各层细节系数里的能量是一层比一层小的因为每层带宽减半所以用一个全局阈值会有点粗暴。更好的做法是分层求阈值对每一层细节系数单独用thselect求该层的阈值然后对该层做软硬阈值处理。这样高频层阈值大一点低频层阈值小一点能更精准地保留有用信号。实现不复杂把前面那句thr sigma * sqrt(...)移到循环里对每一层重算就行。代价是计算量略微增加但对结果提升明显尤其是信号里的有用成分横跨多个频率带时我强烈建议用分层阈值。5. 连续小波变换一秒钟画出一张时频图5.1 连续小波变换与离散小波变换的分工很多人问连续小波变换CWT和离散小波变换DWT有什么区别。简单来说DWT把尺度和位移都做了二进制离散化计算快适合重构、去噪、压缩结果是一组系数不是一张连续的时频图。CWT在连续的尺度范围和位移上做变换计算量大但能给出更细致的时频分布特别适合观察频率成分随时间的变化。所以这两者不是谁替代谁的关系。做去噪、编码、特征向量提取用DWT做时频可视化、分析非平稳信号频率演化用CWT。一个工程项目里完全可以两个都用。5.2 用cwt函数绘制时频图在Matlab里cwt函数用法非常简洁R2016b之后的版本一行代码就能出图%% 连续小波变换时频分析 Fs 2048; t (0:2047) / Fs; x_chirp sin(2*pi*(50 100*t).*t); % 频率从50Hz线性增加到150Hz的chirp信号 cwt(x_chirp, Fs);这行代码会自动选择小波基默认为amor复数Morlet小波和尺度范围画出横轴是时间、纵轴是频率的彩色时频图。你能很直观地看到一条从低频斜向上到高频的亮带这就是chirp信号的瞬时频率轨迹。如果再叠加之前的冲击信号时频图上会看到竖直的亮线这种“水平趋势垂直突变”的图像特征在故障诊断和语音分析里非常有用。我自己用cwt最多的场景是在仿真数据可视化阶段——先跑一行CWT看信号在时频域的整体面貌再决定后续用DWT怎么精细化处理。这是一个低成本的探索性工作习惯。6. 常见问题与排查技巧实录6.1 函数找不到或命令报错最常见的问题就是未定义函数或变量 wavedec这基本可以断定是小波工具箱没安装或许可证没激活。你可以用ver(wavelet)查看工具箱状态如果显示为空就需要回到Matlab安装包里补装。还有一类情况是函数名记混了——wavedec是“wavelet decompose”多层分解wrcoef是“wavelet reconstruction coefficients”从系数重建分量waverec是“wavelet reconstruction”从系数重建整体信号这三个后面极易混淆建议你在代码开头注释里标清楚用途。6.2 分解后信号长度对不上DWT每做一层分解近似和细节系数长度都会减半严格说是floor((L_filter L_signal - 1)/2)得看边界模式。如果你对系数做修改后重构发现长度对不上大概率是你对C的索引操作越界了。我建议你在修改系数前先把L打印出来看看disp(L)亲手看一遍每一层的长度记录比你背十遍公式都管用。再有一个常见坑修改完系数后记得用waverec重构不要自己去拼信号。很多人想省事手动拼接各层分量结果边界效应严重最后波形明显失真。6.3 边界效应怎么处理小波变换本质是卷积操作信号两端天然会引入边界伪影。Matlab的dwt和wavedec默认使用sym对称延拓模式也就是把信号两端镜像扩展对大多数信号来说效果不错。如果你的信号很短或边界特征很重要建议对信号先做一个边缘延拓比如用wextend分析完再截掉延拓部分。更简单的做法是对长信号做分段处理时段与段之间保留一定的重叠处理后丢弃每段首尾各一小段边界区域只保留中间稳定部分。6.4 中文注释乱码问题从热词里我看到很多人搜“Matlab中文注释乱码”这也是我自己碰到过的问题。老版本Matlab的.m文件默认使用系统的区域编码保存中文注释很容易乱码。解决办法通常是在Matlab的预设选项里把文件编码改成UTF-8然后用支持UTF-8的编辑器重新保存文件。如果你的.m文件已经被改乱了最快的办法是从备份或版本控制里恢复否则只能逐个把乱码字符手动改回。这里也提醒一句正式工程代码里注释用中英文都行但一定要保持编码统一团队协作时最好约定全部用UTF-8。6.5 信号突变检测里的“误报”问题按前面用第一层细节系数找最大值的方法如果信号里本来就存在周期性调幅或电磁干扰第一层细节可能出现多个幅度接近的峰值导致误判。我的经验是不要只用一层细节把前3层细节系数都算出来取它们的绝对值累加再找峰值位置。由于噪声在多层之间相关性弱而真实冲击信号在各层都有较大幅值累加之后信噪比会显著提升误报率会明显下降。另外配合一个幅度阈值比如峰值必须超过全部系数绝对值均值的5倍能进一步过滤伪峰。7. 实践细节与经验扩展7.1 批量处理多组信号如果你手头有几百组信号逐个复制粘贴代码效率太低了。我通常会把核心处理写成函数function [x_denoised, d1_sig] wavelet_denoise(x, Fs, wname, level) [C, L] wavedec(x, level, wname); % ... 阈值处理 ... x_denoised waverec(C_thr, L, wname); d1_sig wrcoef(d, C_thr, L, wname, 1); end然后写一个主循环读入所有信号文件统一调用这个函数最后把SNR、RMSE、检测到的冲击位置全部写进一个表格里。这样做的好处不只是节省时间更重要的是处理流程完全一致结果可对比性更强。你可以在现场数据上先处理10组信号确认算法稳定后再批量运行。7.2 小波包变换当DWT不够细的时候DWT每层只分解低频近似部分高频部分不再细分这在一些高频成分也很重要的情况下就不够用了。小波包变换WPT会同时对近似系数和细节系数做下一层分解相当于把整个频带均匀切分频率分辨率更高。Matlab的wpdec和wpcoef支持这个功能。比如你想把0到Nyquist频率切成16个等宽频带直接做4层小波包分解即可每层都会把上一层的频带一分为二最终得到16个节点每个节点对应一个频带。这在语音降噪、脑电信号频带能量分析里非常有用。7.3 在Simulink里使用小波变换如果你做嵌入式控制或实时信号处理可能希望在Simulink模型里直接接一个小波去噪模块。Matlab提供了Wavelet Toolbox的Simulink模块支持你可以在Simulink Library Browser里找到Wavelet库拖出DWT和IDWT模块配置好小波基和分解层数就可以做实时流的分解重构。不过要注意实时处理时DWT模块通常对输入采用缓冲方式延迟比较大如果对延迟敏感需要评估一下是否满足你的控制周期要求。我自己试过在Simulink里做简单的两层去噪仿真没问题但部署到实时目标机上还是要谨慎。7.4 一个完整的行业应用路线参考说了这么多最后给你一条我常用的行业路线参考从信号到诊断结论非常顺对所有历史数据进行CWT时频分析快速筛查哪些时间段的信号有明显异常特征。对可疑信号做DWT阈值去噪得到相对干净的信号。用第1层细节系数做冲击定位结合转速信息换算成对应的角度位置诊断是哪一类故障轴承外圈、内圈、滚动体。对去噪后信号提取各层能量占比构造特征向量输入分类器做自动故障识别。这条路线我既在科研项目里用过也在实际工业数据上跑过整体稳定性和结果可解释性都比单纯用深度学习端到端要好尤其是在样本数量有限的情况下小波特征简单分类器往往比深度神经网络更实用。8. 给新手的五个实操建议8.1 不要一上来就追求复杂小波基很多新手一开就上db45甚至bior6.8结果计算又慢效果也没比db4好多少。我的建议是从db4或sym4开始先把流程跑通再根据信号特征换基函数对比。8.2 先观察后动手拿到信号第一件事不是写代码而是先绘图观察。用plot看时域波形用cwt看时频图用pwelch看功率谱。只有先知道信号长什么样你才能确定小波基和分解层数的大致方向。8.3 调参时一次只动一个变量小波分析涉及的参数太多小波基、分解层数、阈值规则、软硬阈值、边界模式。如果你同时改好几个参数最后结果变了你都不知道是谁起的作用。我在调参时一定会做控制变量先固定小波基调整阈值规则再固定阈值规则调整分解层数最后再整体微调。8.4 保存所有参数配置处理结果好与坏不能只靠眼睛记忆。我在每个项目里都会把参数存成结构体params.wname db4; params.level 5; params.thrRule heursure; params.thrMode s; params.Fs 2048; save(params.mat, params);这样任何一个结果都能回溯到当时的参数配置对论文复现和项目交接都非常重要。8.5 善用Matlab的交互式工具Matlab不仅在命令行层面支持小波分析还提供了一套交互式图形界面工具我印象最深的是wavemenu它集成了很多小波工具包括一维去噪、二维小波分析、小波包等。你可以在图形界面里交互式地调整参数直观看到效果然后把生成的代码导出再放到脚本里自动化处理。这个方法对新手尤其友好是快速建立手感的好途径。老版本中wavemenu很常见新版本里有些功能被整合进了Wavelet AnalyzerwaveletAnalyzer命令用法类似。我在实际使用中发现图形化工具最大的价值不是替代编程而是帮你建立参数直觉。你拖一拖滑条马上就能看到不同阈值规则带来的波形变化这种视觉反馈比看任何教科书都来得快。等你在GUI里玩明白了再回到脚本编程就会有一种“一切尽在掌控”的感觉。小波分析这条技术路线我认为最迷人的地方在于它永远在“全局”和“局部”之间寻找平衡。你用Matlab把小波程序写好之后不仅解决了一个一个具体的去噪、检测问题更获得了一种全新的看待信号的视角。从傅里叶到小波本质是从“信号由什么频率组成”到“信号在什么时候出现什么频率”的认知升级。希望这篇文章能帮你迈过入门那道坎让你在Matlab里写出第一个真正懂信号的小波程序。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进