基于Mallat算法的独立实现三层小波分解程序
项目简介
本项目是一个基于MATLAB原生代码实现的信号处理工程,旨在在不依赖MATLAB官方小波工具箱(Wavelet Toolbox)函数的情况下,完整复现Mallat金字塔算法。
程序专注于一维信号的三层离散小波分解(DWT),通过底层编程展示了多分辨率分析的核心机制。该实现有助于无需工具箱授权的环境下进行相关研究,同时为学习者深入理解小波变换中的“滤波器组”和“多抽样率信号处理”理论提供了清晰的代码范例。
功能特性
- 零依赖性:完全使用MATLAB基础函数(如
conv, sin, plot)编写,无需安装任何附加工具箱。 - Mallat算法复现:严格遵循Mallat金字塔分解流程,实现“卷积滤波”与“下采样”的循环操作。
- 自定义滤波器:内置Daubechies 4 (db4) 小波基系数,并展示了如何通过正交镜像关系(QMF)由低通滤波器构建高通滤波器。
- 三层分解结构:能够提取信号在不同尺度下的近似系数(低频)和细节系数(高频)。
- 全景可视化:自动生成包含原始信号及各层分解系数(cA3, cD3, cD2, cD1)的对比波形图,直观展示频域特征的空间分布。
系统要求
- MATLAB R2016a 或更高版本(代码仅使用基础数学运算,向后兼容性极佳)。
- 无需任何第三方插件或工具箱。
使用方法
- 确保MATLAB环境已安装并配置完毕。
- 将主要脚本文件(包含
main 函数的文件)放置于当前工作目录下。 - 直接运行
main 函数。 - 程序运行结束后,将自动清理工作区,并弹出一个绘图窗口展示分解结果。
实现细节与算法分析
本项目严格对应 main.m 中的代码逻辑,主要包含以下四个核心模块:
1. 信号合成
程序首先生成一个采样频率为 1024Hz、时长为 1秒的合成测试信号,用于验证小波分解对不同频率成分的捕捉能力。信号包含以下特征:
- 低频基底:10Hz 正弦波,模拟背景信号。
- 中频分量:100Hz 正弦波,用于测试中频细节捕捉。
- 瞬态突变:在 0.5秒处叠加阶跃信号,用于验证小波的时域定位能力。
- 随机噪声:叠加高斯白噪声,模拟真实环境干扰。
2. 滤波器构建 (Daubechies 4)
代码中不调用
wfilters,而是硬编码定义了
db4 小波的分解低通滤波器系数 (
lod_db4)。
- 高通滤波器生成:根据正交镜像滤波器(QMF)原理,通过代码动态计算分解高通滤波器系数 (
hid_db4)。计算公式采用了交替变号并反转序列的方法:Hi_D(n) = (-1)^n * Lo_D(L - 1 - n)。
3. 三层 Mallat 金字塔分解
这是程序的核心部分,通过级联方式实现多分辨率分析:
- 第一层分解:输入原始信号,经过滤波和二抽取,分离出第一层近似系数
cA1 和细节系数 cD1。cD1 包含最高频的噪声和突变边缘信息。 - 第二层分解:将上一层的近似系数
cA1 作为输入,再次进行分解,产生 cA2 和 cD2。 - 第三层分解:将
cA2 作为输入,最终产生 cA3(最低频概貌)和 cD3。 - 数据流向:Signal -> (cA1, cD1) -> (cA2, cD2) -> (cA3, cD3)。最终保留并绘制的是
cA3, cD3, cD2, cD1。
4. 核心算法逻辑 (mallat_decomposition 函数)
代码底部的子函数封装了Mallat算法的原子操作,具体步骤如下:
- 卷积运算 (Convolution):
* 使用 MATLAB 原生
conv 函数(模式为
'full')。
* 信号分别与低通滤波器 (
lo_filter) 和高通滤波器 (
hi_filter) 进行全卷积。
- 下采样/隔点抽取 (Downsampling):
* 模拟离散小波变换中的二抽取过程。
* 代码逻辑为
output = full_conv_result(2:2:end),即去除所有奇数索引点,仅保留偶数索引点,从而使数据量减半(符合奈奎斯特定理在多抽样率系统中的应用)。
可视化输出
程序运行后生成的图形窗口包含5个子图,从上至下依次为:
- 原始信号:展示时域波形。
- 第三层近似系数 (cA3):信号的低频整体趋势。
- 第三层细节系数 (cD3):较低频段的细节信息。
- 第二层细节系数 (cD2):中频段的细节信息。
- 第一层细节系数 (cD1):高频段细节(主要包含噪声和阶跃突变的边缘)。
通过观察子图,可以清晰地看到不同频率成分(如10Hz低频波和100Hz中频波)是如何被分离到不同的系数层级中的。