一、算法原理与流程
正交匹配追踪(OMP)是一种经典的稀疏分解算法,其核心思想是通过迭代选择与残差最相关的原子,逐步逼近原始信号。算法流程如下:
- 初始化:残差 $r_0 = y$,支持集 $\ ext{Λ}_0 = \emptyset$,迭代次数 $k=0$。
- 原子选择:计算残差与字典原子的内积,选择绝对值最大的原子索引 $\lambda_k = \text{argmax}_j |\langle r_k, d_j \rangle|$。
- 支持集更新:将选中的原子索引加入支持集 $\text{Λ}_{k+1} = \text{Λ}_k \cup {\lambda_k}$。
- 最小二乘求解:在支持集对应的原子子集上求解稀疏系数 $x_{k+1} = \text{argmin}\alpha |y - D{\text{Λ}_{k+1}}\alpha|_2$。
- 残差更新:计算新残差 $r_{k+1} = y - D_{\text{Λ}{k+1}} x{k+1}$。
- 终止条件:当达到预设稀疏度 K 或残差能量低于阈值时停止。
二、MATLAB 代码实现
function [x_sparse, residual] = omp_signal_decomposition(y, D, K, threshold)
% 输入参数:
% y: 待分解信号 (1×N)
% D: 过完备字典 (M×N_atoms)
% K: 最大稀疏度
% threshold: 残差能量阈值
% 输出参数:
% x_sparse: 稀疏系数 (N_atoms×1)
% residual: 最终残差
[M, N_atoms] = size(D);
residual = y;
x_sparse = zeros(N_atoms, 1);
support_set = [];
for k = 1:K
% 计算残差与所有原子的内积
correlations = abs(D' * residual);
% 选择最大相关原子索引
[~, new_atom_idx] = max(correlations);
support_set = [support_set, new_atom_idx];
% 构建子字典和最小二乘解
D_subset = D(:, support_set);
x_subset = pinv(D_subset) * y;
% 更新稀疏系数
x_sparse(support_set) = x_subset;
% 更新残差
residual = y - D_subset * x_subset;
% 检查终止条件
if norm(residual)^2 < threshold
break;
end
end
end
三、关键优化与扩展
- 字典预处理
- 结构化字典:使用 Gabor 字典或随机矩阵提升分解效率。
- 加速技巧
- 残差提前终止:当残差能量低于阈值时提前退出循环。
- 性能评估
稀疏度验证:统计非零系数的比例。
sparsity = nnz(x_sparse) / length(x_sparse);
重构误差:计算原始信号与重构信号的均方误差。
reconstruction = D * x_sparse;
error = norm(y - reconstruction) / norm(y);
并行计算:利用 MATLAB 并行工具箱加速内积计算。
correlations = abs(D' * residual); % 内置并行优化
原子归一化:确保字典原子为单位长度,避免幅值影响内积计算。
D = D ./ vecnorm(D); % 列归一化

