前阵子和一个做物理层算法的同事吃饭,他问了我一句: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分钟核心原理:码本、稀疏、叠加、MPA
2.1 一句话理解SCMA
SCMA整个系统可以用一句话概括:多个用户同时、同频地发送数据,每个用户只占用全部资源块中的一小部分,发送前根据比特信息从自己的码本里挑一个稀疏码字,这些码字在资源块上自然叠加,接收端用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个资源块,这叫列重df=2;每一行有3个1,代表每个资源块上叠加了3个用户,这叫行重dr=3。用户数J=6,资源块数K=4,过载率λ=J/K=1.5,也就是150%。
设计F矩阵时有一些经验规则:列重不能太大,否则单个用户的码字稀疏性就没了,MPA复杂度会上升;行重也不能太大,否则单个资源块上干扰用户太多,分离困难。经典的df=2、dr=3结构是一个不错的折中,既给用户带来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,不需要一上来就写几千行代码,按下面这个流程搭链路就够了。这套流程是我在实际项目中反复使用的简化版本,覆盖从发送到接收的最短路径。
第一步,定义系统参数。资源块数K=4,用户数J=6,每个码本包含M=4个码字,也就是每用户每传输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到6G,SCMA的产业化位置
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预研,都能很快上手。