大规模MIMO信道估计:LS、OMP、MOMP、CoSaMP算法对比与仿真

📅 2026/8/26 21:18:17
大规模MIMO信道估计:LS、OMP、MOMP、CoSaMP算法对比与仿真
大规模 MIMO 通信系统的信道估计并不是在理想矩阵条件下求解一个最小二乘问题那么简单。当基站天线数达到数十甚至上百导频资源又被数据业务挤压时LS、OMP、MOMP 和 CoSaMP 这四种算法会在估计精度、稀疏度利用、多天线联合能力和计算复杂度之间表现出明显差异。这里在 MATLAB 中搭建一套基于部分傅里叶导频字典的信道冲激响应估计流程用同一组信道数据对比这四种算法的归一化均方误差、运行时间和对导频数量的敏感度同时给出可运行的示例代码、常见报错和排查清单。读者学完后可以把这个流程迁移到自己的 OFDM 仿真链路中也可以继续替换测量矩阵、信道模型和稀疏度估计模块。大规模 MIMO 信道估计的难点在于“天线多、参数多、导频少”。如果直接把每根接收天线的信道当作独立未知向量去求解导频数量往往不够算法容易受到噪声和矩阵病态性影响。如果利用信道在时延域或角度域的稀疏性并用压缩感知类算法恢复支撑集又需要处理支撑集是否稳定、稀疏度是否已知、多天线是否联合等问题。LS、OMP、MOMP 和 CoSaMP 正是四种不同思路的代表理解它们的差异比单纯看 NMSE 曲线更重要。1. 先理解大规模 MIMO 信道估计的稀疏模型1.1 从接收方程看信道估计的输入输出在 OFDM 系统中发送端在部分子载波上放置导频符号接收端通过这些导频上的接收值来估计信道频域响应。若只关心时延域的稀疏信道可以建立如下观测模型Y A X N其中Y 是 P 行 M 列的接收导频矩阵P 为导频子载波数M 为基站接收天线数。A 是 P 行 L 列的导频字典矩阵L 是时延候选格点数也相当于稀疏表示字典的原子数。X 是 L 行 M 列的信道矩阵每一列对应一根接收天线上的时延信道抽头。N 是 P 行 M 列的复高斯噪声矩阵。在实际信道中X 往往具有“行稀疏”特性。也就是说虽然 L 可能很大但真正有显著能量的是其中 K 个时延抽头K 远小于 L。这个稀疏性正是 OMP、MOMP、CoSaMP 等压缩感知算法的用武之地。如果只估计单个天线信道可以退化为y A h n其中 h 是 L 维列向量y 是 P 维列向量。此时 LS 可以写成h_ls pinv(A) * y当 P 大于等于 L 且 A 满秩时LS 是线性最优估计。但在大规模 MIMO 中为了节省导频开销P 往往小于 L此时方程是欠定的LS 解并不是唯一也不一定符合信道稀疏先验。因此需要引入稀疏恢复算法。1.2 LS、OMP、MOMP、CoSaMP 的定位差异LS 是最小化观测残差的线性估计。它实现简单计算量低但不利用信道稀疏性在 P 小于 L 时噪声和干扰会被放大。OMP 是贪心追踪算法。它每次从字典中选择与当前残差最相关的原子加入支撑集再做最小二乘更新直到找到 K 个原子。OMP 本质上是单测量向量算法如果对每根天线分别执行就忽略了多天线之间可能共享相同支撑集的先验。MOMP 在本例中按多测量向量 OMP 实现即 Multiple Measurement Vector OMP。它把多根天线的接收信号拼成矩阵 Y在每次迭代中计算所有原子的联合投影能量选出公共支撑集再一次性用最小二乘恢复所有天线的增益。相比逐天线 OMPMOMP 在低信噪比下更稳定因为它用多列观测共同投票决定支撑集能压低单个天线上的噪声影响。CoSaMP 是压缩采样匹配追踪算法。它的思想是在每次迭代中先选出多个候选原子再通过最小二乘估计系数最后只保留幅度最大的 K 个系数。CoSaMP 的突出特点是支持集可以回溯修正不像 OMP 一旦选入支撑集就不会退出。从算法思想看LS 属于线性估计OMP 和 CoSaMP 属于稀疏恢复MOMP 属于多测量向量联合稀疏恢复。它们在工程选型中的差异可以用下表概括算法是否需要稀疏度是否利用多天线联合主要优点主要局限LS否逐天线处理不联合实现简单复杂度低欠定时性能差不利用稀疏先验OMP是逐天线处理不联合实现直观支撑集准确度较高对噪声敏感支撑集不可回溯MOMP是是所有天线共享支撑集低信噪比下支撑集估计更稳要求各天线支撑集一致否则会丢原子CoSaMP是逐天线处理不联合支持集可回溯适合中高信噪比迭代和排序逻辑较复杂计算量更大从这里可以看出没有一种算法在所有场景下都最优。仿真的价值就在于把“原理上的差异”转化为“曲线上的差异”然后结合导频开销和计算资源做取舍。2. 仿真环境、系统参数与导频字典设计2.1 MATLAB 环境与工具箱要求本套仿真代码以 MATLAB 为基础主要使用矩阵运算、随机数生成、排序和绘图函数。主流 MATLAB R2020b 及以上版本都可以运行不需要额外购买通信工具箱。涉及的函数包括randperm生成随机导频索引。pinv伪逆矩阵用于 LS。\最小二乘求解用于 OMP、MOMP、CoSaMP 的内部估计。norm计算范数用于 NMSE。semilogy绘制对数纵轴曲线。如果你的 MATLAB 版本较老注意maxk可能不存在下面代码中统一用sort替代避免版本问题。2.2 系统参数表与物理含义仿真参数需要对齐物理含义否则结果的趋势没有解释力。下面是一组推荐的默认参数参数推荐值物理含义对结果的影响N256OFDM 子载波总数决定导频索引的分布空间L64时延候选格点数字典原子数越大表示时延分辨率越高P64导频子载波数观测数量P 越大恢复越容易K6信道非零抽头数稀疏度K 越小稀疏性越强M16基站接收天线数MOMP 联合利用的天线数量SNR_dB0:5:30信噪比衡量算法在不同噪声强度下的表现nMonte50蒙特卡洛次数次数越多曲线越平滑但耗时越长在开始仿真前建议先建立一个参数检查清单确认 P 是否大于等于 K否则稀疏恢复的信息量不足。确认 L 是否远大于 K否则稀疏性不成立。确认 M 至少大于 1否则 MOMP 退化为 OMP。确认随机种子固定保证不同算法使用同一组信道和噪声。2.3 导频字典部分傅里叶矩阵与随机导频本仿真使用部分傅里叶矩阵作为导频字典对应 OFDM 导频子载波上的傅里叶变换关系。生成方式如下N 256; % OFDM 子载波总数 L 64; % 时延候选格点数 P 64; % 导频子载波数 pilotIdx sort(randperm(N, P)); A (1 / sqrt(P)) * exp(-1i * 2 * pi * pilotIdx(:) * (0:L-1) / N);使用随机导频索引的原因是让字典矩阵尽量满足受限等距性质相关条件。若导频间隔过大或过于规律某些时延格点可能无法被区分稀疏恢复性能会明显下降。实际系统中导频位置由协议和资源块结构决定这里用随机选择是为了在仿真中观察一般规律。字典生成后建议检查size(A)是否等于P x L并查看条件数。条件数过大时LS 的数值稳定性较差但 OMP、CoSaMP 等算法受矩阵病态性的影响相对较小。3. 四种算法原理与 MATLAB 函数实现3.1 LS 估计用伪逆做基准LS 不利用稀疏性直接对观测矩阵求伪逆function X_ls lsChannelEstimate(A, Y) X_ls pinv(A) * Y; end当 P 小于 L 时pinv(A)返回最小范数解它可能把能量分散到所有 L 个抽头上导致估计结果不稀疏。正是这种“不稀疏”的输出方便和 OMP、MOMP、CoSaMP 的结果形成对比。LS 的优点是快适合作为性能下界或基准缺点是导频不够时误差较大尤其在高稀疏度信道下无法体现优势。3.2 OMP逐天线稀疏恢复OMP 的核心是迭代式地选择原子。对每根天线单独估计伪代码如下初始化残差 r y。重复 K 次计算 A 的每一列与 r 的相关性选择绝对值最大的一列。将该列索引加入支撑集。用支撑集上的列做最小二乘更新系数。更新残差。MATLAB 实现如下function X_hat ompChannelEstimate(A, Y, K) [~, L] size(A); M size(Y, 2); X_hat zeros(L, M); for m 1:M y Y(:, m); r y; support []; for iter 1:K corr A * r; [~, idx] max(abs(corr)); % 避免重复选择同一原子 if ismember(idx, support) corr(idx) -inf; [~, idx] max(abs(corr)); end support [support; idx]; A_s A(:, support); x_s A_s \ y; r y - A_s * x_s; end x_full zeros(L, 1); x_full(support) x_s; X_hat(:, m) x_full; end end这段代码有一个需要特别注意的地方support是一个不断增长的列向量ismember(idx, support)用来检测原子是否已被选过。如果缺失这一步同一列可能被重复选中导致支撑集数量不足最小二乘结果也会出现秩亏损。OMP 在噪声较小时性能很好但在低信噪比下会选错原子。一次选错会对后续迭代产生累积影响这是贪心算法的固有缺点。3.3 MOMP多测量向量联合支撑集估计MOMP 的改进思路是所有天线共享同一个时延支撑集因此迭代时应联合所有天线的投影能量。相关函数写成function X_hat mompChannelEstimate(A, Y, K) [~, L] size(A); M size(Y, 2); R Y; support []; for iter 1:K Proj A * R; % L x M energy sum(abs(Proj).^2, 2); % 每个原子的联合能量 [~, idx] max(energy); if ismember(idx, support) energy(idx) -inf; [~, idx] max(energy); end support [support; idx]; A_s A(:, support); X_s A_s \ Y; R Y - A_s * X_s; end X_hat zeros(L, M); X_hat(support, :) X_s; end这里的关键在于energy sum(abs(Proj).^2, 2)。它把所有天线的投影能量累加相当于多根天线共同对每个时延原子投票。相比 OMP 逐天线独立选择支撑集MOMP 在多天线场景下更能抵抗个别天线上的强噪声。也可以把 MOMP 理解为“把多测量向量问题转换成单测量向量问题的一种近似”。它要求各天线信道的支撑集一致。在典型的无线信道中同一用户的信号到达基站不同天线时时延位置通常相同只是复增益不同因此这个假设是合理的。若实际场景中各天线时延支撑集不一致强制联合恢复会丢失部分抽头。3.4 CoSaMP带回溯的迭代硬阈值思路CoSaMP 与 OMP 的核心区别是它每轮先选择 2K 个候选原子合并旧支撑集后做最小二乘再保留幅度最大的 K 个系数。这样可以修正之前选错的原子。function X_hat cosampChannelEstimate(A, Y, K) [~, L] size(A); M size(Y, 2); X_hat zeros(L, M); for m 1:M y Y(:, m); r y; support []; x_new zeros(L, 1); maxIter 10; for iter 1:maxIter corr A * r; [~, order] sort(abs(corr), descend); idxTop order(1:min(2*K, L)); candidate union(support, idxTop); A_c A(:, candidate); x_c zeros(L, 1); x_c(candidate) A_c \ y; [~, order2] sort(abs(x_c(candidate)), descend); keepIdx candidate(order2(1:min(K, length(candidate)))); support keepIdx; x_new zeros(L, 1); x_new(support) x_c(support); r y - A(:, support) * x_new(support); if norm(r) 1e-8 * norm(y) break; end end X_hat(:, m) x_new; end endCoSaMP 的候选原子数通常取 2K这是它的典型设计。union操作让旧支撑集和新候选集合并然后通过最小二乘重新评估所有候选原子的贡献最后只保留最大 K 个系数。这种回溯机制让 CoSaMP 在高信噪比下通常能获得比 OMP 更稳定的支撑集。需要注意的是CoSaMP 依然需要提前知道稀疏度 K。如果 K 与实际偏差很大性能会明显下降。另外循环内的A_c \ y每次都要重算计算量通常比 OMP 大。4. 主仿真流程与性能指标计算4.1 主脚本参数与 Monte Carlo 循环主脚本负责生成信道、添加噪声、调用四种算法并统计结果。为了保证公平每条蒙特卡洛样本都使用同一组信道和噪声然后分别送入四种算法。clear; clc; close all; rng(2025); N 256; L 64; P 64; K 6; M 16; SNR_dB 0:5:30; nMonte 50; pilotIdx sort(randperm(N, P)); A (1 / sqrt(P)) * exp(-1i * 2 * pi * pilotIdx(:) * (0:L-1) / N); nmse_ls zeros(size(SNR_dB)); nmse_omp zeros(size(SNR_dB)); nmse_momp zeros(size(SNR_dB)); nmse_cosamp zeros(size(SNR_dB)); time_ls zeros(size(SNR_dB)); time_omp zeros(size(SNR_dB)); time_momp zeros(size(SNR_dB)); time_cosamp zeros(size(SNR_dB)); for s 1:length(SNR_dB) snr SNR_dB(s); for mc 1:nMonte X generateSparseChannel(L, K, M); Y A * X; sigPow mean(abs(Y(:)).^2); noisePow sigPow / (10^(snr / 10)); Nn sqrt(noisePow / 2) * (randn(P, M) 1i * randn(P, M)); Yn Y Nn; tic; X_ls pinv(A) * Yn; time_ls(s) time_ls(s) toc; nmse_ls(s) nmse_ls(s) norm(X_ls - X, fro)^2 / norm(X, fro)^2; tic; X_omp ompChannelEstimate(A, Yn, K); time_omp(s) time_omp(s) toc; nmse_omp(s) nmse_omp(s) norm(X_omp - X, fro)^2 / norm(X, fro)^2; tic; X_momp mompChannelEstimate(A, Yn, K); time_momp(s) time_momp(s) toc; nmse_momp(s) nmse_momp(s) norm(X_momp - X, fro)^2 / norm(X, fro)^2; tic; X_cosamp cosampChannelEstimate(A, Yn, K); time_cosamp(s) time_cosamp(s) toc; nmse_cosamp(s) nmse_cosamp(s) norm(X_cosamp - X, fro)^2 / norm(X, fro)^2; end nmse_ls(s) nmse_ls(s) / nMonte; nmse_omp(s) nmse_omp(s) / nMonte; nmse_momp(s) nmse_momp(s) / nMonte; nmse_cosamp(s) nmse_cosamp(s) / nMonte; time_ls(s) time_ls(s) / nMonte; time_omp(s) time_omp(s) / nMonte; time_momp(s) time_momp(s) / nMonte; time_cosamp(s) time_cosamp(s) / nMonte; end信道生成函数如下它生成一个L x M行稀疏矩阵每根天线的时延支撑集相同复增益不同function X generateSparseChannel(L, K, M) X zeros(L, M); tauIdx randperm(L, K); for k 1:K g (randn(1, M) 1i * randn(1, M)) / sqrt(2); X(tauIdx(k), :) g / sqrt(K); end end这里用randperm(L, K)随机选择 K 个时延抽头然后给每根天线生成复增益。除以sqrt(K)是为了让总信道功率归一化便于后续 NMSE 统计。4.2 NMSE 与运行时间统计归一化均方误差定义为NMSE ||X_hat - X||_F^2 / ||X||_F^2其中||.||_F表示 Frobenius 范数。在 MATLAB 中写成nmse norm(X_hat - X, fro)^2 / norm(X, fro)^2;计算时注意噪声和信道都是复数矩阵不能只用实部或虚部。另外NMSE 是汇总指标它会把所有天线和所有时延抽头的误差都包含进去适合观察整体估计质量。运行时间统计使用tic和toc。为了公平计时范围只包含估计函数不包含信道生成和 NMSE 计算。实际运行中CoSaMP 因为内部有多次排序和最小二乘通常比 OMP 更耗时MOMP 虽然在每次迭代中处理矩阵但支撑集只需要估计一次多天线规模越大相对 OMP 逐天线处理的效率优势越明显。4.3 绘制对比曲线仿真完成后可以用半对数坐标绘制 NMSE 曲线figure; semilogy(SNR_dB, nmse_ls, o-, LineWidth, 1.5); hold on; semilogy(SNR_dB, nmse_omp, s-, LineWidth, 1.5); semilogy(SNR_dB, nmse_momp, ^-, LineWidth, 1.5); semilogy(SNR_dB, nmse_cosamp, d-, LineWidth, 1.5); hold off; grid on; xlabel(SNR (dB)); ylabel(NMSE); legend(LS, OMP, MOMP, CoSaMP, Location, best);运行时间对比可以使用普通线性坐标因为不同算法之间可能存在数量级差异也可以使用semilogy折线图figure; plot(SNR_dB, time_ls, o-); hold on; plot(SNR_dB, time_omp, s-); plot(SNR_dB, time_momp, ^-); plot(SNR_dB, time_cosamp, d-); hold off; grid on; xlabel(SNR (dB)); ylabel(Average running time (s)); legend(LS, OMP, MOMP, CoSaMP, Location, best);5. 仿真结果分析与性能趋势解读5.1 不同 SNR 下的 NMSE 趋势在默认参数下通常会看到以下趋势LS 的 NMSE 随 SNR 提高而下降但由于 P 小于 L估计结果始终不是稀疏的因此 NMSE 一般明显高于三种稀疏恢复算法。OMP 在低信噪比时可能出现错误选择原子导致 NMSE 曲线出现平台期或振荡SNR 提高后支撑集估计逐渐准确NMSE 下降速度变快。MOMP 由于多天线联合投票在低信噪比时支撑集估计比 OMP 稳定NMSE 通常更低尤其当 M 较大时优势更明显。CoSaMP 在中高信噪比下表现与 OMP 接近但因为它具备支撑集回溯能力在高信噪比下一般能正确识别支撑集NMSE 可能低于 OMP。需要说明这不是绝对结论。导频矩阵是随机生成的改变随机种子、P、L、K 都会影响曲线排序。尤其是 K 接近 P 时稀疏恢复算法都会遇到困难LS 与稀疏算法的差距会缩小。下面的表格适合用来记录某一组固定参数下的仿真结果作为自己实验的对比模板SNR (dB)NMSE-LSNMSE-OMPNMSE-MOMPNMSE-CoSaMP备注0待填待填待填待填关注低信噪比支撑集稳定性10待填待填待填待填关注中高信噪比收敛趋势20待填待填待填待填关注接近噪声底时的误差30待填待填待填待填关注算法上限5.2 导频数和稀疏度变化时谁的性能更稳除了 SNR导频数 P 和稀疏度 K 是两个最重要的系统参数。在其他条件不变时可以分别做两组扫描固定 K 和 M改变 P观察正确恢复支撑集的临界导频数。固定 P 和 M改变 K观察算法在稀疏度升高后的退化速度。当 P 很小时LS 性能迅速恶化OMP 和 CoSaMP 可能因为观测不足而选错支撑集MOMP 因为联合多天线的信息通常能坚持到更低的 P。当 K 增大时所有算法的恢复难度都会上升。相比 OMPCoSaMP 在 K 估计偏大时更容易保留多余小系数NMSE 会略高MOMP 如果实际 K 小于设置值则可能多选原子导致模型过拟合。在工程中导频数 P 不是可以随意增大的因此更合理的做法是先通过仿真确定当前信道稀疏度下的最小导频需求再为 OMP、MOMP、CoSaMP 设计合适的停止准则而不是固定迭代 K 次。6. 常见问题与排查路径6.1 矩阵维度、稀疏度和复数噪声三类高频问题第一类问题是矩阵维度不匹配。比如导频字典 A 生成为P x L接收矩阵 Y 却是M x P调用A \ Y时就会报维度错误。处理方法很简单统一方向A 的列数必须等于信道矩阵 X 的行数A 的行数必须等于 Y 的行数。第二类问题是稀疏度 K 设置不合理。若 K 大于或接近 P支撑集候选数量超过观测维度最小二乘求解会变成欠定问题程序可能给出警告结果也会失效。建议先保证 K 不超过 P 的三分之一到二分之一。第三类问题是复数噪声功率计算错误。很多初学者直接使用randn(P, M)作为噪底但复噪声应该同时包含实部和虚部因此正确写法是Nn sqrt(noisePow / 2) * (randn(P, M) 1i * randn(P, M));否则实际噪声功率是设定值的两倍等效 SNR 会偏低约 3 dB。6.2 从异常 NMSE 和运行时警告反推根因如果 NMSE 在某个算法上始终接近 1 或大于 1通常说明支撑集估计完全失效。检查顺序如下检查信道 X 是否真的稀疏打印非零行索引。检查导频字典 A 的列是否归一化列范数差异过大时相关选择会偏向大范数列。检查 SNR 计算方式确认sigPow是信号平均功率而不是单点功率。检查 OMP、MOMP 是否存在重复选择可以在支撑集加入前后打印length(unique(support))。检查 CoSaMP 的迭代次数是否过少maxIter太小会提前结束导致残差未收敛。如果 MATLAB 出现“Rank deficient”警告优先排查 A 的支撑列是否存在近似线性相关。可以尝试增大 P 或使用更好条件的导频索引也可以先对 A 做列归一化。6.3 问题排查清单现象可能原因检查方式处理建议维度错误A、Y、X 行列方向不一致打印size(A)、size(Y)、size(X)统一为 A: P x LY: P x MX: L x MNMSE 偏大且稳定K 与实际稀疏度不匹配打印 X 非零行数和算法使用的 K用真实 K 或增加稀疏度估计模块低 SNR 下 OMP 性能波动单天线噪声过大导致选错原子对比 MOMP 结果改用 MOMP 或增加天线数 M“Rank deficient” 警告支撑集列相关性过强或 P 过小查看 A 的条件数增大 P或对 A 列做归一化CoSaMP 运行时间很长每次迭代都重新排序和求逆profile on查看耗时增大稀疏度 K 候选减少迭代次数或改用固定迭代次数MOMP 不适用于全场景各天线支撑集不一致对比各天线真实时延索引若不一致改用逐天线 OMP 或改进联合策略7. 学习环境到生产环境的落地建议7.1 学习环境快速验证的策略在学习阶段建议先跑小规模参数。比如把 N 设为 128L 设为 32P 设为 32M 设为 8nMonte 设为 20。这样每次仿真只需要几十秒到几分钟可以快速观察趋势再逐步增大天线数和导频数。同时固定随机种子非常重要。使用rng(2025)后不同算法会使用完全相同的信道和噪声样本对比才有意义。否则每次运行产生不同数据看到的结果差异可能来自随机性而不是算法本身。还可以增加一个“支撑集命中率”指标统计真实的时延索引和估计出的时延索引的一致程度。这个指标可以帮助判断算法是“整体估计不准”还是“支撑集选错”。7.2 从 MATLAB 仿真到工程系统仍需补齐的部分MATLAB 仿真能够快速验证算法原理但离生产系统还有一段距离。实际落地时还需要考虑导频位置由协议规定不能随意随机选择需要根据资源块结构生成字典。信道在时变环境中会变化支撑集可能随符号滑动需要在线更新。字典需要考虑分数时延、多普勒扩展和收发端频率偏移不能只使用理想 DFT 矩阵。稀疏度 K 未知时需要设计自适应停止准则比如残差能量阈值、AIC/BIC 准则或噪声方差估计。硬件实现时复数乘法和排序操作要控制复杂度面向实时处理。OMP 和 CoSaMP 的循环结构不适合完全并行需要做时间和资源权衡。生产环境需要增加日志、监控和数据回放机制方便在性能异常时复现问题。给出一张学习环境与生产环境的差异对照表方便快速定位阶段任务维度学习环境生产环境导频设计随机索引即可符合协议和资源块约束稀疏度使用真实 K需要在线估计或设置自适应停止条件信道模型简单稀疏多径包含时变、多普勒、空间相关性和射频损伤复杂度要求低速仿真即可需要评估实时性、存储、功耗验证方式NMSE 曲线还需要误码率、丢包率、最大时延、稳定性测试7.3 算法选型建议如果只是做原理验证LS 和 OMP 足够启动。若想展示大规模 MIMO 多天线联合增益重点观察 MOMP。若想展示更稳健的稀疏恢复CoSaMP 是一个好选择。对于实际系统建议按以下顺序选型导频充足、信道接近线性系统时优先考虑 LS 或其正则化版本因为实现成本最低。导频受限但信道稀疏且天线数不大时使用 OMP。天线数多且支撑集共享明确时使用 MOMP能获得更好的低信噪比性能。有额外计算资源并且信道变化导致支撑集可能漂移时使用 CoSaMP 或其它带回溯的压缩感知算法。仿真结束后还可以继续扩展把 OMP 扩展为 Stagewise OMP把 MOMP 改为 SOMP或者加入深度展开网络来学习迭代参数。这个仿真框架最大的价值是让四种算法在同一个公平条件下被评估后续任何改动都能快速对照这个基线。大规模 MIMO 信道估计最终要回答的问题是在导频、算力和时延约束下用哪种算法最合适。LS、OMP、MOMP、CoSaMP 分别代表线性估计、贪心稀疏恢复、多测量向量联合恢复和回溯式稀疏恢复。先把它们的原理和 MATLAB 实现跑通再针对实际信道特性调整字典和停止准则会比盲目追求“更低 NMSE”更接近真实的工程落地。