小波提升算法原理与MATLAB实现:从Haar到CDF 9/7
2026/9/15 16:19:38 网站建设 项目流程

简介:这是一套基于MATLAB的小波提升算法实现包,面向信号处理与图像分析方向的学生、科研人员及工程师,解决从传统小波分解到提升框架落地中的代码实现问题。压缩包共56个文件,大小约59KB,其中33个M脚本构成主体,覆盖Haar变换、79变换、atrou变换、金字塔变换以及多种提升变换的实现和测试入口;还包含5个DLL动态库、4个H头文件及C++源码,配合VC工程和解决方案文件,便于理解MEX编译流程或进行功能扩展。已有243人参与学习。借助这些代码,读者能梳理提升算法的上下采样、滤波、决策与迭代分解过程,掌握系数重排、象限选择、镜像滤波等辅助技巧,也可以对照逆变换重构流程验证信号还原效果;应用于信号去噪、图像压缩、故障诊断等场景时,可直接在MATLAB中运行验收,并快速迁移改造为自己的实验工具。

1. 小波提升算法:为什么值得在 MATLAB 里重新实现一遍

做信号去噪和图像压缩时,直接用wdenoisedwt2能很快出结果,但一旦要把算法搬上 DSP 或 FPGA,问题就来了:卷积滤波要维护较长的滤波器缓存,边界处理琐碎,浮点系数在硬件里还容易被截断。小波提升算法把传统的滤波器组拆成了分裂、预测、更新三个步骤,用最少的乘加次数完成同样的正逆变换,还天然支持整数到整数变换。这篇文章要做的就是把这个过程在 MATLAB 里完整落地:先讲清楚提升的数学结构,再给出可以直接复制运行的代码,最后把边界处理、分解深度、整数变换这些工程参数一次说透。适合正在做信号处理、图像算法或准备做嵌入式移植的工程师。

2. 从卷积小波到提升结构:分裂、预测和更新的数学机制

2.1 经典 DWT 的瓶颈在哪里

传统离散小波变换通过一对滤波器完成:信号先与低通滤波器LoD和高通滤波器HiD做卷积,再隔点抽取。这个过程中,卷积运算要求滤波器覆盖信号的每一个局部,边界位置需要额外延拓,中间结果还要暂存完整长度的数组。如果分解层数多,内存占用随层数线性增加,滤波器的长度乘以点数就是总运算量。更麻烦的是,如果想把变换系数括成整数,比如压缩到 16 bit,滤波器系数的小数部分会在量化后破坏重建精度。

提升小波的出现就是为了解决这类问题。它绕开滤波器卷积,直接对原始样本做原地更新。以最简单的 Haar 小波为例:把相邻两个样本分成偶序列和奇序列,奇序列减去偶序列得到细节,偶序列加上一半细节得到逼近。这个过程没有卷积,没有滤波器缓存,每一步都是局部加减法,逆变换只需要把顺序倒过来。

2.2 提升的四个基本步骤:分裂、预测、更新、缩放

一次标准提升分解包含四步,假设输入信号长度为 N,N 为偶数。

第一步分裂,把信号按下标分成偶序列even和奇序列odd,这一步没有信息损失,因为原信号可以由这两个序列交错拼接还原。

第二步预测,基于偶序列对奇序列做估计。如果相邻样本具有相关性,用even的某个线性组合作为预测值,与真实奇序列相减后产生细节系数d。信号越平滑,d的幅值越小。预测算子用P表示:

d = odd - P(even)

第三步更新,用细节系数d修正偶序列,得到低频逼近系数s。这一步解决的是下采样带来的直流偏移问题。如果直接保留even,低频子带均值与原信号均值不一致;加入修正项后,均值就得到了保留。

s = even + U(d)

第四步缩放,对sd分别乘上常数K0K1,让变换基保持能量归一化。这一步在浮点小波里是必须的;整数小波可以跳过或把缩放因子合并到后续量化中。

逆变换的规则是简单地反向操作:先对sd除以缩放因子,再用even = s - U(d)还原偶序列,odd = d + P(even)还原奇序列,最后把奇偶序列交错合并。

2.3 常见小波的提升系数表

实际用到的提升小波不止 Haar 一种。常用 CDF 9/7 双正交小波用于图像压缩,它由四个提升层加两个缩放因子组成,系数如下:

小波提升步骤系数值缩放因子
Haar预测:d = odd - even1K0 = sqrt(2), K1 = sqrt(2)/2
Haar更新:s = even + d/20.5
CDF 9/7预测1alpha = -1.586134342055793
CDF 9/7更新1beta = -0.052980118571906
CDF 9/7预测2gamma = 0.882911075542442
CDF 9/7更新2delta = 0.443506852044216
CDF 9/7缩放zeta = 1.149604398860247

这些系数在 MATLAB 的liftwave函数里已经内置,不需要手动输入。但理解每个系数的位置很重要,因为在addlift自定义步骤时,预测算子和更新算子的顺序会直接影响滤波器响应。

2.4 为什么重建与滤波器长度无关

提升小波每一步都是可逆的,逆变换并不需要对预测系数做矩阵求逆。无论PU是什么结构,分解之后的除法规则完全确定,因此重建误差只来自数值舍入,不来自系数近似。这个特性和滤波器组设计有本质区别:滤波器组的重构需要满足完全重建条件,即两个分解滤波器和两个重构滤波器之间存在循规约条件,提升结构则把完全重建作为默认属性。

从这一点也能理解为什么提升小波是硬件实现的首选:每个提升步骤的延迟极短,中间变量少,而且在各层之间可以共用同一组临时数组。

3. 用 MATLAB 内置函数和手写代码跑通提升变换

3.1 最短路径:liftwave 与 lwt

MATLAB 小波工具箱提供了liftwavelwtilwt三件套。liftwave返回一个提升小波结构体,lwt执行一步或多步正变换,ilwt做逆变换。一段完整可运行的代码如下:

x = sin(2*pi*2*(0:127)/128); ls = liftwave('haar'); % 一层提升分解 [A, D] = lwt(x, ls); % 提升逆变换 xr = ilwt(A, D, ls); % 重建误差应在浮点舍入范围内 max_dev = max(abs(x - xr)); fprintf('最大重建误差: %e\n', max_dev);

A是低频逼近系数,D是高频细节系数,长度都约为输入的一半。liftwave('haar')内部存储的就是 2.3 节表格里的那套分裂、预测、更新步骤。ilwt(A, D, ls)会严格按照与分解相反的顺序执行更新、预测和合并。把haar换成db2cdf97也可以,ilwt会自动处理多级提升步骤。

3.2 手写一个 Haar 提升小波,验证每一步的中间结果

内置函数容易隐藏细节,为了确认每一步在做什么,可以自己写一个函数。下面的代码实现一维 Haar 提升的正向变换:

function [ca, cd] = liftHaarForward(x) % 输入行向量或列向量,长度必须为偶数 if mod(numel(x), 2) > 0 error('输入长度必须为偶数'); end x = x(:).'; even = x(1:2:end); % 分裂:偶序列 odd = x(2:2:end); % 分裂:奇序列 d = odd - even; % 预测:细节信号 s = even + 0.5 * d; % 更新:逼近信号 ca = sqrt(2) * s; % 缩放低频 cd = sqrt(2)/2 * d; % 缩放高频 end

对应逆变换:

function xr = liftHaarInverse(ca, cd) % 逆缩放 s = ca / sqrt(2); d = cd * sqrt(2); even = s - 0.5 * d; odd = even + d; % 交错合并奇偶序列 n = numel(even); xr = zeros(1, 2*n); xr(1:2:end) = even; xr(2:2:end) = odd; end

测试这个手写实现:

x = [1 2 3 4 5 6 7 8]; [ca, cd] = liftHaarForward(x); xr = liftHaarInverse(ca, cd); disp(xr);

输出应当与x完全一致。注意正向变换里s是偶数序列加上高频修正,逆变换里必须先用even = s - 0.5*d,因为正向的s已经包含了细节贡献。这个顺序一旦写反,重建就会出现漂移。

3.3 二维提升变换与最小图像重建

二维提升可以直接用lwt2ilwt2。下面把高频子带全部清零,验证低频子带单独能否近似恢复原图:

I = peaks(256); % 生成一个 256x256 的二维测试信号 I = I - min(I(:)); I = I / max(I(:)); % 归一化到 0-1 ls = liftwave('haar'); [CA, CH, CV, CD] = lwt2(I, ls); Ir = ilwt2(CA, zeros(size(CH)), zeros(size(CV)), zeros(size(CD)), ls); mse = mean((I(:) - Ir(:)).^2); psnr_val = 10 * log10(1 / mse); fprintf('纯低频重建 PSNR: %.2f dB\n', psnr_val);

lwt2返回四个分量:低频CA,水平高频CH,垂直高频CV,对角高频CD。这个例子说明保留CA丢弃全部高频时,图像依然存在大致轮廓;实际压缩场景会在高频系数上做阈值量化,而不是直接全部置零。

3.4 lwt 与经典 dwt 的输出区别

[A,D] = lwt(x,ls)返回的是数组,而dwt(x,'db2')返回[cA,cD]。看起来相同,但dwt里经过了滤波器卷积和抽取,lwt里只做了分裂加加减法。对同一输入,两者的系数不会完全相等,除非liftwave构造的滤波器与对应正交滤波器严格一致。用途也有差异:dwt适合做小波包分析等需要频率响应的场合,lwt适合做压缩、整数变换和硬件移植。

4. 边界延拓和参数设置:影响重构精度的三个关键变量

4.1 周期延拓在短信号上会放大边缘失真

lwt默认按周期延拓处理边界,也就是说信号两端被当作首尾相连。对平稳信号影响不大,对含阶跃或趋势项的信号,边界子带系数会异常偏大。一个典型的处理方式是用wextend先对信号做对称延拓,变换后裁剪延拓区:

x = [zeros(1,32), ones(1,32)] + 0.1*randn(1,64); % 带阶跃和噪声的信号 ext = 4; % 每端扩展长度 x_ext = wextend('1D', 'sym', x, ext); ls = liftwave('haar'); [A, D] = lwt(x_ext, ls); % 只保留中间区域对应的系数 A = A(ext/2+1:end-ext/2); D = D(ext/2+1:end-ext/2);

这里sym模式按镜像对称方式延拓,能避免周期延拓带来的首尾跳变。需要强调的是,裁剪位置要根据提升的抽取值计算,不同分解深度下延拓长度和系数长度的关系不同。简单场景下,把ext设为滤波器长度的一半,再检查重建结果即可。

4.2 分解深度的选择影响阈值与系数长度

分解深度约深,低频子带越短,越容易看到信号的粗粒度结构。但深度过深,高频细节会被持续降采样,噪声与信号的界限变得更难判断。对不同信号类型,建议如下:

信号特征建议分解深度理由
平稳信号 + 白噪声2-3噪声分布在各层细节中,噪声阈值稳定
非平稳信号(语音、振动)4-5需要分离周期性冲击和背景噪声
图像压缩3-5多层分解能提高压缩比,但过多层会使图像块化

在 MATLAB 中设置深度只需要第二个参数:[A,D] = lwt(x, ls, 3)。此时AD会变成 cell 数组,每一层一组系数。使用时注意ilwt需要传入同样的深度和同一组 cell。

4.3 整数提升的代价:系数精度与带宽变化

liftwave('cdf97', 'int2int')会把浮点提升步骤转换成基于整数移位和加减的实现。这样做的好处是变换后的系数是整数,可以直接用无符号整数类型存储,逆变换也完全基于整数运算,不依赖浮点单元。代价是提升系数被近似,滤波器频率响应与浮点版本会存在细微差别。

验证整数提升的重建性:

x = round(100 * rand(1, 64)); ls_i = liftwave('cdf97', 'int2int'); [Ai, Di] = lwt(x, ls_i); xr_i = ilwt(Ai, Di, ls_i); fprintf('整数提升重建误差: %d\n', max(abs(x - xr_i)));

如果输入本身是整数序列,整数提升的重建误差应当严格为零。若输入是浮点信号,转换到整数前要先做量化,量化步长由应用需求决定。硬件实现中,这一步通常和传感器采集的 AD 精度一并考虑。

4.4 参数速查与排错入口

参数常用取值出现异常时优先检查
小波基haar,db2,cdf97重建若发散,检查ilwt是否使用了相同的ls
分解深度1-5深度大于信号长度的一半时报告维数错误
边界延拓周期延拓为默认边缘伪影过大时改用对称延拓
整数模式'int2int'输入信号范围是否超出了整数可表示范围

一旦重建误差不是零而是极大值,优先检查lwtilwt是否使用了同一个提升结构体对象,以及在多级分解时是否传入了正确的层级数。

5. 实战应用:去噪、图像压缩与自定义提升步骤

5.1 用提升小波对一维信号做软阈值去噪

提升小波和经典小波在阈值去噪上的流程完全一样:正变换、阈值系数、逆变换。区别在于提升版本更便于在嵌入式设备上用定点运算替代浮点运算。下面是一段完整的软阈值去噪流程:

t = 0:1/255:1; clean = sin(4*pi*t) + 0.5*sin(8*pi*t); sig = clean + 0.3*randn(size(t)); ls = liftwave('haar'); [As, Ds] = lwt(sig, ls, 3); % 每层细节按层长自适应调整阈值 for k = 1:3 Dk = Ds{k}; thr = sqrt(2 * log(numel(Dk))); Ds{k} = sign(Dk) .* max(abs(Dk) - thr, 0); end % 重构去噪信号 sig_rec = ilwt(As, Ds, ls); mse_before = mean((sig - clean).^2); mse_after = mean((sig_rec - clean).^2); fprintf('去噪前 MSE: %.4f, 去噪后 MSE: %.4f\n', mse_before, mse_after);

这里用signmax实现软阈值,比硬阈值产生的结果更平滑。阈值公式参考了 Donoho 提出的通用阈值估计,适合高斯白噪声;实际应用中应根据噪声标准差乘以一个可调系数。分解深度取 3 时,lwt返回的AsDs都是 cell 数组,逆变换也要使用同样的 cell。

5.2 图像压缩:不同高频保留比例下的 PSNR

lwt2做图像压缩实验,思路是对高频系数做阈值截断,保留幅值最大的部分,然后量化或置零。为了观察保留比例对重建质量的影响,可以按百分位设置阈值:

X = peaks(256); X = X - min(X(:)); X = X / max(X(:)); ls = liftwave('haar'); [CA, CH, CV, CD] = lwt2(X, ls); % 合并高频系数并取百分位阈值 H = [CH(:); CV(:); CD(:)]; for keep = [0.1, 0.5, 0.9] thr = quantile(abs(H), 1 - keep); CHq = CH .* (abs(CH) > thr); CVq = CV .* (abs(CV) > thr); CDq = CD .* (abs(CD) > thr); Xr = ilwt2(CA, CHq, CVq, CDq, ls); mse = mean((X(:) - Xr(:)).^2); psnr = 10 * log10(1 / mse); fprintf('保留比例 %.0f%%, PSNR %.2f dB\n', keep*100, psnr); end

保留比例指高频系数中非零元素的占比。quantile函数计算出的阈值用于生成二值掩膜,高于阈值的系数保留,低于阈值的置零。这个实验只压缩高频,低频原样保留,因此 PSNR 的下限不会太低。工程实践中还会对CA做量化或差分编码,进一步压缩数据。

5.3 用 addlift 给 Haar 小波增加自定义预测步骤

addlift函数允许在已有提升结构中加入自定义预测和更新算子。下面给 Haar 小波增加一个更新步骤,用于调整低频子带的频响特性:

ls = liftwave('haar'); % 新增加一个更新步骤,表示 even + (-0.25)*d(i-1) + 0.25*d(i) els = {'u', [-0.25 0.25], 0}; ls_modified = addlift(ls, els, 'p1'); x = randn(1, 256); [A, D] = lwt(x, ls_modified); xr = ilwt(A, D, ls_modified); fprintf('自定义提升重建误差: %e\n', max(abs(x - xr)));

els中的'u'表示更新算子,系数向量[-0.25 0.25]表示对当前和相邻细节系数做加权,第三个参数0控制时移点。位置参数'p1'表示把新步骤追加到现有提升步骤之后。这种修改不会破坏重建精度,因为逆变换依然按照相同步骤反转。若要设计自己的小波基,建议先用freqz查看修改后的等效滤波器响应,再迭代系数。

6. 验证与定点化:把 MATLAB 提升算法移植到硬件前的最后检查

移植到 C 或硬件之前,有两件事务必确认:正逆变换闭合,边界条件在循环调用时保持一致。推荐先写一段批量验证脚本,对随机长度和随机内容的信号做一遍转换,用断言检查重建误差:

for n = [64, 128, 256] x = randn(1, n); [A, D] = lwt(x, liftwave('db2')); xr = ilwt(A, D, liftwave('db2')); assert(max(abs(x - xr)) < 1e-10, ['长度 ' num2str(n) ' 重建失败']); end

如果使用整数提升,把误差上限改为0,并要求输入信号全部转换为整数。定点化时,MATLAB 的fi对象可以模拟定长小数格式。提升系数按 Q 格式缩放后,逆变换的缩放因子也要成比例还原,否则低频子带的幅度会偏移:

T = numerictype(1, 16, 14); % 1 位符号, 16 位全长, 14 位小数 x_fi = fi(x, T);

最后用tic/toc对比同一信号下lwtdwt的耗时,通常提升实现可减少约三分之一的乘加操作;若在硬件上继续观察,重点监控预测与更新步骤中的乘数位宽,避免累加过程中出现上溢。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询