基于PASTD算法的压缩子空间跟踪MATLAB源码
项目简介
本项目是一个基于MATLAB的仿真系统,完整实现并演示了带紧缩技术的投影近似子空间跟踪(Projection Approximation Subspace Tracking with Deflation, PASTD)算法。
该项目旨在解决高维数据流处理中的实时子空间估计问题。传统的特征值分解(EVD)或奇异值分解(SVD)计算复杂度较高,难以满足实时性要求。PASTD算法应用递归最小二乘(RLS)原理,结合紧缩(Deflation)技术,能够以线性计算复杂度 $O(nr)$ 自适应地跟踪非平稳信号的主子空间。
本仿真包含从非平稳信号生成、核心算法实现、性能指标实时评估到数据压缩重构演示的全流程。
主要功能特性
- 非平稳信号环境模拟:能够生成具有时变特性的阵列信号。仿真模拟了一个均匀线性阵列(ULA),其中的信号源入射角度随时间动态变化(模拟各个信号子空间的旋转),同时添加了复高斯白噪声。
- PASTD-Deflation核心算法:实现了基于紧缩技术的PASTD算法,无需进行显式的矩阵分解,通过序贯方式逐个更新特征向量和特征值。
- 实时性能评估:
*
子空间距离:利用MATLAB内置函数实时计算估计子空间与真实子空间之间的最大主角度误差。
*
正交性监测:跟踪基向量的正交性误差 ($||W^H W - I||_F$)。
*
特征值跟踪:实时记录并展示各个信号分量的能量变化情况。
- 数据压缩与重构:利用跟踪收敛后的低维子空间对高维原始观测数据进行降维压缩,并执行反向重构,计算归一化均方误差(NMSE)以验证压缩效果。
- 多维度可视化:提供包含误差收敛曲线、特征值轨迹、正交性误差及波形重构对比的综合分析图表。
算法原理与实现逻辑
本项目代码的核心逻辑遵循PASTD-Deflation算法的标准流程,主要包含以下步骤:
- 数据流输入:程序按时间步长(快拍)逐个读取观测向量 $x(t)$。
- 紧缩循环(Deflation Loop):对于每个时刻的数据,算法内部进行 $r$ 次迭代($r$ 为信号源个数),逐个提取主分量:
*
投影计算:计算当前数据向量在第 $i$ 个基向量方向上的投影系数 $y$。
*
能量更新:使用遗忘因子 $beta$ 对特征值(信号能量)$d(i)$ 进行指数加权递归更新。
*
误差/创新向量计算:计算输入向量与重构向量之间的差异,得到误差向量 $e$。
*
基向量更新:根据RLS准则,利用误差向量和当前能量估计值更新基向量 $W(:,i)$。
*
紧缩操作:从当前数据向量中减去已估计出的分量信息 ($x = x - W(:,i) cdot y$),将残差传递给下一个分量的估计过程。这一步是确保算法能按能量大小依次提取特征向量的关键。
- 真实真值获取:为了验证算法准确性,代码在生成数据的同时,对无噪声的导向矢量矩阵进行SVD分解,获取各个时刻真实的信号子空间。
代码结构分析
1. 参数初始化与信号模型
代码首先定义了仿真场景的物理参数,包括传感器数量($n=10$)、信号源数量($r=3$)以及信噪比(SNR=20dB)。
信号生成部分构建了一个动态环境,信号源的入射角度通过
theta_start 和
theta_velocity 定义,随时间线性变化。通过构建时变的流形矩阵(Manifold Matrix)$A(t)$,生成观测数据矩阵 $X$。同时,保存了每个时刻真实的子空间基
True_Subspace 用于后续对比。
2. 初始化跟踪器
算法开始前,估计的子空间矩阵 $W_{est}$ 被初始化为一个随机正交矩阵,特征值 $d_{est}$ 初始化为较小的常数。这模拟了算法在“冷启动”状态下的行为,用于测试其收敛速度。
3. 在线跟踪循环
主循环模拟了数据流的实时处理过程。
- 核心更新:代码中嵌套的
for i = 1:r 循环严格执行了PASTD的紧缩逻辑。 - 性能监控:在每次更新后,计算估计子空间与该时刻真实子空间之间的
subspace 距离(正弦距离),并记录正交性误差。
4. 压缩与重构演示
在跟踪结束后,选取最后200个快拍的数据作为测试集。
- 压缩:将 $n$ 维观测数据左乘估计矩阵的共轭转置 $W^H$,降维至 $r$ 维。
- 重构:将压缩数据左乘估计矩阵 $W$,恢复至 $n$ 维。
- 评估:计算原始信号与重构信号之间的Frobenius范数误差。
5. 结果可视化
绘图模块生成一个包含四个子图的窗口:
- 子空间估计误差:展示误差随时间下降并收敛的过程(dB刻度)。
- 特征值跟踪:展示算法识别到的特征值幅度,反映信号能量。
- 正交性误差:验证算法在迭代过程中保持基向量正交性的能力。
- 信号重构对比:直观展示第1个通道的时域波形,对比原始信号与经过压缩-重构后的信号。
系统要求
- MATLAB:推荐使用 R2016a 或更高版本。
- 工具箱:主要依赖MATLAB基础功能,无需特殊工具箱(代码使用了标准矩阵运算及
svd, qr, subspace 等基础线性代数函数)。
使用方法
- 将代码保存为MATLAB脚本文件(例如
pastd_demo.m)。 - 在MATLAB命令窗口或编辑器中直接运行该脚本。
- 程序将输出仿真过程的日志信息(包括参数初始化、生成数据、跟踪进度、压缩比及重构误差)。
- 运行结束后,会自动弹出一个图形窗口展示算法的收敛曲线和跟踪性能。