基于投影思想的匹配追踪(MP)信号稀疏分解算法实现
项目介绍
本项目是一个基于MATLAB环境开发的信号处理算法演示程序,旨在完整复现并演示
匹配追踪(Matching Pursuit, MP)算法。MP算法是一种经典的贪婪迭代算法,其核心原理基于投影思想:将信号在过完备字典库中进行分解,通过逐次迭代寻找与当前残差信号最相关的原子(Atom),从而实现信号的稀疏表示。
该项目不仅实现了算法核心,还包含了一个混合分量(正弦、线性调频、脉冲)的合成信号生成器以及一个包含多种变换基(DCT、单位脉冲、Gabor)的混合过完备字典,生动展示了稀疏分解在捕捉不同信号特征时的有效性。
功能特性
- 多成分合成信号生成:自动生成包含低频正弦波、高频Chirp信号、局部突变脉冲及高斯白噪声的混合信号,用于模拟复杂的时频特性。
- 混合过完备字典构建:手动构建包含三种特征的混合字典,无需依赖特定工具箱函数,实现了对时域、频域和时频域特征的全面覆盖。
- MP核心算法引擎:基于内积投影原理实现的贪婪迭代求解器,支持最大迭代次数和最小残差能量双重终止条件。
- 信号重构与评估:基于筛选出的稀疏系数和原子索引重构信号,并自动计算均方误差 (MSE) 和信噪比 (SNR)。
- 全方位可视化:提供原始/重构信号对比、残差信号波形、能量收敛曲线以及字典原子系数分布图。
系统要求
- MATLAB R2016b 或更高版本
- 不需要额外的复杂的工具箱(代码内部通过基础矩阵运算实现了DCT基和Gabor原子的构建)
使用方法
- 确保MATLAB当前工作路径包含
main.m 文件。 - 在MATLAB命令行窗口输入
main 并回车,或直接在编辑器中运行该脚本。 - 程序将自动执行信号生成、字典构建、迭代分解和结果绘图,并在控制台输出迭代过程和误差分析数据。
---
详细实现逻辑与代码分析
本项目的主要逻辑封装在 main.m 文件中,执行流程严格按照以下五个步骤进行:
1. 系统参数设置与信号生成
程序首先定义信号长度 $N=256$,并合成了一个具有代表性的测试信号
x_orig,该信号由以下部分叠加而成:
- 低频正弦分量:模拟平稳的周期信号 (
s1)。 - 高频线性调频 (Chirp) 分量:模拟频率随时间变化的非平稳信号,并加了高斯包络 (
s2)。 - 随机脉冲分量:在特定位置(第50和200点)添加突变脉冲 (
s3)。 - 噪声:叠加了微量的加性高斯白噪声。
- 预处理:最后对混合信号进行了 $ell_2$ 范数归一化处理。
2. 过完备字典构建 (Dictionary Construction)
为了适应信号中不同成分的稀疏表示,代码构建了一个混合型过完备字典 $D$,总列数远大于信号长度 $N$。字典由三部分级联而成:
- DCT字典 (频域稀疏):通过余弦函数构建,采用了 $2N$ 的过采样频率网格,擅长捕捉平稳的低频正弦信号。
- 单位脉冲字典 (时域稀疏):即 $N times N$ 的单位矩阵 (Identity),专门用于精确捕捉信号中的突变脉冲。
- Gabor字典 (时频局部化):通过手动循环生成的加窗余弦和正弦函数。使用固定的高斯窗宽 ($sigma=16$),在不同的时间位移 (Shift) 和调制频率 (Freq) 上生成原子,用于捕捉Chirp等非平稳分量。
- 原子归一化:构建完成后,代码遍历字典的每一列,将其归一化为单位 $ell_2$ 范数,这是MP算法计算投影系数的前提。
3. 匹配追踪 (MP) 核心算法
这是代码的核心部分,实现了基于贪婪策略的迭代分解。
- 初始化:将残差
residual 初始化为原始信号,并将稀疏系数向量置零。 - 迭代循环:
1.
投影 (Projection):计算当前残差与字典中所有原子的内积 (
D' * residual)。
2.
最佳匹配 (Best Matching):寻找内积绝对值最大的原子索引 (
best_idx) 及其对应的投影系数 (
best_coeff)。
3.
更新残差 (Update):根据MP算法公式 $R_{n+1} = R_n - langle R_n, g_{gamma_n} rangle g_{gamma_n}$,从当前残差中减去最佳原子上的投影分量。
4.
记录:保存当前迭代选中的原子索引、系数以及当前的残差能量。
- 终止条件:当迭代次数达到
max_iter (100次) 或残差能量低于 min_residual (0.01) 时停止迭代。
4. 信号重构与误差分析
迭代结束后,利用记录的
sparse_coeffs (稀疏系数) 和
atom_indices (原子索引) 进行信号重构。
- 重构公式:$hat{x} = sum_{k} alpha_k cdot g_{k}$。
- 误差计算:计算原始信号与重构信号的差值,进而求得均方误差 (MSE) 和重构信噪比 (SNR),并在控制台打印。
5. 结果可视化
代码最后生成一个包含四个子图的图形窗口:
- 子图 1 (Top):展示原始信号(蓝色实线)与MP重构信号(红色虚线)的对比,标题中注明了SNR和使用的原子数量。
- 子图 2 (Bottom-Left):展示最终无法被分解的残差信号波形。
- 子图 3 (Bottom-Right):绘制迭代过程中残差能量随迭代次数的单调衰减曲线,直观反映算法的收敛速度。
- 子图 4 (Bottom-Wide):展示字典原子的稀疏系数分布 Stem 图。代码巧妙地使用竖线划分了DCT、Dirac和Gabor原子的区域,便于观察算法具体选择了哪种类型的原子来表示信号的不同成分(例如,低频部分对应DCT区,脉冲部分对应Dirac区)。