
前阵子和一个做物理层算法的同事吃饭他问了我一句SCMA这玩意儿到底是不是伪需求市面上的资料要么是论文腔要么是产品稿真正能让人在短时间内建立起实用认知的太少。今天这篇我就用从业者的口吻把这套稀疏码多址接入技术从头捋一遍——它是谁、解决什么问题、码本和MPA检测是怎么回事、工程上怎么落地。我尽量控制在5分钟的阅读节奏里把SCMA的骨架讲清楚适合刚接触非正交多址的研究生、通信算法工程师以及想在6G预研里做技术选型的人。先别急着背公式SCMA本质上就是一件事让多个用户同时、同频地“说话”然后接收端还能把每个人的话清清楚楚分出来。这听起来很玄但它的工程路径非常清晰。下面我从为什么要做到原理拆解再到实战选型和避坑一层层说透。1. 为什么需要SCMA正交多址已经不够用了1.1 多址接入的“排队思维”和它的瓶颈想理解SCMA得先理解一个根本问题什么叫多址接入说白了就是让很多用户共享同一段无线资源。传统方案是“排队思维”比如OFDMA把时间和频率切成一个个互不重叠的小格子每个用户分到独立的格子你说话的时候我不说我用某个频段的时候你不用。这种“正交”方式在用户少、业务均匀的时候非常完美调度简单接收端也轻松一个FFT就能把各用户信号分开。但到了海量物联网、车联网、大规模传感这类场景问题就来了。一个小区里可能有几千上万个终端每个终端只在某个瞬间发一个几十字节的小包大部分时间是沉默的。如果按正交的思路给每个终端预留资源块小区容量会被瞬间撑爆。就算按需调度频繁的资源申请、授权、同步也带来巨大信令开销和时延。正交多址的痛点不在“能不用”而在“资源利用率太低了”。1.2 从LDS-OFDM到SCMA稀疏码的演进逻辑学术界和工业界很早就意识到这个问题于是有了非正交多址的想法。早期有个方案叫LDS-OFDM也就是低密度扩频OFDM思路是把每个用户的符号用一条稀疏扩频序列扩展到多个子载波上让多个用户的信号在部分子载波上叠加接收端利用这种“低密度”结构做近似最大似然检测。LDS-OFDM已经展现出不错的性能但有一个明显短板扩频和调制是分开做的没有针对多用户叠加的场景做联合优化所以码字之间的欧氏距离不够理想抗干扰能力有限。SCMA可以理解为LDS-OFDM的升级版。它的核心变化是不再先用调制映射出符号再扩频而是把“比特到高维码字”的映射一次性做成一张码本。每个用户查自己的码本选出对应的稀疏码字再映射到资源块上。换句话说扩频、调制、多用户区分这三件事被合并进了码本设计里。这个合并带来的直接收益是码字间的距离可以被精心设计接收端在多用户干扰下的分离能力更强。1.3 SCMA到底适合哪些场景选择多址方案不能脱离业务。SCMA真正发光的场景几乎都指向“海量连接短包突发免调度”。比如智慧城市的智能电表每天或者每小时上报一次读数数据量极小但终端数量巨大再比如工业无线的传感器网络大量节点随机唤醒、小包上报要求低时延低碰撞还有低轨卫星物联网传播时延大逐用户做调度授权的成本极高免调度传输几乎是刚需。在这些场景里SCMA能带来两个非常实际的好处一是过载能力单位资源块上可以承载更多用户二是免调度传输用户不需要等基站授权就发数据省掉大量控制开销降低接入时延。它不是万能的但如果你的系统刚好被“连接数”卡住SCMA会是一个非常对路的选项。2. 5分钟核心原理码本、稀疏、叠加、MPA2.1 一句话理解SCMASCMA整个系统可以用一句话概括多个用户同时、同频地发送数据每个用户只占用全部资源块中的一小部分发送前根据比特信息从自己的码本里挑一个稀疏码字这些码字在资源块上自然叠加接收端用MPA迭代算法把混合信号中的每个用户信号分离出来。这里面有四个关键词码本、稀疏、叠加、MPA。码本是“身份模板”稀疏是“低密度占用”叠加是“非正交共信道”MPA是“智能分离算法”。下面逐个拆。2.2 码本每个用户独有的“说话模板”码本是SCMA的灵魂。假设系统有K个资源块一般可以理解为K个资源单元比如OFDM子载波每个用户有一个码本码本里有M个码字每个码字是一个K维复数向量。发送时用户的log2(M)个比特会映射到其中一个码字上。更关键的是码字是稀疏的也就是说K维向量里只有一小部分元素非零其他位置都是0。这是SCMA区别于传统CDMA的关键之处。CDMA里所有用户的扩频码通常在所有码片上都非零大家“挤满”了整个扩展空间而SCMA的码字只在少数资源块上有能量剩下的资源块它根本不去碰。为什么这么设计一个原因是降低接收端分离复杂度另一个原因是给码本设计留下更多自由度——我们可以通过精心安排“哪些用户占用哪些位置”来平衡干扰和分集增益。简单说每个用户不是没有感情地到处说话而是只在自己的几个“主场”发声声音还套着独有的模板。2.3 稀疏叠加为什么“空着”反而高效有人会疑惑都稀疏了每个用户只用了少量资源岂不是浪费这里要转换视角。SCMA追求的不是单个用户的峰值速率而是整个小区在相同资源块上服务的用户总数。举个例子4个资源块如果做正交切分最多服务4个“不重叠”的用户。但如果允许6个用户同时发数据每个用户只占用其中2个资源块那么平均下来每个资源块上只叠加了3个用户按行重算而不是6个用户全部挤在一起。这就是“稀疏叠加”的精妙之处从用户角度看每个用户获得了2个资源块的分集从资源角度看每个资源块上的干扰源数量被控制住了接收端解调时只需要处理有限个叠加组合。这就是过载率150%的由来。如果码字不稀疏6个用户把4个资源块全部占满接收端的组合爆炸会直接让检测复杂度失控。2.4 MPA检测器从混合信号里“破案”接收端面临的任务是收到一根混合信号里面有6个用户的信号叠在一起每个用户的码字可能来自M个候选之一我要判断每个用户最可能发的是哪个码字。理论上最优点是最大后验概率检测但要遍历所有用户的候选组合复杂度是M的J次方J是用户数6个用户4个码字就是4的6次方4096种组合看着不多。但用户数到几十个指数增长完全不可接受。MPA消息传递算法解决的正是这个问题。它利用因子图结构只做局部消息迭代。每个资源块是一个“资源节点”每个用户是一个“变量节点”因子图上谁和谁相连只处理谁的消息。资源节点根据观测信号、信道系数和噪声方差计算自己“听到”的叠加信号中各个用户码字的概率变量节点把与自己相连的多个资源节点给出的概率融合起来更新当前用户码字的后验概率然后消息再传回去如此循环。迭代几次后每个用户码字的概率趋于收敛再换算成比特的软信息送给信道译码器。这个过程很像一个多方听证会每个资源节点就是一个目击证人它听到了混合的谈话声它根据自己对各个声音模板的了解给出“这个位置大概率是哪个词”的推断用户节点把这些目击证词汇总修正自己的说法几轮交叉验证下来大家越来越接近真相。MPA的复杂度主要取决于资源节点连接的叠加用户数和码字大小远小于全局最优检测这也是SCMA能落地的关键原因。3. 码本设计与关键参数实操3.1 因子图矩阵决定稀疏结构SCMA的稀疏结构通常用一个因子图矩阵F来表示行是资源块列是用户。比如经典的4资源6用户配置可以写成这样的F矩阵F [1 1 1 0 0 0; 1 0 0 1 1 0; 0 1 0 1 0 1; 0 0 1 0 1 1];这个矩阵的含义很直观第j列为1表示用户j占用对应行的资源块。每一列有2个1代表每个用户占用2个资源块这叫列重df2每一行有3个1代表每个资源块上叠加了3个用户这叫行重dr3。用户数J6资源块数K4过载率λJ/K1.5也就是150%。设计F矩阵时有一些经验规则列重不能太大否则单个用户的码字稀疏性就没了MPA复杂度会上升行重也不能太大否则单个资源块上干扰用户太多分离困难。经典的df2、dr3结构是一个不错的折中既给用户带来2阶分集又把资源节点上的组合规模控制在M的3次方量级工程上非常好处理。你可以根据需求调整K和J但原则是让F矩阵的行重和列重尽量均衡避免出现某个资源节点连接用户数特别多、某个用户占用资源数特别少的情况。3.2 母星座、置换与相位旋转F矩阵只规定了“谁占用哪里”真正决定性能的是每个用户码本里的码字取值。SCMA码本设计有一个常见套路先设计一个母星座图通常在二维复数平面上选点比如QPSK或8PSK的变形要求星座点之间的最小欧氏距离尽量大然后对母星座做相位旋转、维度置换、功率缩放等一系列操作生成不同用户的码字。为什么需要旋转和置换因为多个用户的信号会在同一个资源块上叠加如果每个用户的码字都一模一样那叠加后根本分不开。通过给不同用户赋予不同的相位旋转和维度映射可以让叠加后的信号星座点在多维空间里“尽量拉开”接收端区分起来更容易。比如用户A在资源1上用一个角度用户B在资源1上用另一个角度两个信号叠加后组合点之间有了足够距离MPA才能有效分离。在实际操作中码本设计通常不能只靠手算普遍做法是结合计算机搜索和优化目标函数一般是最大化最小码字距离、同时最小化多用户干扰项。我自己做仿真时的习惯是先用公开的经典码本跑通链路验证无误后再根据信道特点去微调相位旋转参数。千万别一上来就自己随机生成码本性能会差到让你怀疑SCMA是智商税其实只是码本没设计好。3.3 过载率SCMA的“收益指标”过载率是SCMA最常被挂在嘴边的指标。它等于用户数J除以资源块数K。过载率100%意味着资源块和用户一比一这时候SCMA相比正交多址没有连接数优势过载率150%、200%才体现出“稀疏多址”的价值——相同资源块服务更多用户。但过载率不是越高越好。过载率越高资源块上的叠加用户数越多用户间干扰越大码本设计的难度也越大MPA复杂度同步上升。更关键的是高过载率通常以牺牲链路性能为代价同样信噪比下误码率会变差。在工程上做选型时我会建议先明确业务模型如果用户密度高但每个用户包很小过载率150%左右是一个比较稳妥的起点如果对可靠性要求高可以从100%过载开始验证逐步上调找到性能和容量的平衡点。记住SCMA的过载率不是拿来看的而是用来权衡连接数和误码率的。4. 手把手搭建SCMA仿真链路4.1 一个开箱即用的简化仿真流程想在MATLAB里快速验证SCMA不需要一上来就写几千行代码按下面这个流程搭链路就够了。这套流程是我在实际项目中反复使用的简化版本覆盖从发送到接收的最短路径。第一步定义系统参数。资源块数K4用户数J6每个码本包含M4个码字也就是每用户每传输2个比特。调制映射不需要单独做SCMA的比特到码字映射已经合成在码本查表逻辑里。第二步根据F矩阵和码本生成策略给每个用户生成K×M码本也就是6个4×4的复数矩阵。第三步发送端每个用户随机生成2比特查对应码本得到4维码字乘上信道系数再按照F矩阵的占用关系叠加到4个资源块上最后加高斯白噪声。第四步接收端用MPA迭代解调输出每个用户2比特的软信息。第五步统计误码率和OFDMA在相同资源块数下的性能做对比。下面是我简化过的伪代码结构方便你快速理解主流程% 参数设置 K 4; J 6; M 4; F [1 1 1 0 0 0; 1 0 0 1 1 0; 0 1 0 1 0 1; 0 0 1 0 1 1]; codebooks cell(1, J); % 每个用户一个码本尺寸 M x K % 码本生成基于母星座 旋转置换需要单独实现 % 发送端 txBits randi([0 1], J, 2); % 每用户2比特 txIdx bi2de(txBits, left-msb) 1; % 映射到码字索引 x zeros(J, K); for j 1:J x(j, :) codebooks{j}(txIdx(j), :); end % 叠加 信道 噪声 h ones(J, K); % 先假设理想信道可替换为衰落 y sum(h .* x, 1) sigma * (randn(1,K) 1i*randn(1,K)) / sqrt(2); % 接收端 MPA [llr, estBits] mpa_detector(y, h, codebooks, F, noiseVar, maxIter); % 统计误码率与OFDMA对比注意这只是教学简化的伪码真实系统还要处理信道估计、同步、LDPC或Polar编码、资源调度等环节。但先把这版跑通你对SCMA的整体流程会有一个非常直观的把握。4.2 MPA接收端迭代调参MPA的迭代次数是最重要的调参旋钮。我见过不少新手一上来就设50次迭代结果仿真跑得极慢性能却没有明显提升。MPA的本质是在因子图上做置信传播通常5到10次迭代就能收敛。我的建议是先把迭代次数设为10画出不同信噪比下的误码率曲线再看概率消息的收敛情况如果10次和20次结果几乎一样就可以果断降到6次左右节省大量仿真时间。第二个关键参数是噪声方差的估计。MPA的资源节点更新公式里有一个指数项依赖于噪声方差它的作用是衡量“当前叠加组合和观测信号之间的残差有多大可能性是由噪声造成的”。如果噪声方差估计偏大MPA对错误叠加组合的惩罚会变弱分离能力下降如果偏小MPA会过度相信观测信号在低信噪比时出现异常硬的软输出后续信道译码器反而更难处理。所以在仿真里噪声方差的设定必须和实际信噪比严格对应不要在这个细节上偷懒。第三个容易被忽略的点是MPA的软输出要去相关。因为迭代过程中消息会在因子图里循环传播前后两次迭代之间存在相关性如果直接把最后一次迭代的码字后验概率当成比特LLR送给信道译码器有时候会“过度自信”。经验做法是在输出前对外信息做适当的加权处理或者直接把迭代次数控制在一个不会过度收敛的水平。4.3 免调度场景下的资源竞争SCMA在真实系统里的一个重要玩法是免调度传输也叫grant-free。传统调度模式下用户要先发调度请求基站分配资源后再发送数据这个过程来回几次时延大、信令开销也大。免调度模式让用户直接用自己的码本和数据导频随时发送小包基站盲检测谁是活跃用户、发了什么数据。但免调度意味着可能有多个用户选了同一个码本或者同一个导频序列产生碰撞。SCMA本身能通过稀疏叠加分离一部分同频信号但如果两个用户完全使用同一码本且同一导频接收端就无能为力了。工程上一般会做“码本池”的设计系统准备一组码本每个用户随机或半静态地从中挑选同时配合活跃用户检测算法在MPA之前先判断哪些码本/导频被激活。对于碰撞这个顽疾通常还会在媒体接入层做补偿比如允许一定概率的重传。我做免调度系统仿真时的建议是不要只看单用户误码率一定要把活跃用户检测的漏检率、虚警率、碰撞概率放进整体指标里看。有时候SCMA链路性能很好但碰撞检测一塌糊涂整个系统的可靠性还是上不去。SCMA只是物理层的一块积木要和接入协议一起设计。5. 和其他多址方案对比与选型要点5.1 SCMA、PD-NOMA、LDS-OFDM横向对比很多人容易把SCMA和其他非正交多址方案弄混尤其PD-NOMA和LDS-OFDM。它们都允许多用户共享资源但区分用户的方式不同。PD-NOMA主要靠功率域区分用户接收端用SIC逐级干扰消除简单直接但用户间的功率差要设计好否则SIC误差传播很严重。LDS-OFDM可以看成SCMA的前身用稀疏扩频序列区分用户但没有把调制映射和扩频做联合优化。SCMA则是码域区分通过精心设计的稀疏码本获得距离增益再用MPA一次分离所有用户。说到过载能力SCMA和LDS-OFDM都能支持100%以上的过载PD-NOMA在功率域也能过载但叠加用户数受限于功率差值范围。SCMA在码本设计上下功夫往往在高过载和可靠性之间能做到更好的平衡。接收端复杂度方面PD-NOMA的SIC串行处理相对简单SCMA的MPA并行性好但需要迭代LDS-OFDM也类似MPA但码本性能上限不如SCMA。方案区分维度过载能力接收方式主要优势主要短板OFDMA时频资源正交不支持过载FFT信道均衡成熟、稳定、标准普及连接数受限、信令开销大PD-NOMA功率域有限过载SIC串行干扰消除实现简单、兼容性好功率差敏感、误差传播LDS-OFDM稀疏扩频码支持过载MPA类迭代检测扩展了CDMA思想调制与扩频分离、码字距离次优SCMA稀疏码本支持高过载MPA迭代检测码域增益、免调度友好码本设计复杂、迭代处理开销这个表格不是用来证明谁秒杀谁而是提醒你选型要看你手头最缺什么。如果最缺的是连接数SCMA很有优势如果最缺的是兼容性和工程速度PD-NOMA或正交方案可能更快落地。5.2 为什么5G主链路还是离不开正交方案一个很现实的问题是既然SCMA听起来这么好为什么现在手机里的5G调制解调器没有用上答案不是SCMA不行而是场景不匹配。5G的三大场景里增强移动宽带追求的是单用户峰值速率和频谱效率这时候把多个用户信号刻意叠在一起反而增加接收复杂度收益不大URLLC对时延要求极高迭代检测处理本身会引入额外时延真正对SCMA最友好的mMTC海量连接场景在5G标准化过程中因为产业链成熟度、复杂度控制等原因没有选择完整版的非正交多址方案。还有一个工程细节SCMA需要接收端知道所有活跃用户的码本和信道状态这在基站侧可以做但在手机侧做下行接收就不太现实手机不可能为一个数据包去迭代检测一堆其他用户的信号。所以SCMA最适合的形态是上行免调度而5G的主要业务形态还是下行大流量。正交OFDMA之所以长期占据主线不是因为它完美而是因为它在绝大多数场景下“够用且便宜”。5.3 从3GPP到6GSCMA的产业化位置SCMA在3GPP 5G时代作为非正交多址候选方案被讨论过最终没有进入NR标准但这段过程积累了大量码本设计和检测算法的成果。进入6G预研阶段后海量连接、超高并发、通感一体化、低轨卫星这类全新需求被摆上台面SCMA作为非正交多址的代表之一重新成为热点方向。我参与的6G预研讨论里SCMA经常和免调度传输、大规模机器通信、随机接入优化放在一起讨论。它的定位不是替代OFDM而是作为正交方案之外的补充。比如在大量小包、断续连接、终端极简的场景里SCMA让终端免去复杂的调度流程降低芯片功耗和信令负担。另一个热门结合点是卫星物联网卫星链路传播时延大调度来回成本高SCMA的免调度特性可以大幅简化接入流程。产业界对它更多的态度是“持续投入、等待场景成熟”。6. 常见问题与避坑指南6.1 新手最容易踩的5个坑这几年带过不少做SCMA仿真和原型验证的同学反复踩的坑就那么几个我直接整理成清单第一个坑是把码本和扩频序列混为一谈。码本不只是“扩频调制”的拼凑它的每一行就是完整码字代表一个特定比特组合对应的发送信号直接用随机扩频序列拼出来的码本性能会非常难看。第二个坑是忽略F矩阵的稀疏结构把所有用户强行塞满所有资源块结果MPA复杂度爆炸性能还没有变好。第三个坑是一上来就在时变信道下调试建议先在AWGN信道下把链路和MPA逻辑验证正确再叠加信道估计误差和衰落否则你根本说不出误码率差是信道的问题还是算法的问题。第四个坑是拿SCMA的峰值吞吐和OFDMA对比选错指标。SCMA真正的价值是连接数和免调度接入不是单用户峰值速率。第五个坑是信道估计粗糙。很多教材默认理想信道实际系统里信道估计不准时MPA的软信息质量会断崖式下降比传统正交接收机更敏感。6.2 关于复杂度和芯片实现的提醒仿真跑通了只是第一步真正上FPGA或者ASIC的时候SCMA的工程问题才会显现。MPA迭代里大量用到复数乘法、指数运算和概率归一化在硬件里指数运算非常昂贵工程实现上普遍会采用Max-Log近似把指数求和变成取最大值虽然会有少量性能损失但硬件资源能省下一个数量级。硬件实现还有一个容易被低估的点码本切换和动态用户管理。理想化的仿真里每个用户码本是固定的但实际系统中用户会随时加入和离开基站需要给新用户分配码本还要让接收端的因子图动态更新。如果设计成完全动态控制逻辑复杂度很高很多原型机采用的做法是预分配码本池用户从池中选取基站盲检时扫描整个池子。这样接收机只需要存储一个池的码本结构固定便于流水线处理。另外MPA的并行度设计也要注意资源节点更新之间天然并行但变量节点更新需要等待所有连接资源节点的消息这种同步等待会限制吞吐硬件上通常需要做多层流水线来掩盖延迟。6.3 我的实际调试心得最后分享几个我自己在项目里的经验。MPA迭代次数别贪多我在大多数场景下发现5次已经进入性能平台期刻意增加到几十次反而会让仿真时间拖到怀疑人生而且过多次迭代有时候会让概率消息过度收敛对信道译码器反而是一种伤害。建议在仿真环境里先跑一次10次的版本作为基准然后画一下每次迭代后误码率的变化曲线你会非常直观地看出在哪一次迭代之后基本没有增益了。调试顺序上我强烈建议从“单用户无干扰”开始。先把J设为1验证码本映射和接收端解调本身对不对再逐步增加用户数观察误码率的恶化是否平滑。如果J从1加到2时误码率突然崩掉大概率是码本之间的互相关性太强而不是MPA实现出了问题。这个方法可以帮你快速定位问题是出在码本还是算法。另外SCMA和信道编码联动时务必关注MPA输出的LLR质量。我遇到过仿真里不加信道编码时误码率看起来很漂亮但一接LDPC或Polar性能反而变差的情况。原因就是MPA输出的软信息没有正确校准译码器接收后严重失真。解决办法是在MPA和译码器之间加一个LLR缩放因子或者用外信息迭代的方式让译码结果反向指导MPA再更新一轮。这个外信息传递的思路在工程上非常有效。我个人的体会是SCMA是一个典型的“原理听着容易、做好极难”的方案。它的上限取决于码本设计下限取决于检测器和系统工程的细节。如果你正准备在自己的项目里引入SCMA别急着追新算法论文先把码本、因子图、MPA这三件套吃透再谈优化。这套基础打牢了后面无论是做卫星物联网、免调度随机接入还是6G预研都能很快上手。