
简介针对CDMA通信系统原理与Simulink建模需求这份资源面向通信工程专业学生、MATLAB初学者及需要完成相关课程设计或仿真的工程师。内容围绕CDMA多址接入与扩频通信展开采用M序列作为扩频码分别对理想正交码组和非完全正交码组两种情况下的系统性能进行仿真帮助理解多址干扰的产生与影响。压缩包共107个文件大小约20.06MB包含mdl模型、m脚本、mat数据、C源文件、mexw32可执行组件、mp4操作录像及doc说明文档覆盖从代码实现到仿真验证的完整链条。配套中文注释和参考文献便于逐行理解算法细节操作录像则展示了如何在MATLAB 2022A中正确设置当前文件夹路径并运行模型有效降低上手门槛。目前已有205人学习下载适合希望系统掌握CDMA扩频仿真流程、快速复现并扩展实验的读者。 搞通信仿真第一时间都会想到MATLAB/Simulink但很多人卡在第一步CDMA系统到底怎么搭模型PN码、扩频解扩、RAKE接收这些模块在Simulink里如何对应拿到的Demo又看不懂注释、跑不通仿真、不知道论文里那些图和自己的模型怎么对上号。我最近刚好完整过了一遍CDMA通信系统的Simulink建模与仿真从扩频通信原理到发射机、接收机、信道模型最后把误码率曲线和理论值对齐还顺带整理了完整的中文注释、说明文档、参考文献和操作录像。这篇就把整个建模思路、核心模块参数设置、仿真过程中踩过的坑一次性说清楚给正在做通信课程设计、毕业设计或者准备数字通信方向面试的朋友做个参考。1. 建模前的整体思路为什么选CDMA、为什么用Simulink1.1 CDMA系统仿真的核心需求解析CDMA码分多址和FDMA、TDMA最大的区别在于所有用户在同一时间、同一频段上传输靠不同的扩频码来区分用户。这种体制下系统性能直接受扩频码的自相关/互相关特性、多址干扰MAI、远近效应、多径衰落等因素影响。理论分析能做一部分但碰到多用户、多径、功率控制这些实际因素时解析推导会变得非常复杂仿真就成了验证系统性能最直接的手段。做CDMA仿真Simulink相比纯MATLAB脚本有明显的优势模块化程度高发射机、信道、接收机每个环节都能可视化呈现调试时可以直接在Scope里看扩频前后的波形、频谱变化配合BERTool和误码率统计模块能很方便地画出Eb/N0与误码率的关系曲线。特别是对初学者图形化的模块连接方式比面对几百行m脚本更直观。1.2 方案选型模型分层与模块化设计我这次建模采用的是发射端-信道-接收端三层结构发射端负责信源编码、扩频调制信道模型加入高斯白噪声AWGN和多径衰落接收端完成解扩、解调、误码率统计。每个子系统封装成Subsystem主模型保持简洁这也方便后续单独替换某个模块做对比实验。一个需要提前想清楚的问题是模型到底做基带仿真还是通带仿真。通带仿真把载波频率也建模进去模型运行速度慢而且对采样时间设置要求很高基带仿真是用等效复基带表示信号不显式建模载波但能准确反映扩频、解扩、误码性能。除非你要看射频前端的影响否则强烈建议做基带仿真。我这次采用的就是基带等效模型这也是大多数通信系统仿真的标准做法。2. 核心技术点拆解扩频码、扩频调制、信道与接收机2.1 PN序列与Walsh码用户区分的基础CDMA系统的灵魂是扩频码。工程上最常用的是m序列和Gold序列m序列是由线性反馈移位寄存器LFSR生成的伪随机序列具有良好的自相关特性Gold序列由两个优选的m序列模二加得到互相关性能更好适合多用户场景。在Simulink里可以用PN Sequence Generator模块直接生成m序列只需要设定Generator polynomial、Shift register length和Initial states这几个参数。另一个关键是Walsh码。IS-95和CDMA2000系统里前向链路用Walsh码区分同一小区内的不同用户Walsh码是正交码理想情况下用户间互干扰为零。Simulink的Walsh Hadamard Code Generator模块可以生成指定阶数的Walsh码矩阵输出128阶、64阶都很方便。需要注意的是Walsh码只有在同步理想的情况下才是严格正交的实际系统一旦出现时间偏移正交性就会被破坏这也是后面仿真误码率比理论值高的原因之一。2.2 扩频调制与解扩处理增益怎么算扩频的本质是用高速率的扩频码序列去调制低速率的信源数据频带被展宽但是功率谱密度降低信号的抗干扰能力增强。处理增益Gp等于码片速率Rc与信息速率Rb的比值用dB表示就是10lg(Rc/Rb)。比如信息速率是9.6kbps码片速率是1.2288McpsIS-95标准值处理增益就是10lg(128)≈21dB这意味着系统能容忍的干扰电平可以比信号本身还高21dB而不影响解调。在Simulink实现上扩频通常采用BPSK调制与扩频码相乘的方式。信源数据经BPSK映射后与PN码逐码片相乘输出码片速率的扩频信号。接收端则做相反的操作接收信号与本地同步的PN码相乘然后在一个信息比特周期内积分或者用匹配滤波器完成解扩。Simulink里可以用Product模块直接做乘法Butterworth低通滤波器做积分清洗也可以用Integrator模块实现积分清除。实测下来用Integrator配合采样保持的方式解扩效果更干净相位失真的问题更少。2.3 信道模型与RAKE接收机对抗多径的关键移动通信环境里信号经过多条路径到达接收端每条路径有独立的衰减因子、时延和相位偏移会导致频率选择性衰落。CDMA系统因为扩频码的尖锐自相关特性天然具备分辨多径的能力——只要路径时延差大于一个码片周期接收端就能把不同路径分开再通过RAKE接收机进行最大比合并把分散在各路径上的能量收集起来。Simulink里有现成的Multipath Rayleigh Fading Channel模块可以设置路径时延、平均路径增益、多普勒频移等参数。我在仿真中设置了两径信道路径时延分别为0和1.5个码片周期这样既能体现多径的影响又不至于让模型过于复杂。RAKE接收机由多个相关器组成每个相关器对准一条路径各路输出经过加权合并最大比合并的权重与路径增益共轭成正比得到最终判决变量。这个部分如果自己从零搭会比较繁琐Simulink里可以用多个解扩支路并联实现每个支路用不同的延迟补偿。3. 完整建模实操从发射端到接收端一步一步搭3.1 模型参数设定与采样策略建模仿真第一步是确定仿真参数参数选不好后面全白搭。我用的参数如下信息速率Rb9.6kbps码片速率Rc1.2288Mcps对应扩频因子128调制方式BPSK载波频率基带等效模型不需要设置采样率每个码片采4个点即采样率4.9152MHz兼顾波形观测准确性和仿真速度仿真时长至少10000个信息比特才能统计出稳定的误码率这里有个关键点Simulink的离散时间模型对采样时间一致性要求很高必须在每个模块里正确设置Sample time。最简单的方式是使用Sample Time设为继承-1让Simulink自动推导但在某些模块如PN Sequence Generator必须手动指定否则会报数据流不匹配错误。被我踩过最深的坑就在这——发射端和接收端的PN码生成器采样时间不一致导致解扩结果完全错误示波器上波形乱跳还以为是信道问题。3.2 发射端子系统搭建发射端子系统包含伯努利二进制信源Bernoulli Binary Generator、BPSK调制器、PN码生成器、扩频乘法器和脉冲成形滤波器。信源概率设为0.5输出9.6kbps的0/1序列BPSK调制把0/1映射为-1/1PN码生成器产生速率1.2288Mcps的±1序列两者通过Product模块相乘得到扩频信号。脉冲成形滤波器我用了根升余弦Root Raised Cosine滤波器滚降系数0.22符合IS-95规范作用是把码片波形限制在带宽内减小邻道干扰。这里直接使用Simulink的Raised Cosine Transmit Filter模块先设置Filter order、Rolloff factor和Upsampling factor即可省去了自己设计FIR滤波器的麻烦。上采样因子设为4正好对应前面说的每码片4个采样点。3.3 信道模型配置信道部分使用了AWGN Channel模块和Multipath Rayleigh Fading Channel模块级联。AWGN模块需要设置信噪比参数需要注意的是Simulink里有两种指定方式Eb/N0每比特能量与噪声功率谱密度比和SNR信噪比。对扩频系统Eb/N0和SNR的关系是SNR Eb/N0 × Rb/BwBw是信号带宽。在Simulink里如果你在接收端做完整解扩后再测量误码率直接用Eb/N0设置更方便因为解扩前后信噪比会发生变化用SNR容易搞混。多径信道模块需要设置Number of paths 2path delays [0 1.5e-6]秒即1.5个码片周期path gains [0 -3]dBmaximum Doppler shift 50Hz模拟低速移动场景。多普勒频移不为零时信道是时变的每次运行结果会有随机性做误码率仿真时需要多次蒙特卡洛平均。3.4 接收端子系统搭建接收端设计是整个模型的核心难点。步骤如下第一路同步的PN码与接收信号相乘完成解扩再经过积分清除Integrator with reset在每个比特周期的末尾采样判决。这里PN码的时序必须与发射端对齐否则乘积结果不会正确解扩。实际建模时如果不做同步模块可以简单粗暴地把发射端PN码生成器的初始状态和接收端设为一致并确保采样时间完全同步这在Simulink中实现起来很直接适合教学仿真。第二路解扩后的信号经过匹配滤波器由解扩卷积和低通滤波等效实现得到每个比特的软判决值。再通过Sign模块做硬判决得到0/1比特流。最后用Error Rate Calculation模块统计误码数、误码率和接收到的比特总数同时接到Display和Scope模块实时显示。需要注意的是Error Rate Calculation模块有一个Receive delay参数因为整个链路有滤波、积分等延迟接收比特会比发射比特晚几个周期需要根据实际延迟设置这个参数否则误码率会虚高甚至出现误码率超过50%的诡异现象。4. 仿真结果分析误码率曲线、波形验证与参数影响4.1 理论误码率与仿真误码率对比BPSK调制在AWGN信道下的理论误码率是公式Pe 0.5 × erfc(sqrt(Eb/N0))。在Simulink里仿真不同Eb/N0值下的误码率从0dB扫到10dB每个点至少跑5万比特得到的结果和理论曲线对比基本吻合。在低信噪比区域0-3dB仿真值和理论值差异在1个数量级以内这是正常的统计波动高信噪比区域需要更多比特才能得到稳定的误码率估计比方说10dB时需要跑10^6比特才能测到100个误码仿真时间会明显变长。加上两径衰落信道后误码率曲线明显恶化而且随着Eb/N0增加误码率下降变缓出现误码平台现象。这是频率选择性衰落的典型特征这时如果不做RAKE合并或者均衡单纯增加发射功率很难改善误码性能。我在这组仿真里对比了无RAKE、两指RAKE和四指RAKE的情况四指RAKE在10dB时误码率比无RAKE低了一个多数量级直观体现了分集合并的增益。4.2 扩频波形与频谱验证发射端和接收端的Scope里可以清楚看到信息比特、扩频码和扩频后信号的三层速率关系。扩频后的波形速率明显加快幅度无明显特征频谱上功率被展宽到码片速率量级。接收端解扩后的波形又恢复成慢速率的BPSK调制波形这验证了扩频-解扩过程的正确性。做频谱观察需要使用Spectrum Analyzer模块可以看到扩频后的主瓣宽度大约是2倍码片速率而基带信息速率对应的谱宽远小于这一值。4.3 不同参数对系统性能的影响我把扩频因子从128改成64或者256做了一组对比实验。扩频因子降为64时同样Eb/N0下误码率有所改善因为处理增益降低等效带宽减小噪声功率降低但多用户容量下降扩频因子升为256时抗干扰能力增强但占用带宽翻倍频谱效率下降。这组对比很直观地解释了CDMA系统用带宽换信噪比的本质也是面试里常问的知识点。5. 常见问题排查与避坑指南5.1 仿真发散或波形异常最常见的问题是Scope里看到波形乱跳或者信号幅度越来越大、仿真发散。绝大多数情况是代数环Algebraic Loop问题模型里出现了没有单位延迟的反馈回路Simulink无法求解。解决方法是双击报错的模块检查是否有直接反馈路径或者在回路里插入Integer Delay或Unit Delay模块打破代数环。另一个常见原因是多速率系统中的采样时间设置不一致。扩频前的信号是9.6kbps扩频后是1.2288Mcps中间跨越了128倍的速率变化如果某个模块的Sample time仍然设成信息速率必然出错。5.2 误码率统计不准确误码率不准确集中出现在三种情况一是Error Rate Calculation的Receive delay没设置好导致误码率严重虚高二是仿真时间太短高信噪比时误码数太少统计结果波动很大三是发送端和接收端PN码状态不同步。第三种情况最隐蔽因为在仿真图上波形还能看但解扩结果完全是噪声误码率稳定在50%左右。检查方法是直接把接收端解扩前的信号和发射端扩频信号做相关看峰值是否明显。5.3 仿真速度太慢怎么办跑高信噪比误码率点时模型速度可能会慢到让人怀疑人生。我用过两个有效的办法一是把Display模块关掉Scope模块取样率降低图形化显示本身就会拖慢仿真速度二是使用Accelerator模式Simulink会把模型编译为C代码执行比如普通模式跑10分钟的任务加速模式可能2分钟就能完成代价是首次编译需要等待。如果还需要更快可以把模型生成C代码后在MATLAB里编译成MEX文件再配合parfor做蒙特卡洛并行仿真。5.4 配套文档与代码注释的重要性这次仿真项目做完整套整理后说实话最大的体会是中文注释和说明文档的价值真的不亚于模型本身。三天后回看自己搭的模型如果没有注释一定会忘掉哪个模块是干什么的、参数为什么这么设。所以建议每一个Subsystem里都要写注释关键模块的参数设置截图保存录下来的操作过程视频也留着。做通信仿真结论要有理论支撑代码要有注释解读文档要能从头复现——这三点是我做完这个项目以后最深的体会。6. 扩展建议与应用方向CDMA建模做完之后可以往几个方向继续扩展。第一是加多用户用Walsh码区分用户后观察多址干扰对误码率的影响并和单用户场景对比第二是加功率控制模块模拟远近效应下系统对功率控制算法的需求第三是把信道换成更复杂的ITU标准信道模型比如Pedestrian A、Vehicular A贴近实际网络场景第四是结合LTE或5G的OFDM体制做一个CDMA和OFDM的仿真对比。这些方向如果感兴趣后续我可以逐个建模把新的实操内容和大家分享。本文还有配套的精品资源点击获取