ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

MATLAB仿真1G到6G:从GMSK到OFDM、NR与RIS的物理层演进

MATLAB仿真1G到6G:从GMSK到OFDM、NR与RIS的物理层演进 简介针对无线通信多址接入技术从理论到仿真落地的需求这份项目以MATLAB为核心工具完整覆盖了从第一代到第六代移动通信的多址演进脉络即从频分多址、时分多址、码分多址、正交频分多址到非正交多址与速率分割多址。资源包共收录66个文件其中57个MATLAB脚本、7个说明文档另有许可证与配置文件压缩包整体仅79KB轻量易用。目前已有56人学习浏览。每个多址技术均设有独立目录包含主函数、辅助函数与说明文档例如频分多址实现频谱划分与调制解调时分多址搭建时隙分配与帧结构码分多址完成扩频解扩与干扰分析正交频分多址支持资源块分配与循环前缀非正交多址实现功率域复用和连续干扰消除速率分割多址则覆盖消息分割、公共与私有流传输及多用户MIMO预编码。直接运行主函数即可观察波形、频谱、资源网格等结果很适合通信专业学生作为课程设计、科研对照或毕业设计的基础模板。1. 从模拟FM到AI空口MATLAB仿真1G到6G到底在做什么很多人看到“涵盖1G到6G无线通信技术的MATLAB仿真项目”这个标题第一反应是画一张演进表、堆几个频段数字就结束了。真正做下去会知道它是在用可运行的物理层链路把每一代技术换道的原因复现出来1G用30kHz模拟FM信道2G换成200kHz的GMSKTDMA3G用扩频码换抗干扰增益4G转到OFDMMIMO把频率选择性信道切成平坦子信道5G在此基础上加参数集和波束管理6G则把太赫兹、智能超表面和AI接收机推上前台。这个项目适合三类人做无线预研的工程师需要快速验证想法研究生复现文献里的系统以及想评估某代技术到底比上一代强在哪的开发人员。它不是追求一次覆盖整个协议栈而是把每代物理层的关键机制抽成最小可运行链路用MATLAB的波形、误码率和频谱图说话。2. 用MATLAB重建1G到4G物理层FDMA、GMSK、WCDMA、OFDM的取舍逻辑2.1 从模拟FM到数字GMSK1G和2G的最小链路1G的典型代表是AMPS30kHz信道带宽模拟FM调制。它的容量瓶颈不是调制本身而是模拟信号在噪声下不可再生每经过一次中继噪声就累积一层频率资源利用率也低。2G换成了数字调制加上时分多址GSM用200kHz载波、8个时隙共享调制方式选GMSK。GMSK的关键是高斯预滤波把相位路径变平滑把带外辐射压到GSM规范以内代价是引入可控的符号间干扰。MATLAB里通信工具箱直接提供现成的调制器% GSM规范BT0.38倍过采样方便观察波形和邻道泄漏 md comm.GMSKModulator(BitInput, true, ... BandwidthTimeProduct, 0.3, ... SamplesPerSymbol, 8); dd comm.GMSKDemodulator(md); % 从调制对象复制参数避免不一致 bits randi([0 1], 4096, 1); x md(bits); % GMSK基带波形 r awgn(x, 12, measured); % 加12dB高斯噪声模拟低SNR环境 bitsRx dd(r); ber mean(bits ~ bitsRx); fprintf(GMSK BER 12dB SNR: %g\n, ber);代码逻辑很简单调制、过信道、解调、对比特。真正要留意的是BandwidthTimeProduct也就是BT积。B是高斯滤波器3dB带宽T是符号周期BT越小频谱越窄但符号间干扰越重GSM选0.3是频谱效率和接收机复杂度的折中。SamplesPerSymbol在收发两端必须一致否则解调器相位路径对不上。这里SNR的单位是符号级的不是Eb/N0后面第5章会专门说两者换算很多“仿真发散”就出在这里。制式多址方式调制/编码载波带宽峰值速率核心变化1G AMPSFDMA模拟FM30kHz仅语音频分多址2G GSMTDMA/FDMAGMSK200kHz9.6~14.4kbps数字基带时分3G WCDMACDMAQPSK OVSF5MHz2Mbps静态码分多址4G LTEOFDMA/SC-FDMAQPSK/16QAM/64QAM1.4~20MHz150Mbps20MHz 2x2OFDMMIMO做2G仿真时有个新手常踩的坑直接用pskmod代替GMSK。两者解调门限差不了太多但GMSK的相位连续性直接影响功放的非线性失真表现如果把发射机射频前端模型也加进来GMSK的结论会明显不同于普通PSK。项目里如果标了“1G到6G覆盖”1G这一段用fmmod/fmdemod做一行模拟FM链路即可不需要深挖重点是让读者看到模拟和数字在噪声累积上的本质差异。2.2 3G的码分多址扩频增益怎么换成抗多径能力3G把多址方式从“分频”“分时”改成了“分码”。WCDMA用3.84Mcps的码片速率OVSF扩频因子从4到512可调每个用户用正交码区分。扩频的直接收益是处理增益发送信号被扩展到更宽的频带上接收端用同一个码做相关解扩噪声和干扰被平均掉信噪比提升量等于扩频因子SF换成dB就是10log10(SF)。MATLAB里最小验证代码很短sf 16; % 扩频因子 code 2 * (randi([0 1], sf, 1) - 0.5); % ±1伪随机扩频码 txSym 1; % 发送BPSK符号 chipSeq txSym * code; % 扩频后的码片序列 rxChip chipSeq 0.3 * randn(sf, 1); % 加噪声 rxSym code * rxChip / sf; % 相关解扩并归一化 detected sign(real(rxSym)); % 判决相关解扩的本质是求和信号部分每个码片同相叠加幅度变成sf倍噪声部分随机符号叠加功率增长只有sf倍。两个一除信噪比刚好改善sf倍。这就是扩频增益。3G的Rake接收机把多径里每条可分辨路径分别做一次这样的相关解扩再用最大比合并叠加把多径从敌人变成朋友。仿真里模仿Rake需要先把多径信道建模成若干条不同时延的抽头每条抽头做解扩后按信道系数共轭加权。3G项目里最不好仿的不是物理层而是系统级CDMA的“软容量”和“呼吸效应”来自小区间干扰的动态变化单链路仿真看不到这个现象。想做完整3G系统仿真至少要搭一个多小区网格每个用户实时上报干扰水平再迭代功率控制。这个工作量比2G大一个量级所以实际项目里常用的是“单小区静态用户固定干扰余量”的简化方案结果用于验证扩频增益和Rake合并增益不与现网指标直接对标。2.3 4G换赛道OFDM如何把宽带信道切成平坦子信道4G的核心不是调制阶数变高而是把整个宽带信道切成很多窄带子载波。窄到每个子载波上的信道近似平坦均衡变成每个子载波乘一个复数系数复杂度大幅下降。循环前缀把前一个符号的多径延迟挡在FFT窗口之外只要时延扩展小于CP长度子载波之间的正交性就能保住。MATLAB通信工具箱里有现成的OFDM调制对象nFFT 64; % FFT点数 cpLen 16; % 循环前缀长度大于信道时延扩展即可 nSym 10; % OFDM符号数 txMod comm.OFDMModulator(FFTLength, nFFT, ... NumGuardBandCarriers, [6; 5], ... % 左右各留保护带 CyclicPrefixLength, cpLen, ... NumSymbols, nSym); rxDemod comm.OFDMDemodulator(txMod); % 参数从调制器复制 nCarriers (nFFT - 6 - 5) * nSym; % 活动子载波承载的数据符号数 data qammod(randi([0 3], nCarriers, 1), 4, UnitAveragePower, true); wave txMod(data); rxWave awgn(wave, 20, measured); rxSym rxDemod(rxWave); ber mean(qamdemod(rxSym, 4, UnitAveragePower, true) ~ ... qamdemod(data, 4, UnitAveragePower, true));这段代码把OFDM完整跑了一遍。NumGuardBandCarriers是左右保护带数量活动子载波数等于64减11再乘以符号数得到输入数据长度。数据长度不匹配时txMod会直接报错这是刚上手最常见的错误。接收端comm.OFDMDemodulator从调制器复制参数保证收发两端CP长度、FFT点数、保护带完全一致人为漏掉一个参数就会导致星座图旋转。OFDM与3G码分方案放在一起看选型逻辑就清楚了扩频在低SNR下有优势但宽带高速率场景下频域调度和MIMO的灵活性更重要。4G的LTE在20MHz带宽下用OFDMA做下行、SC-FDMA做上行配合2x2 MIMO能达到约150Mbps的峰值LTE-A靠载波聚合把这个值推到1Gbps以上。仿真时如果只关心单链路性能直接看OFDM解调后的星座图和误码率如果关心小区边缘速率还得加上调度器。3. 5G NR仿真落地参数集、PDSCH波形生成与ULA波束扫描3.1 参数集不是玄学换子载波间隔改变时域粒度5G NR最容易被误解的参数是numerology也就是子载波间隔的切换。LTE固定在15kHz5G把它扩展到15kHz、30kHz、60kHz、120kHz、240kHz。子载波间隔越大OFDM符号周期越短支持的低时延能力越强但CP覆盖多径的能力变差。MATLAB里一运行就知道时域粒度差异for scs [15 30 60 120] Tsym 1 / (scs * 1e3); % 不含CP的符号长度 fprintf(SCS%3d kHz, 符号长度%.2f us\n, scs, Tsym * 1e6); endSCS(kHz)常规CP长度(us)含CP符号时长(us)典型场景154.6971.35FR1广覆盖继承LTE302.3435.68FR1城郊、商业区601.1717.84FR1高速移动/低时延1200.578.92FR2毫米波室内热点工程上还有个隐藏约束采样率通常是SCS乘以2048的整数倍。15kHz对应30.72MHz采样率30kHz对应61.44MHz120kHz对应245.76MHz。仿真里改SCS而采样率不跟着改滤波器系数和同步模块会整体错位这是5G仿真“看起来跑通、BER却高得离谱”的常见原因。做多参数集对照时把采样率作为每个载波的独立配置项不要全局共用一个。3.2 用5G Toolbox生成标准NR下行波形有5G Toolbox的环境下最省事的做法是直接用nrDLCarrierConfig搭一个下行载波让工具箱按3GPP帧结构生成完整PDSCH波形。这里用的不是5G Toolbox自带的示例脚本而是把常用配置抽出来看适合自己动手改cfg nrDLCarrierConfig; cfg.NCellID 42; % 配置第一个载波30kHz子载波间隔106个RB约等于40MHz c nrCarrierConfig; c.NSizeGrid 106; c.SubcarrierSpacing 30; cfg.SCSCarriers c; % PDSCH调制方式设为QPSK p nrPDSCHConfig; p.Modulation QPSK; cfg.PDSCH p; % 生成时域波形和配置信息 [wv, info] nrWaveformGenerator(cfg); disp(info);nrCarrierConfig管频域网格大小和子载波间隔nrPDSCHConfig管调制方式和资源映射nrWaveformGenerator负责把配置翻译成时域波形。需要留意版本差异这个配置类从R2021b开始才比较完整旧版本可能只支持nrCarrierConfig加nrPDSCH的底层方式。报“找不到属性”时先doc nrDLCarrierConfig看本机工具箱的字段定义不要拿着R2018a时代的老教程硬套。生成波形后可以加AWGN、过频率选择性信道再乘以本地参考信号做信道估计整个过程和真实终端接收侧的处理顺序一致。3.3 大规模MIMO里最直观的仿真ULA波束扫描5G毫米波频段要靠波束增益补路径损耗。波束管理的本质是找一组天线权值让阵列在目标方向形成主瓣。一个均匀线阵的方向图可以完全用解析式计算不依赖任何额外工具箱fc 3.5e9; c 3e8; lambda c / fc; d lambda / 2; % 半波长阵元间距 Nt 64; % 阵列天线数 target 30; % 目标波束方向 theta -60:0.5:60; AF zeros(size(theta)); w exp(1j * 2 * pi * d * (0:Nt-1). * sind(target) / lambda); for k 1:numel(theta) a exp(1j * 2 * pi * d * (0:Nt-1). * sind(theta(k)) / lambda); AF(k) abs(w * a); % 阵列因子权值与导引向量内积 end plot(theta, 20*log10(AF / max(AF) eps)); xlabel(方位角(deg)); ylabel(归一化增益(dB)); title(64天线ULA波束方向图);代码里w是发射权值a是某个候选方向上的阵列导引向量两者内积的模就是该方向的增益。sind(target)把目标角度映射到空间频率30度方向会形成主瓣其他方向出现栅瓣和旁瓣。这对应5G波束扫描的物理过程基站遍历多个候选波束终端测量每个波束的参考信号接收功率再反馈最优波束ID。仿真里如果把这段代码放进循环对每个候选角度都算一次方向图就得到了完整的波束扫描结果。4. 6G仿真从这里起步太赫兹链路预算、RIS相位配置与AI接收机4.1 100GHz以上不能照抄3GPP的路损经验公式6G仿真项目真正与5G拉开差距的是把频段推到100GHz以上。做过传播模型仿真的人会习惯性套用自由空间损耗公式但在太赫兹频段这个近似会严重偏乐观。三大损耗来源改变了链路预算的形态自由空间损耗随频率平方增长分子吸收在60GHz氧气峰和183GHz水汽峰附近形成尖锐衰减带此外雨衰和遮挡物的反射、绕射特性也与厘米波完全不同。频段附加大气吸收工程近似典型可用距离28GHz约0.1~0.2dB/km数百米到公里级60GHz氧气吸收峰约15dB/km百米级120GHz传播窗口约1~3dB/km数百米183GHz水汽吸收峰衰减很大几十米这些数值只能作为仿真初值正式做链路设计必须查ITU-R P.676的逐频点表不同湿度、气压下差异很大。6G仿真项目里更合理的策略是把频段参数做成可调变量默认给一个“窗口频段”和一个“吸收峰频段”做对比让结果说明到底该往哪个频点走。4.2 一个可运行的太赫兹链路预算脚本链路预算把发射功率、天线增益、路径损耗和接收机灵敏度串成一条等式。100GHz以上场景天线增益往往是最后决定链路能否打通的关键freq 120e9; % 120GHz处于传播窗口 dist 100; % 百米级覆盖 c 3e8; lambda c / freq; fspl 20 * log10(4 * pi * dist / lambda); % 自由空间损耗 absorp 2 * dist / 1000; % 按2dB/km初估值实际查P.676 txPower 10; % dBm txGain 25; rxGain 25; % 高增益天线dBi rxPower txPower txGain rxGain - fspl - absorp; sens -70; % 接收机灵敏度dBm margin rxPower - sens; fprintf(接收功率%.2f dBm, 链路余量%.2f dB\n, rxPower, margin);代码把链路余量算成接收功率减灵敏度。注意天线的收发增益都给了25dBi这在大规模MIMO或RIS辅助场景里是必要条件单天线方案在120GHz下覆盖距离会非常短。改动参数时要有预期把频率从28GHz换成120GHz自由空间损耗增加约12.6dB链路余量直接掉到可用门限附近。4.3 RIS相位配置的第一版仿真让无源阵列替天线做工智能超表面是6G预研中最容易用MATLAB验证的方向。一个RIS由大量无源单元组成每个单元只调整反射信号的相位不放大也不发送自己的信号。要让反射波在特定方向同相叠加每个单元需要补偿入射波和反射波的路径差fc 100e9; c 3e8; lambda c / fc; d lambda / 2; N 64; n (0:N-1).; thI 30; thR 40; % 入射角和目标反射角 % 第n个单元的入射相位与目标反射相位 phiInc 2 * pi * d * n * sind(thI) / lambda; phiRef 2 * pi * d * n * sind(thR) / lambda; % 需要设置的补偿相位0~2pi范围 phaseSet mod(phiRef - phiInc, 2 * pi); % 在thR方向验证阵列因子对齐相位后的增益 AF_align abs(sum(exp(1j * (phiInc phaseSet - phiRef)))); AF_rand abs(sum(exp(1j * (phiInc 2*pi*rand(N,1) - phiRef)))); fprintf(相位对齐增益%.1f, 随机相位增益%.1f\n, AF_align, AF_rand);这个例子刻意只做一维阵列和一阶路径差。真实RIS仿真要加入每个单元的辐射方向图、单元间互耦、入射波幅度分布但这些会淹没主题。第一版模型能把“对齐相位比随机相位大幅提升反射增益”这件事量化清楚就够了。另外6G里通感一体化、以AI做信道预测也是热点用LSTM对时变信道做预测、替代线性插值适合在MATLAB里先用传统链路生成信道矩阵再拿LSTM做训练和验证与发射机本身解耦。5. 把六代技术放进同一个MATLAB仿真框架接口统一、SNR口径与三招验证5.1 用函数句柄隔离技术代际主循环只认波形一个仿真框架里要同时容纳GMSK、OFDM和NR波形最容易失控的是主循环里堆满if generation 2G。常见做法是把每一代封装成收发函数句柄主循环只负责加噪、测量误码率txFuncs struct(G2, gmskTx, G4, ofdmTx, G5, nrTx); rxFuncs struct(G2, gmskRx, G4, ofdmRx, G5, nrRx); function ber runLink(txFunc, rxFunc, snrDb, bits) x txFunc(bits); r awgn(x, snrDb, measured); bitsHat rxFunc(r); ber mean(bits ~ bitsHat); end接口约定只有两个发射函数输入比特、输出复基带波形接收函数输入波形、输出比特判决。这样加新制式时不需要动主循环只增加一组收发函数。这个抽象也逼着你把每代技术的差异明确化而不是混在一个脚本里互相污染变量。5.2 Eb/N0与SNR混用是仿真发散的第一来源做过多代对照就会遇到“BER曲线比理论值差好几个dB”的情况。十次里有八次不是算法错而是SNR口径不统一。同样叫“10dB”Eb/N0和符号级SNR差了一个调制阶数和一个过采样因子[ SNR_{dB} EbN0_{dB} 10 \log_{10}(k) - 10 \log_{10}(sps) ]其中k是每个符号承载的比特数sps是每符号采样数。QPSK的k2若sps8Eb/N010dB时SNR只有约6dB。仿真脚本里把awgn的SNR参数和理论对照用的Eb/N0直接画在同一条曲线上必然发散。统一做法是循环里先设定Eb/N0再转成awgn需要的符号SNR最后berawgn的理论曲线也用同一个Eb/N0向量。5.3 三个最便宜的验证方法BER曲线、星座图、频谱包络单链路仿真写完第一件事不是调参而是验证链路本身没写错。BER曲线对标berawgn理论值星座图看解调后符号是否落进正确象限频谱包络用来检查滤波器带宽和带外泄漏。星座图可以用comm.ConstellationDiagram实时观察cd comm.ConstellationDiagram(ReferenceConstellation, ... qammod(0:3, 4, UnitAveragePower, true)); cd(rxSymbols);频谱包络用spectrumAnalyzer直接看配合readmatrix把仿真结果存成CSV下次用FFT分析就不用重跑长链路。验证顺序也有讲究先跑无噪声场景确认星座图不旋转、BER归零再加小噪声确认BER曲线低段贴合理论最后加大噪声确认高段没有异常地板。哪一段对不上问题就出在哪一段对应的模块——无噪声出错查同步和映射低SNR出错查SNR口径高SNR地板出错查相位噪声或量化效应。本文还有配套的精品资源点击获取
返回列表