
简介这份资料面向信号处理、电子信息、自动化及生物医学工程等方向的学习者以71页PPT形式系统讲解小波分析的理论脉络与MATLAB实现路径帮助读者突破傅里叶变换在非平稳信号时频局部化上的局限。内容从傅里叶变换的频谱缺陷切入依次铺陈短时傅里叶变换的窗宽权衡、小波定义与紧支撑、L²(R)空间条件、尺度参数a与位移参数b的作用、连续小波正逆变换公式再延伸至多尺度分析与Mallat算法并配有图像压缩、边缘检测、噪声过滤、故障诊断等应用案例及配套源代码。压缩包内为1个PPT文件整体约13.83MB篇幅紧凑、图文公式丰富适合课堂讲授或自学通读。目前已有246人学习便于读者对照案例在MATLAB中复现实验、理解小波系数计算流程与工具箱调用方式逐步建立从原理到工程应用的完整认识。1. 从一段抖动的信号说起为什么小波分析值得在 MATLAB 里认真跑一遍假设你手里有一段电机轴承振动数据采样率 10 kHz。用fft画频谱能看到 1 kHz 附近有能量却回答不了另一个更要紧的问题这簇能量是全程均匀还是只在某几个瞬间冒出来。故障冲击恰恰是后者——短时、非平稳、转瞬即逝。短时傅里叶变换把窗宽固定下来窄窗频率分辨率差宽窗时间分辨率差难以两全。小波换了个思路用一组可伸缩、可平移的母小波去匹配信号的局部形状大尺度看低频轮廓小尺度看高频细节。由此得到一个常被误解的结论——小波不是「更高级的 FFT」。要问信号里有哪些频率成分FFT 更直接要问这些成分何时出现、持续多久、如何演化小波才顺手。MATLAB 把这些能力包在 Wavelet Toolbox 里cwt一行出时频图wavedec一行出多尺度系数代价是参数没设对时图会骗人。这篇内容面向用 MATLAB 做去噪、特征提取和图像处理的从业者从cwt、dwt、wavedec讲到可直接复现的案例重点落在小波基、分解层数、阈值规则和边界处理——这四个量才真正决定结果好坏。2. MATLAB 小波分析的理论骨架与工具箱选型小波分析在 MATLAB 里其实分成两条并行但不太相干的路线连续小波变换CWT偏分析和可视化离散小波变换DWT偏分解、重构和工程处理。新手最容易犯的错是拿cwt出的图去指导wavedec的参数两边的「尺度」根本不是同一个量。先把这两套东西的对应关系理清后面写代码才不会反复推倒重来。2.1 连续小波变换尺度、平移与那行 cwt 命令CWT 的定义是一段卷积积分母小波 ψ 被尺度 a 拉伸、被平移量 b 挪动再和信号做内积CWT(a, b) (1 / sqrt(a)) * ∫ x(t) * ψ*((t - b) / a) dt尺度 a 与中心频率近似成反比a 越大对应越低频。MATLAB 里不需要自己写这段积分cwt直接返回系数矩阵和对应的频率向量fs 1000; t 0:1/fs:2-1/fs; x cos(2*pi*50*t) (t 1) .* cos(2*pi*200*t); % 后半段混入200Hz分量 [cfs, f] cwt(x, fs, amor); % cfs 为 频率×时间 的复系数矩阵 figure; contourf(t, f, abs(cfs), 20, linecolor, none); set(gca, YScale, log); colormap(turbo); colorbar; xlabel(时间 t / s); ylabel(频率 f / Hz);cfs是复数模值代表该频率该时刻的能量强度相位可用于测相位差。f是cwt自动选的频率采样点默认按对数分布所以画图时把 Y 轴设成对数刻度才自然。选amor解析 Morlet是因为它频率分辨率好、相位线性做时频图最常用换成morse可以借TimeBandwidth参数调时频分辨率折中数值越大频域越集中。注意cwt不满足完美重构条件别拿它的系数去重建信号。2.2 离散小波变换与多分辨率分析wavedec 到底返回了什么DWT 走的是 Mallat 塔式算法每一层用一对低通、高通滤波器把信号拆成近似系数 A 和细节系数 D再对 A 继续下采样二分。MATLAB 的入口是wavedec[C, L] wavedec(x, 4, db4);返回值C是一维长向量不是矩阵它把各层系数首尾拼在一起顺序固定为C [ A4 | D4 | D3 | D2 | D1 ]L是长度索引向量L(1)是 A4 的长度L(2)到L(5)依次是 D4 到 D1 的长度末尾多一项记录原始信号长度。知道这个拼接顺序才能手动改系数。单独取某一层用detcoef和appcoefA4 appcoef(C, L, db4, 4); D3 detcoef(C, L, 3);函数作用常配参数wavedec多层一维分解小波名、层数waverec按 C/L 重构须与分解同名小波detcoef/appcoef提取单层系数层号从 1最细计wrcoef单层系数重构回时域d或adwt2/idwt2二维单层分解与重构输出 cA/cH/cV/cDwdenoise一键去噪方法、阈值规则wmaxlev求最大分解层数信号长度、小波名2.3 小波基怎么挑db、sym、coif、morl 的适用面选小波基没有普适答案但有几条硬约束做分解重构必须用正交或双正交小波morl、mexh这类解析小波只能用于 CWT拿它们喂wavedec会直接报错。小波族关键特性适用场景haardb1正交最短阶跃型突变检测、教学演示dbN正交不对称消失矩为 N一般去噪、压缩symN近似对称相位失真小需要保波形的信号coifN更对称支撑更长图像处理biorN/rbioN双正交可线性相位图像压缩、JPEG2000 系morl/mexh非正交无重构连续时频分析cmor/amor复小波带相位需要相位信息的 CWT消失矩 N 越大对多项式型平滑信号的压制越强但支撑变长、边界效应加重计算量也上来。经验做法是先从sym4、sym8、db4里挑去噪效果差异不大时优先选支撑短的。2.4 一条容易忽略的选型依据重构误差不同小波的正交性和对称性会影响重构精度。想快速比一比可以拿一段已知信号做「分解—重构」的自检err zeros(1, 4); wnames {haar, db4, sym8, coif3}; for i 1:4 [C, L] wavedec(x, 4, wnames{i}); xr waverec(C, L, wnames{i}); err(i) max(abs(x - xr)); % 理想情况下为 1e-12 量级 end正交小波的误差应该接近机器精度如果某个小波算出来误差明显偏大多半是分解和重构用了不同小波名或者中途动过L。这一步花不了几秒却能提前排掉很多「重构结果对不上」的诡异问题。3. 用 MATLAB 跑通一维信号小波去噪的完整流程去噪是小波最普及的用途也是参数坑最集中的地方。这一章用一段合成的非平稳信号走完全流程造数据、分解、阈值处理、重构、量化评价。每一步都写清楚中间变量的物理含义避免只会调wdenoise而不知道它内部干了什么。3.1 造一个带噪信号采样率与噪声强度真实数据不方便公开但去噪逻辑对合成信号和实测信号是一样的。构造一段基频 80 Hz、含三次谐波的信号叠加高斯白噪声rng(0); % 固定随机种子保证结果可复现 fs 2000; % 采样率 2 kHz奈奎斯特频率 1 kHz t 0:1/fs:1-1/fs; f0 80; clean sin(2*pi*f0*t) 0.4*sin(2*pi*3*f0*t); noisy clean 0.5*randn(size(t)); % 噪声标准差 0.5采样率决定有效频带也决定第一层细节系数里装的是不是纯噪声。信噪比设得太高噪声太小时阈值会把有用细节一起削掉设得太低去噪前后肉眼看不出区别。先用snr(noisy, clean)记一个基准值后面好对比。3.2 wavedec 分解与系数结构解析wname sym6; N 5; [C, L] wavedec(noisy, N, wname); A5 appcoef(C, L, wname, N); % 最粗一层近似 D1 detcoef(C, L, 1); % 最细一层细节基本是噪声取 5 层意味着把 01000 Hz 切成 6 个频带最细层 D1 覆盖 5001000 Hz。因为信号主频只有 80 Hz 和 240 HzD1 和 D2 里几乎全是噪声这也是噪声水平估计最可靠的来源。3.3 阈值去噪的两条路线通用阈值与手动阈值第一条路线是一行命令den1 wdenoise(noisy, N, ... Wavelet, wname, ... DenoisingMethod, UniversalThreshold, ... ThresholdRule, Soft, ... NoiseEstimate, LevelIndependent);第二条路线是自己改系数适合需要逐层设不同阈值的场景Cden C; sigma median(abs(D1)) / 0.6745; % 用最细层细节做稳健噪声估计 thr sigma * sqrt(2 * log(numel(noisy))); % 通用阈值 offset L(1) 1; % 跳过 A5指向 D5 起点 for k 1:N n L(k 1); % 依次是 D5、D4…D1 的长度 seg offset : offset n - 1; Cden(seg) sign(C(seg)) .* max(abs(C(seg)) - thr, 0); % 软阈值 offset seg(end) 1; end den2 waverec(Cden, L, wname);sigma用中位数除以 0.6745 而不是标准差是因为中位数对少数大幅值系数不敏感估计出的噪声水平更稳。软阈值把超过阈值的系数整体收缩波形更平滑但幅值会被压低硬阈值只保留原值突变保留得好代价是容易在重构里留下振铃。UniversalThreshold是通用阈值规则层数多、信噪比低时通常比Minimax更保守。3.4 重构验证与几个必查的参数fprintf(原始 SNR: %.2f dB\n, snr(noisy, clean)); fprintf(wdenoise SNR: %.2f dB\n, snr(den1, clean)); fprintf(手动阈值 SNR: %.2f dB\n, snr(den2, clean));只看 SNR 会漏掉两类问题一是波形整体延迟二是首尾端点的畸变。前者多半是小波不对称造成的换sym族能缓解后者是边界效应靠dwtmode处理下一章展开。提示wavedec的层数不能随便调大。超过wmaxlev(numel(noisy), wname)会直接报错实际取到最大层数减一往往更稳。4. 图像与工程信号的小波实战案例一维去噪只是入口。小波在图像处理、故障诊断、时频分析里的用法差别不小涉及二维分解结构、节点能量特征和可视化参数。这一章给三份可直接套用的代码骨架并说明每份代码里哪几个数字最需要按数据调。4.1 二维小波图像去噪dwt2 手动流程与 wdenoise2二维小波把图像拆成四个子带cA低频近似cH水平细节cV垂直细节cD对角细节。噪声主要藏在后三个子带的系数里。img imread(cameraman.tif); img im2double(img); noisy imnoise(img, gaussian, 0, 0.01); wname sym4; [cA, cH, cV, cD] dwt2(noisy, wname); thr 0.1; % 需按噪声强度调整 cH wthresh(cH, s, thr); cV wthresh(cV, s, thr); cD wthresh(cD, s, thr); den idwt2(cA, cH, cV, cD, wname); den den(1:size(img, 1), 1:size(img, 2)); % 裁剪掉延拓带来的多余行 den2 wdenoise2(noisy, 3, Wavelet, wname); % 多层版本 fprintf(去噪前 PSNR: %.2f dB\n, psnr(noisy, img)); fprintf(手动单层 PSNR: %.2f dB\n, psnr(den, img)); fprintf(wdenoise2 PSNR: %.2f dB\n, psnr(den2, img));thr是这里唯一的经验量噪声标准差大就往上调调过头图像会发糊、边缘变软。判据不是纯看 PSNR还要看边缘有没有「振铃」——在白背景黑物体的边界附近出现密密麻麻的波纹就是阈值偏小或用了硬阈值。4.2 小波包做轴承故障特征提取节点能量谱信号里高频成分种类多的时候DWT 只继续分解低频那一支高频段分辨率不够。小波包对每一层的高、低频同时分解频带划分更均匀适合做故障特征。T wpdec(x, 3, db4); % 3 层小波包分解 idx 7:14; % 第 3 层的 8 个节点MATLAB 按二叉树逐层编号 E zeros(1, numel(idx)); for k 1:numel(idx) c wpcoef(T, idx(k)); % 取该节点系数 E(k) sum(c.^2); % 节点能量 end E E / sum(E); % 归一化能量谱 bar(idx, E); xlabel(小波包节点序号); ylabel(归一化能量);节点编号必须查清wpdec(x,3,...)的第 3 层节点号固定是 7 到 14顺序按从高频到低频排列。把归一化能量当特征向量喂给分类器比直接拿原始时域点数的维度低得多。注意节点顺序在不同层之间是重排过的跨层比较能量要先换算成实际频率范围公式是fs * (n1) / 2^(L1)到fs * (n2) / 2^(L1)。4.3 时频可视化cwt 与 scalogram 的显示参数[cfs, f] cwt(x, fs, amor); figure; imagesc(t, log2(f), abs(cfs)); axis xy; colormap(turbo); colorbar; xlabel(时间 t / s); ylabel(log_2(f / Hz));把频率轴转成对数后低频段不会被挤成一条线。imagesc比contourf快数据量大时优先用它。若只关心某个频带可以在cwt里加FrequencyLimits参数限制范围减少无效计算。4.4 批量处理与运行效率files dir(*.mat); for i 1:numel(files) S load(files(i).name); denData wdenoise(S.data, 5, Wavelet, sym8); save([den_ files(i).name], denData); end批量跑之前先测试一条把dwtmode设一次它是全局状态别在循环里反复设置。数据量大时用parfor并行注意dwtmode在并行池里的行为最稳的做法是在每个 worker 开头显式设一遍。5. 进阶分解层数、边界延拓与自定义小波的调参手法前面所有案例都绕不开两个数字分解层数 N 和边界延拓模式。它们不像阈值那样有直观的图形反馈出问题时往往表现为「信号两端莫名翘起」或「重构长度不对」容易被误判成数据本身有毛病。5.1 分解层数怎么定上限由信号长度和小波滤波器长度共同决定MATLAB 提供wmaxlev直接算Lx numel(x); Nmax wmaxlev(Lx, sym8); % 返回允许的最大层数 N max(1, Nmax - 1); % 工程上常留一层余量减一层是因为接近上限时最粗近似系数的长度已经短到没有统计意义重构端点误差反而放大。另一条经验规则是让最低频带覆盖你关心的最低频率若只关心 20 Hz 以上层数选到log2(fs/2/20)附近就够多的层只会引入噪声。5.2 边界效应与延拓模式信号是有限长的滤波器卷积到端点时缺数据MATLAB 靠延拓补上重构后再截断。默认模式是sym对称延拓对大多数信号都稳。循环平稳信号用per周期延拓更自然但要求信号首尾尽量连续否则拼接处会出现阶跃。dwtmode(sym); % 设为对称延拓全局生效 m dwtmode(status, nodisp); % 查询当前模式 dwtmode(per); % 换成周期延拓有个坑值得单独说分解和重构必须用同一个模式。如果中途改了dwtmode已经存下的C、L再拿去waverec长度会对不上或者结果整体偏移。做跨模块的数据流时把dwtmode的值和C、L一起存下来最保险。5.3 自定义小波与滤波器组MATLAB 内置小波不够用时可以直接拿到滤波器组自行调整[LoD, HiD, LoR, HiR] wfilters(db4); % 手动构造单层分解低通得近似高通得细节 a downsample(conv(x, LoD, full), 2); d downsample(conv(x, HiD, full), 2);LoD/HiD是分解滤波器LoR/HiR是重构滤波器。正交小波的四者满足镜像关系双正交则不满足这也是bior系列能做线性相位的原因。要设计新小波可以用提升方案lifting在liftwave得到的初始结构上逐步构造再通过wfilters导出对应的滤波器组做验证。判断设计是否可用的最低标准是完美重构把任意随机信号分解再重构误差应当落在1e-10以下。注意wfilters返回的滤波器系数顺序对结果有影响做交叉验证时别把分解滤波器和重构滤波器对调否则重构误差会显著变大而不会报错。本文还有配套的精品资源点击获取