射频到光学:OFDM/OTFS等调制方案的原理与MATLAB仿真

发布时间:2026/10/6 3:38:36
射频到光学:OFDM/OTFS等调制方案的原理与MATLAB仿真 从射频到光学通信系统的调制方式看似各不相同但剥开外壳底层都是在解决同一件事如何在有限的资源里把比特可靠地传过去。我在用MATLAB做基带仿真时常把射频调制和光学调制放在一起对比因为光学信道和射频信道的物理约束差别巨大同一个调制方案搬过去要么需要加直流偏置要么需要改信号结构甚至要重新设计接收机。这篇就以OFDM、OFDM-IM、OCDM、SCMA、OTFS这五个射频方案为起点再看它们对应的O-OFDM、O-OFDM-IM、O-OCDM、O-SCMA、O-OTFS在光学场景里怎么落地把MATLAB里的建模思路和踩坑经验一起写出来。1. 为什么要把射频调制搬到光域从OFDM说起OFDM是理解这一系列方案的最佳切入点。它的核心思路是把高速串行数据流拆成N路低速并行子载波每个子载波用正交的复指数基承载符号。在MATLAB里实现OFDM发射机一个ifft就能完成N点频域-时域变换接收端再fft回来每个子载波等效为平坦衰落信道均衡器的复杂度大幅下降。你能在无数论文里看到OFDM就因为它的正交并行结构在数学上极其优雅工程上守护FFT硬件也足够成熟。但OFDM拿到光通信里路就没那么好走了。传统强度调制直接检测IM/DD系统要求发送电信号必须为单极性非负实数而OFDM的时域波形是双极性复数两者天然冲突。于是出现了DCO-OFDM直流偏置光OFDM和ACO-OFDM非对称剪裁光OFDM这类变体。DCO-OFDM做法粗暴把IQ调制产生的双极性信号加一个直流偏置再削掉残留负峰。问题是直流偏置消耗大量光功率功率效率很低。ACO-OFDM聪明一点只让奇数子载波携带数据利用傅里叶变换的对称性构造出单极性信号避免了直流偏置的浪费但频谱效率也直接减半。所以在做射频与光学调制方案比较时第一件事就是认清物理层约束的差异。射频信道里信号天然可以是双极性复数我们只需要考虑峰均比PAPR、频偏、多径时延光信道尤其IM/DD则必须面对单极性实信号约束要么牺牲功率要么牺牲频谱效率两种妥协直接影响最终可用性。光OFDM之所以叫O-OFDM目的就是提醒你这不是简单把OFDM波形送到光发射机而是要针对光信道重新设计底层信号。2. 五大射频调制方案核心原理与MATLAB建模2.1 OFDM最经典的正交频分复用OFDM建模的关键参数包括子载波数N、循环前缀长度CP、调制阶数M如QPSK/16QAM、导频间隔。在MATLAB里我会这样组织发射链% 参数配置 N 64; % 子载波数 cpLen 16; % 循环前缀长度 M 4; % 4-QAM numSymbols 1000; % OFDM符号数 dataBits randi([0 1], N*log2(M), numSymbols); modSym qammod(dataBits, M, UnitAveragePower, true); ifftOut ifft(modSym, N, 1); % 补循环前缀 txSignal [ifftOut(end-cpLen1:end, :); ifftOut]; % 加信道、加噪声、去CP、fft、均衡、解调...每次仿真我都会确认两点发射端ifft的缩放因子默认1/N接收端fft是否对应功率归一化循环前缀长度必须大于信道最大时延扩展否则产生符号间干扰。调试时先在理想信道下跑通再叠加信道响应这样能快速定位是调制模块问题还是信道模块问题。2.2 OFDM-IM索引调制给子载波附加信息OFDM-IM全称OFDM with Index Modulation它的想法很直接把N个子载波分成若干子块每个子块只激活其中一部分子载波用哪些子载波被激活本身来传递额外比特而星座符号只传递一部分比特。比如子块大小4、激活2个子载波则激活模式有C(4,2)6种可携带log2(6)2.58比特实际取2比特再配星座符号比特。MATLAB实现时核心在于激活模式的映射表和逆映射表。我踩过最大的坑是合法激活模式数与2的幂次不匹配比如6种模式选4种映射剩下的模式不使用。如果误用了非法模式接收端检测索引时会发生难以追踪的误码。建议用查表法而不是临时计算组合数subLen 4; kEmpl 2; % 所有激活模式取前2^p个作为合法映射 allPatterns nchoosek(1:subLen, kEmpl); pIdx floor(log2(nchoosek(subLen, kEmpl))); % 索引比特数 validPatterns allPatterns(1:2^pIdx, :);接收端做最大似然检测时如果遍历所有星座符号×所有激活模式复杂度较高。好在子块一般不大实际仿真够用。2.3 OCDMChirp基的复用时频能量扩散OCDM是最近几年热度上升的方案它用离散菲涅耳变换替代傅里叶变换把符号调制到一系列Chirp正交基上。Chirp信号的特点是瞬时频率随时间线性变化OCDM的好处是具备频率分集尤其在强窄带干扰环境下比OFDM更稳。MATLAB里做OCDM最方便的做法是借助DFT构建离散菲涅耳变换DFnT。核心矩阵可以写成function DFnT_matrix dfnt_matrix(N) % N为点数要求N为偶数常见取2的幂 % 利用DFT实现 % 具体公式需要查阅文献我这里给出工程实现思路 % theta 0.5 * (0:N-1).^2 * pi; % 变换矩阵 exp(1j*(...) ) 再乘归一化因子 end不过实际仿真中我更推荐直接用矩阵乘法预计算的方式。OCDM接收端用匹配滤波器即DFnT逆变换恢复符号。它跟OFDM的根本区别在于OFDM的子载波是频域单音OCDM每个子载波实际上是扫频Chirp因此OCDM符号在时频平面上更均匀地展开。这个特性在存在频谱陷波时特别有价值——OFDM只要陷波落在某个子载波上那几个子载波就全废了OCDM则因为能量扩散到整个带宽损失平均到所有符号上误码率退化是平缓的。2.4 SCMA码域稀疏多址接入SCMA不是单用户调制方案而是多址接入方案核心是稀疏码本设计。每个用户从自己的码本中选择一个复数列向量码字这些码字映射到相同的时间和频率资源上。由于码字是稀疏的——非零元个数远小于资源数——接收端用消息传递算法MPA可以兼顾检测性能和复杂度。MATLAB里入门SCMA的第一步不是写MPA而是先生成码本。听起来很玄其实可以这样理解SCMA码本是若干复数超集每个超集里包含多个码字每个码字对应一个数据符号。标准码本设计非常复杂但学术仿真常用低维度手动构造。比如资源数K4、每资源叠加载J6个用户、非零元素数df2码本大小M4对应2比特。% 简化理解SCMA编码 每个用户选择自己的码字并叠加 % 这里省略码本生成用随机码字示意 J 6; K 4; df 2; M 4; CB_store cell(J,1); for user 1:J % 每个码本为 M x K但每行只有df个非零元 end % 叠加时按资源位置累加复符号SCMA最重要的指标是过载率J/K1时系统能为更多用户服务。如果从调制对比的主线看我会建议初学者先理解SCMA的稀疏多维码本思想不必急着复现完整MPA算法。MPA的MATLAB实现需要处理因子图节点更新容易写成了正确地但性能却上不去多半是对数域概率计算出了错。2.5 OTFS时延-多普勒域的鲁棒调制OTFS全称Orthogonal Time Frequency Space它把调制符号放在时延-多普勒DD域而不是时频域。在高速移动场景下信道在时频域变化快OFDM需要密集导频做信道估计OTFS把信道在DD域近似为时不变稀疏表示每个符号经历的信道响应几乎是恒定的双选择性信道被压缩成少量抽头。MATLAB实现OTFS的关键步骤包括QAM符号映射到DD域网格N×MN为多普勒维数M为时延维数然后做逆辛有限傅里叶变换ISFFT得到时频域再经海森堡变换即OFDM调制发射出去。我常用的实现路径是N 16; M 64; ddGrid qammod(dataBits(:), M, UnitAveragePower, true); ddGrid reshape(ddGrid, N, M); % ISFFT: 先沿多普勒维做FFT再沿时延维做IFFT或反过来取决于定义 tfGrid fftshift(fft(fftshift(ddGrid,1), N, 1),1); tfGrid ifft(tfGrid, M, 2) * sqrt(M); % 海森堡按OFDM规则将tfGrid映射到时间波形MATLAB里做OTFS信道可以手动生成时延-多普勒信道抽头然后作用在时延域卷积上再用匹配滤波接收。收到之后做SFFT、均衡、解调即可。OTFS对初学者最不友好的概念是栅格grid方向和变换的归一化因子不同文献定义可能差个转置或共轭仿真时务必要固定一种范式并测试理想信道下的重建是否完美。3. 光域对应方案的实现差异3.1 强度调制直接检测下的信号约束光纤通信或可见光通信中最常见的IM/DD系统要传输的基带信号被用来直接驱动光源强度因此发射信号必须是非负的实数值。任何双极性复数信号都不能直接进入强度调制器否则激光器的强度会产生非线性失真或者在负半周被切掉。这就解释了为什么光域方案不能简单照搬射频。应对策略主要有四类加直流偏置DCO方便但功率效率低。非对称剪裁ACO利用频域共轭对称仅用一半子载波发射接收端恢复时无需知道剪裁抵消。哈达玛变换Hadamard实域变换某些光OFDM方案可结合。双极性转单极性把信号分割成正/负分量或用其它映射比如用光学OFDM中的翻转、压缩扩张。3.2 各光域方案如何适配非负实数约束O-OFDMIM/DD最常见的是DCO-OFDM和ACO-OFDM。DCO-OFDM的约束是直流偏置大小必须高于信号负峰值直流偏置越大有效信噪比越低。MATLAB仿真时需要对信号进行裁剪但裁剪会引入额外失真。一般会用迭代算法使噪声分布更接近高斯业界有各种改进版本。O-OFDM-IM的光域实现和O-OFDM类似但索引调制带来额外优势索引本身不涉及负数所以索引映射可以在光域中更容易保留。激活子载波模式如果只发射实部且构造共轭对称可以做成ACO-OFDM-IM也可以在DCO-OFDM-IM下牺牲部分功率。O-OCDM时域波形同样是双极性复数光域化通常需要共轭对称直流偏置或者采用ACO剪裁。OCDM由于时域波形能量均匀剪裁噪声和OFDM不同峰均比略好但增益未必显著。O-SCMA在光域要考虑的是码字资源叠加时复数的负实数部分如何映射到强度。常见做法是把复数码字实部加偏置统一抬升。此时码字设计要与偏置一起优化不能简单沿用射频码本。O-OTFS是当前研究热点因为OTFS本身抗多普勒好而水下或移动光通信也面临多径和传播损伤。光OTFS同样需要把DD域的复符号转成非负实波形通常方案是DCO-OTFS或ACO-OTFS。我仿真时发现DCO-OTFS只要把偏置设置合理误码率性能跟O-OFDM在一个量级但O-OTFS的优势在高移动性场景才明显。3.3 光域方案的MATLAB仿真链路构建无论是O-OFDM还是O-OTFS光学信道仿真常用的是加性高斯白噪声AWGN加线性衰减模型复杂一点考虑色散、非线性。对于可见光通信还会加入LED非线性、发送功率约束和接收端平方律检波。MATLAB里搭建统一光域链路我建议按照电域调制→Hermitian对称处理→IFFT→取实部→加偏置/剪裁→加信道噪声→光检测→去偏置/去剪裁→FFT→解调流程来跑。用代码表达核心部分% O-DCO-OFDM发射示例 N 128; modSym qammod(dataBits(:), 4, UnitAveragePower, true); % Hermitian对称subcarrier 0为01~N/2-1为数据N/2为0N/21~N-1为共轭翻转 hermSym [0; modSym(1:N/2-1); 0; conj(modSym(end:-1:1))]; % 注意频域共轭对称后IFFT结果为实数 txTime ifft(hermSym, N); txTimePolar txTime abs(min(txTime)); % 加直流偏置等效 % 剪裁低于0部分模拟强度约束 txTimeClipped max(txTimePolar, 0);这个流程里有一个容易被忽略的点Hermitian对称的索引和FFT零点位置要匹配如果MATLAB数组索引从0开始理解直接套用conj(flipud)但没管DC/奈奎斯特位置结果会多一个虚部小尾巴。我通常先验证一下ifft结果是否实对称再进入光学模块。4. 关键指标对比频谱效率、PAPR、误码率、复杂度这一节用表格做一个直观汇总。表格基于典型参数子载波数64QPSKCP长度16AWGN信道IM/DD情况下DCO偏置按负峰值设置的仿真结果和理论分析。方案频谱效率PAPR特性AWGN误码率一般性能复杂度适用场景OFDM高高PAPR为典型短板基准FFT低射频WiFi、DVB、5GOFDM-IM中等激活子载波带索引比OFDM略低中等信噪比下有增益索引检测额外开销避免SER平台绿色通信OCDM与OFDM相同与OFDM相当抗窄带干扰时更好需预计算DFnT强干扰射频/光信道SCMA过载1时为高系统频谱效率依赖码本设计多用户时通过MPA接近最优MPA较高海量机器通信OTFS与OFDM相同与OFDM相当双选信道下明显优于OFDMSFFT均衡开销高速移动场景O-OFDM(DCO)全子载波可用但功耗大高可接受但偏置导致光功率浪费FFTIM/DD光通信O-OFDM(ACO)半子载波可用低剪裁失真功率效率高但频谱效率减半FFT可见光、短距离O-OFDM-IM中等良好能够换取功率或频谱折中索引检测额外开销光接入、室内OCCO-OCDM同OCDM但实域稍好抗干扰但光域转换复杂DFnT水下光通信研究O-SCMA过载高依赖码本光域码本设计难度大MPA高光NOMA系统O-OTFS同OTFS但需偏置相当双选信道上良好SFFT偏置移动可见光通信、V2V从表中可以看出射频域方案追求的是频谱效率和多址灵活性光域方案的核心矛盾则变成了功率效率与复杂度。做一个实际系统的方案选型不能只看误码率曲线高低还要看PAPR。OFDM的高PAPR在光域尤其致命——高PAPR意味着信号的瞬时功率波动大在LED的非线性区间会引起严重削波失真也因此出现各种限幅、预畸变和PAPR抑制算法。OTFS在DD域的符号并没有从本质上解决PAPR问题因为海森堡变换后时域波形跟OFDM结构类似不过由于DD域符号是经过二维扩展的刺激出来的时域波形峰值分布相对均匀实际仿真中常观察到PAPR改善0.5~1dB不算质变。关于误码率平台OFDM在严重相位噪声或频偏下会出现错误底OFDM-IM通过索引调制为信号增加了额外的欧氏距离测试中在中高信噪比时比标准OFDM有1到3dB的增益OTFS在高速信道下误码率曲线会随多普勒的增大而平缓但仍保持下降而OFDM往往因子载波间干扰出现较高底。做对比实验时记得固定总数据速率因为ACO-OFDM减半了有效子载波只有用更高阶调制才能补回比特率否则比较不公平。5. 实操过程与MATLAB代码框架5.1 一个通用的发射接收链路模板我的建议是不要为每个方案单独写一套完整收发代码而是搭建一个统一框架用不同的调制器/解调器名称切换。框架分层如下参数层子载波数、CP长度、调制阶数、信道模型、SNR范围。发射层比特生成→映射→调制OFDM/OFDM-IM/OCDM/SCMA/OTFS→导频/CP→波形生成。信道层水声信道/瑞利信道/可见光信道等。接收层同步可选→去CP→解调/判决→比特流。以O-OFDM为例完整链路脚本很简洁% 主脚本O-DCO-OFDM仿真BER clear; clc; N 128; cpLen 32; M 4; snrRange 0:2:20; numBits 1e6; ber zeros(size(snrRange)); bits randi([0 1], numBits, 1); modIdx 1; for snr snrRange errors 0; total 0; for k 1:numBits/( (N/2-1)*log2(M) ) % 简化处理实际用batch设计 txBits bits(...); % 调制 Hermitian IFFT 循环前缀 加偏置 % 信道AWGN % 接收端去偏置、去CP、FFT、解调 [~, ber(modIdx)] myOOFDMLink(txBits, snr); end modIdx modIdx 1; end semilogy(snrRange, ber);实际仿真时要注意数据块划分。如果用循环累积所有OFDM符号后再统一加噪声一定要确保每个OFDM符号独立加噪声且SNR按每个符号的平均能量计算。MATLAB里的awgn函数是按整个输入信号功率计算如果你的信号由多个符号组成而每符号能量不同结果会有偏差。我习惯手动生成噪声noise sqrt(noiseVar/2) * (randn(size(signal)) 1i*randn(size(signal))); rx signal noise;这样能明确知道噪声方差随每个符号的功率谱密度变化调试起来才清晰。5.2 参数设置经验与仿真时间优化子载波数选择光OFDM常取64到256太小则频域分辨率差太大则IFFT点数增加仿真速度肉眼可见地下降。科研演示用64就够性能稳定同时MIMO扩展方便。循环前缀长度室内可见光信道时延扩展很小4到8个采样就足够光纤信道看色散强度宁可多设也不让ISI主导。蒙特卡洛仿真帧数通用经验是至少统计100个错误比特否则BER曲线抖动大。也就是说在BER1e-3时至少发10万比特BER1e-5时至少发1百万比特。如果不能忍受时长就改用理论误码率或半解析法。加速技巧把不会变化的部分预计算如FFT矩阵、DFnT矩阵、SCMA码本、OTFS变换矩阵。另避免在循环内调用randi生成整个大数组尽量用矢量化一次性生成比特矩阵再切块。还有一个实用技巧启蒙阶段建议先把发射机输出存成.mat文件再用独立脚本做接收处理。这样一旦接收端有bug不需要重跑发射机节省大量时间。我用这个办法从OTFS和O-OTFS的bug排查中解脱出来。5.3 如何快速复现一个O-OTFS方案O-OTFS的结构并不像名字那样高不可攀。我按照以下步骤复现生成DD域QAM符号网格尺寸N×M。对网格做ISFFTN维FFT和M维IFFT得到TF域网格。把TF域网格逐行映射到OFDM符号即每行对应一个OFDM符号列对应子载波。对每一列进行Hermitian扩展使IFFT后的实信号频域满足共轭对称。执行IFFT得到时域实信号。加入直流偏置和非负剪裁形成O-OTFS光信号。加信道噪声、光检测、去偏置。接收端先做FFT取有效子载波再对二维网格做SFFT含均衡映射回DD域做QAM解调。关键代码雏形% 发射端ISFFT示例假设DD域为ddGrid tfGrid fftshift(fft(fftshift(ddGrid,1), N, 1),1); % 多普勒维FFT tfGrid ifft(tfGrid, M, 2) * sqrt(M); % 时延维IFFT % 再将tfGrid每行视为OFDM符号的频域输入 for row 1:N ofdmFreq [0; tfGrid(row,1:M/2-1).; 0; conj(tfGrid(row, M/2-1:-1:1)).]; txTime(row,:) ifft(ofdmFreq, M); end % 最终加上偏置即可这个代码里特别要注意ofdmFreq的索引从DC开始索引0和M/2位置都要置零数据放在1到M/2-1共轭翻转放在M/21到M-1。我在早期仿真中总在索引上出错后来直接用注释标清楚数组下标对应的子载波序号才解决。6. 常见问题与踩坑记录6.1 时域信号负值怎么处理这是光域所有调制都要面对的问题。负值不能直接发射——如果把负半周削掉信号发生非线性失真解调端会出现严重误码。解决方式不外乎加直流偏置或ACO剪裁。实验对比时加偏置大小以信号负峰值的绝对值加一个裕量配合自动增益控制使削波失真在目标信噪比下可忽略。ACO只需要把负值置零但在频域会产生共轭分量的干扰接收端判决时只取奇数子载波偶数子载波丢弃。做ACO-OFDM时如果误码率突然在某个信噪比跌不下去先检查是否把负值置零后忘记在接收端恢复原始符号功率导致星座图收缩。6.2 误码率平台和循环前缀长度如果BER曲线在10的负3到负4之间出现平台大概率是ISI/ICI或同步残留。先检查CP长是否大于信道时延扩展。一个又隐蔽又常见的错误是在光OFDM加循环前缀时我把时域信号已经通过非负剪裁而循环前缀的一段取自剪裁前的信号导致CP与信号本体不一致。正确做法是全部在加偏置/剪裁之后再做循环前缀扩展。我在O-DCO-OFDM早期版本一直没注意到结果仿真BER永远到不了10的负5最后逐段打印时域波形才抓出来。6.3 索引调制关于激活子载波的比特映射OFDM-IM的激活模式对应比特如果映射表设计不当相邻模式间汉明距离太小检测错误容易造成连续比特错误。建议使用程序枚举所有模式并强制一个模式索引的表这个表在收发两端一致即可不需要最优但务必在加噪声前先验证索引检测正确率100%。验证方法在无噪声情况下执行完整收发流程如果恢复的索引比特和原始索引比特完全一致才说明映射模块没问题。6.4 光学信道模型的选择最简单的光学信道是AWGN加衰减信噪比直接线性加到光信号上。如果想接近真实可以把增益和噪声功率分开光功率经过衰减后到达接收端接收端散粒噪声和热噪声叠加。MATLAB里实现时有人用泊松随机模拟光子计数那是量子极限复杂度高普通误码率仿真用高斯近似即可。我一般比较不同调制方案时坚持使用同一个信道模型否则对比出的差异是信道差异不是调制差异。另外光信道往往存在低通效应特别是LED调制带宽有限信号高频分量被抑制需要在发射端加均衡或采用单极性编码缓解带宽瓶颈。6.5 MATLAB版本和工具箱注意事项2020之后大部分仿真需要的函数在MATLAB基础版里都有qammod、fft、ifft、通信工具箱都是标配。没有通信工具箱时qammod可手动实现QPSK/16QAM复数映射。要注意不同版本qammod的默认输出归一化方式有差异老版本(UnitAveragePower,false)时星座点功率不归一化容易造成能量不匹配。我建议所有仿真统一用UnitAveragePower,true并按信号平均功率计算SNR。另外如果要用parfor并行蒙特卡洛仿真需要提前把随机数流统一管理保证可重复性。我在R2022a上用parfor跑OTFS仿真因为没有设置rand stream结果每次运行BER曲线都不一样最后添加了RandStream才稳定。7. 个人选型经验与使用体会做了大量对比仿真后我的选择逻辑变得很实际。如果场景是静态室内可见光通信O-OFDMACO或DCO仍是首选因为实现简单、芯片生态成熟可以花精力做均衡和调光控制。如果系统要支持多个用户且使用免调度多址O-SCMA有优势但代价是码本和MPA接收机复杂很多论文没有提及的是码本对光学器件非线性敏感工程化难度高。车载或高速移动环境O-OTFS是最有潜力的候选尤其当多普勒扩展明显、OFDM出现严重ICI的时候OTFS在DD域稀疏信道的特性让它能保持较稳定的性能代价是复杂度显著增加。O-OFDM-IM适合功率受限的中低速光链路索引信息带来意外增益但频谱效率下降需要靠高阶星座弥补。O-OCDM在PAPR和抗干扰方面有一定甜头不过预处理复杂度略高适合特殊干扰环境。我的切身体会是做射频和光学调制对比最难的不是把每套方案跑通而是建立统一的评价口径。有些人比较频谱效率时给O-OFDM保留全部子载波但加了高直流看似效率高实际上功率开销巨大给ACO-OFDM算频谱效率时又按全子载波算结果虚高。正确的做法是固定数据速率固定带宽固定误码率目标再看所需光功率或所需SNR。这样一比很多论文里的增益就不那么神奇了。如果你想快速切入这个方向我建议从O-OFDM和O-OTFS两个方案开始一个是最经典的基线一个是未来潜力较高的新星两者对比就能很好理解光域调制的核心张力——频域、时频域、时延-多普勒域哪个域更适合你的信道答案往往在你做完仿真后自然浮出水面。