基于压缩感知的 RSL0 稀疏重构算法
项目简介
本项目完整实现了压缩感知(Compressed Sensing)领域中的
RSL0(Robust Smoothed L0) 算法。该算法旨在解决从欠采样线性测量中恢复稀疏信号的核心问题。RSL0 算法的核心思想是利用一族连续可微的光滑函数(高斯函数)来逼近离散且不连续的 L0 范数,从而将原本 NP 难的组合优化问题转化为一系列连续函数的全局最优化问题。
项目代码通过 MATLAB 实现,不仅包含了 RSL0 算法的核心迭代逻辑,还集成了完整的测试环境和与经典 OMP(正交匹配追踪) 算法的对比分析,能够直观地展示算法在稀疏信号重构中的收敛性、准确性及抗噪能力。
主要功能特性
- RSL0 算法核心实现:实现了基于平滑函数逼近 L0 范数的完整迭代过程,包含“延拓法”策略(Continuation Strategy)和梯度下降结合投影的优化步骤。
- 稀疏信号生成环境:支持生成指定长度(N)、稀疏度(K)的随机稀疏信号,信号非零系数服从高斯分布。
- 压缩观测模拟:构建高斯随机测量矩阵,并对矩阵列向量进行归一化处理,模拟含高斯白噪声的欠采样观测过程。
- 算法性能对比:内置 OMP 算法作为基准(Benchmark),从运行时间、均方误差(MSE)、信噪比(SNR)三个维度对比 RSL0 的优势。
- 可视化分析:提供包含原始/重构信号对比、残差分布对比及 RSL0 代价函数收敛趋势的多维度可视化图表。
系统要求
- MATLAB R2016a 或更高版本
- 不需要额外的特殊工具箱(仅使用基础矩阵运算函数)
使用方法
直接在 MATLAB 环境中运行主脚本即可。程序将自动执行以下流程:
- 初始化参数并生成稀疏信号与测量矩阵。
- 分别运行 RSL0 和 OMP 算法进行信号重构。
- 在控制台输出两种算法的耗时、MSE 和 SNR 数据。
- 弹出一个包含四个子图的窗口,展示重构效果和收敛曲线。
详细实现逻辑与代码分析
本项目的主程序并未拆分为多个文件,而是将流程控制与算法函数封装在同一脚本中,具体实现逻辑如下:
1. 参数初始化与数据构建
程序首先定义了系统的关键参数:
- 信号维度:信号长度设为 512,测量数设为 256(压缩比 0.5),稀疏度设为 40。
- RSL0 参数:设定了平滑参数的截止阈值(sigma_off)和噪声标准差。
- 测量矩阵:生成高斯随机矩阵,并执行列归一化。这是压缩感知算法收敛的重要预处理步骤。
- 观测向量:通过 $y = Ax + n$ 生成观测值,其中 $n$ 为加性高斯白噪声。
2. RSL0 算法实现细节
RSL0 重构函数 (
RSL0_Reconstruction) 采用了由粗到精的
延拓法策略:
- 初始化:利用伪逆矩阵计算最小二乘解(最小 2-范数解)作为迭代的初始点 $x_0$。
- Sigma 衰减策略:初始平滑参数 $sigma$ 设为信号最大幅值的 2 倍,在每次外层循环中以 0.5 的因子衰减,直到达到预设的最小阈值。
- 内层循环(梯度下降):
* 在固定的 $sigma$ 下,执行最速下降法。
*
梯度计算:利用高斯函数的导数特性,计算每一步的更新增量 $delta = x cdot exp(-|x|^2 / 2sigma^2)$。这一步的作用是抑制小幅值元素,使其向 0 收敛。
*
投影操作(Projection):每次梯度更新后,执行 $x = x - A^{dagger}(Ax - y)$ 操作。该步骤将解强制投影回满足观测约束 $y=Ax$ 的仿射子空间中,保证解的物理一致性。
- 硬阈值处理:算法结束后,对小于
1e-4 的微小幅值强制置零,以消除底噪。
3. OMP 算法实现细节
为了评估性能,代码实现了一个标准的正交匹配追踪算法:
- 原子匹配:计算残差与测量矩阵各列的相关性,选择相关性最大的原子。
- 支撑集更新:将选中的原子索引加入支撑集。
- 正交投影:在当前支撑集上通过最小二乘法(MATLAB 的 `` 算符)求解信号幅值,更新残差。
- 迭代终止:当达到预设稀疏度 $K$ 或残差极小时停止。
4. 结果评估与可视化
程序最后通过四个子图展示结果:
- RSL0 重构对比:展示原始信号与 RSL0 重构信号的时域波形,标题包含 SNR 数值。
- OMP 重构对比:展示原始信号与 OMP 重构信号的时域波形。
- 绝对误差分析:通过火柴杆图(Stem plot)直观对比两种算法在每一个采样点上的绝对误差。
- 收敛趋势:绘制 RSL0 算法随迭代进行(Sigma 逐渐减小)时,近似 L0 代价函数值的变化曲线,验证算法的收敛性。
关键算法原理说明
- L0 范数逼近:RSL0 使用函数 $F_sigma(x) = 1 - exp(-x^2/2sigma^2)$ 来逼近 L0 范数。当 $sigma$ 很大时,该函数很平滑,不易陷入局部最优;当 $sigma to 0$ 时,该函数逼近 L0 范数。
- 最优化策略:通过逐渐减小 $sigma$,算法在初期利用平滑函数的凸性寻找全局最优解的轮廓,后期在小 $sigma$ 下通过梯度的精细调整逼近真实的稀疏解。