
简介ANU ENGN4536 课程配套的 Simulink 无线通信仿真项目主要面向通信工程专业学生、课程设计者及希望快速验证物理层算法的工程师。压缩包共 11 个文件核心为 6 个 Simulink 模型.slx、4 个 MATLAB 脚本.m和 1 个 Excel 数据表.xlsx整个包仅 144KB获取和打开都很方便。模型部分覆盖 QPSK/8PSK 调制、OFDM 子载波映射、Rayleigh 平坦衰落与频率选择性衰落信道、SIMO 分集合并、差分编码等无线通信关键模块并分别针对独立同分布衰落、最大比合并、选择合并、差分编码等场景给出了不同仿真配置MATLAB 脚本负责参数设置、仿真流程控制以及误码率统计数据表可记录不同信噪比下的实验结果便于后续对比分析。通过这个项目可以系统掌握无线发送链路、信道模型、接收检测与性能评估的完整仿真思路也能看到调制编码、同步检测、均衡器等知识点在 Simulink 中的具体实现。目前已有 202 人学习或下载适合需要将无线通信抽象理论与可视化建模仿真结合学习的读者。1. 一个 Simulink 工程压缩包到底该怎么读拿到Simulink Project.rar_IBB_SIMULINK_engn4536_project_无线通讯这样的文件第一反应别是双击解压先想清楚里面装的不是某个模型文件那么简单。从命名可以看出这份工程涉及 Simulink 建模、项目代号IBB、课程编号engn4536主题是无线通讯。这类工程文件在课程设计、实验室项目里最常见里面通常包含主模型、初始化脚本、数据文件和仿真结果少则几十个文件多则上百。问题是Simulink 模型打开后如果缺了回调脚本或数据文件跑起来就是一堆红叉报错信息还看不懂。这篇文章就是给你一套读这类工程、跑通仿真、改参数验证方案的可执行路径覆盖从文件结构识别、发送链路搭建到误码率分析的完整过程。无线通讯系统仿真不是把模块拖进画布就连起来那么随意信号参数、帧结构、信噪比定义这些细节每一个都决定你的仿真结果是否可信。2. 拆开工程文件的骨架无线通讯 Simulink 模型的典型结构2.1 先看压缩包里有什么再决定怎么打开解压后我一般会先按文件类型分个类不急着双击.slx。无线通讯类的 Simulink 工程通常由以下几类文件组成文件类型常见后缀作用模型文件.slx/.mdl主模型和子系统包含信号流和模块参数初始化脚本.m设置工作区变量如采样率、调制阶数、帧长数据文件.mat预生成的导频序列、信道系数或仿真结果回调函数.m写在模型PreLoadFcn或InitFcn里的自动加载逻辑文档.pdf/.docx实验说明或项目报告通常包含参数表打开.slx之前先在 MATLAB 里把当前目录切到解压文件夹然后执行ls看一下有没有init.m或者setup.m这类脚本。无线通讯仿真对工作区变量依赖很重模型里的Sample Time、Carrier Freq、Gain这些参数很少直接写死在模块参数里而是引用工作区变量比如Ts、EbNo、sps。如果你直接双击模型再点运行大概率会在启动那一刻弹出一堆Undefined function or variable。2.1.1 初始化脚本是入口不是可选项打开模型之前先把初始化脚本跑了。在 MATLAB 命令行执行% 假设工程根目录下有一个初始化脚本 run(init_params.m);初始化脚本里通常定义了仿真所需的全部常量比如% 通信参数定义 Rs 1e6; % 符号速率 1 MHz sps 16; % 每个符号的采样点数 Fs Rs * sps; % 采样频率 16 MHz M 4; % QPSK 调制阶数 Nframe 1000; % 每帧符号数 EbNo 10; % 目标比特信噪比 dB跑完脚本后再打开模型模块上的参数引用才能解析到数值。做得规范的工程会在模型的PreLoadFcn里自动执行这段脚本但很多课程工程没那么规范需要手动跑一次。2.1.2 没脚本怎么办用 Model Explorer 反查参数定义如果压缩包里没有初始化脚本模型打开后一堆参数找不到那就按 F12 打开 Model ExplorerR2021a 及以后版本快捷键有变化左侧展开Model Workspace逐个查看Base Workspace里缺失的变量。无线通讯模型里最容易缺的变量是Fs、sps和EbNo因为这三个变量直接决定 Signal From Workspace 模块的采样率和 AWGN 信道模块的 SNR 换算。如果确实找不到定义文件只能根据模块面板反推参数然后用命令行手动补上去。2.2 无线通讯仿真模型的三大段发送、信道、接收一个标准的无线通讯 Simulink 模型无论课程设计还是原型验证结构上必然分成三段。发送端做信源编码、调制和脉冲成形信道段加噪声或衰落接收端做匹配滤波、同步和判决。这三段各自负责的信号处理任务不同对应的 Simulink 模块也不同。2.2.1 发送端从比特流到基带波形发送端最常见的模块链是Bernoulli Binary Generator-Rectangular QAM Modulator Baseband-Raised Cosine Transmit Filter。如果工程是 BPSK 或 QPSK也可以直接用Symbol Mapper配合Discrete-Time Impulse Response做成形滤波。在这个链路上sps的选择直接影响频谱效率和仿真复杂度。sps16适合看眼图和频谱sps4适合快速跑长帧仿真因为采样点越多仿真越慢但成形滤波器的旁瓣抑制更好邻道泄漏更小。Raised Cosine Transmit Filter模块的滚降系数Rolloff Factor也是无线通讯仿真里常见的教学点。滚降系数取 0.22 或 0.35 是工程上最常见的值0.22 频谱效率高但时域拖尾长0.35 频谱效率略低但更容易同步。如果工程里的值不一样建议先保持原样跑通后再改。2.2.2 信道段AWGN 和多径衰落的不同建模方式无线通讯仿真里信道段的热词是AWGN Channel和Multipath Rayleigh Fading Channel。AWGN 信道只需要一个参数SNR (dB)或Eb/N0。这里有个关键点Simulink 的 AWGN Channel 模块默认用SNR而通信系统性能分析通常用Eb/N0两者需要换算SNR(dB) Eb/N0(dB) 10*log10(log2(M)) - 10*log10(sps)如果模型里直接用Eb/N0而模块设置的是SNR仿真结果一定对不上。很多同学在这里栽过跟头Scope 里看波形全是噪声BER 高得离谱。多径衰落信道模块参数更多常见的是Delay vector、Gain vector和Doppler shift。按 IBB 这类课程工程的常见做法先跑 AWGN 验证链路通畅再换多径信道看均衡效果工程里如果存在两套模型或一个可配置子系统就是这个目的。2.2.3 接收端同步与判决是仿真的戏肉接收端最容易被忽略的是时序同步。无线通讯仿真里接收端常见的坑是发送端经过成形滤波后有延迟接收端如果直接在Raised Cosine Receive Filter后接Constellation Diagram或Error Rate Calculation星座图上的点会转圈或模糊误码率显示 0.5。这是因为采样相位没对准。处理方法是在接收滤波器后加Symbol Synchronizer或手动延迟补偿。延迟值通常是FilterSpanInSymbols / 2即成形滤波器符号跨度的二分之一。3. 参数怎么设才合理载波、采样率与 Eb/N0 的换算逻辑3.1 基带仿真为什么可以不设载波频率很多无线通讯的 Simulink 工程里看不到Carrier Frequency这个参数这是正常的因为大部分课程设计做的是基带等效仿真把射频的载波搬移过程用复数基带信号替代。基带仿真里载波频率可以设为 0这不影响误码率结论。只有当模型里有RF Blockset的模块或者要分析频谱混叠时才需要设置Carrier Frequency和Local Oscillator参数。如果工程里确实设置了载波频率仿真步长就要跟着调。Simulink 是离散时间仿真步长一般取1/Fs而Fs必须满足采样定理也就是说至少是信号最高频率的两倍。射频仿真里Fs通常要几倍于载波频率仿真步长很小跑起来很慢所以工程上多数选择基带等效仿真空闲高频载波。3.2 从 Eb/N0 到 SNR 的换算直接在模型里用一个增益模块解决如前面所说Eb/N0和SNR换算的关键是每比特能量和采样率的关系。在 Simulink 里不需要自己写复杂的换算函数直接在 AWGN Channel 模块前加一个Gain模块增益值设为% 换算增益 G 10 * log10(log2(M) / sps);这样可以在 AWGN Channel 模块里直接填 SNR这个 SNR 值在物理意义上已经对应到你想要的 Eb/N0。注意这里的log2(M)是每符号的比特数QPSK 就是 216QAM 就是 4。sps是每个符号的采样数成形滤波器上采样后的信号必须除以 sps 才能回到每符号的能量。这个公式无论如何都要理解清楚否则你改了 Eb/N0星座图上的噪声方差却纹丝不动。3.2.1 用脚本参数化跑多组信噪比课程工程最常见的要求是画一条 BER 曲线横坐标是 Eb/N0 从 0 dB 到 12 dB纵坐标是误码率。手动改一次模块参数跑一次不现实正确做法是把整个仿真器放进一个 for 循环里用sim()命令批量执行。% BER 仿真循环模型名为 ibb_wireless_model EbNoVec 0:2:12; ber zeros(size(EbNoVec)); for idx 1:length(EbNoVec) % 把工作区变量更新为目标 Eb/N0 EbNo EbNoVec(idx); % 换算成 AWGN 信道需要的 SNR simSNR EbNo 10*log10(log2(M)) - 10*log10(sps); % 将变量写入模型工作区 set_param(ibb_wireless_model/AWGN Channel, SNR, num2str(simSNR)); % 运行仿真 simOut sim(ibb_wireless_model, StopTime, num2str(Nframe / Rs * sps)); % 从输出变量读取误码率 ber(idx) simOut.get(BER); end脚本执行的前提是模型内部Error Rate Calculation模块的输出已经连到simout模块或 Record 输出上。如果你拿到的工程没接输出就在接收端判决之后加一个Error Rate Calculation它的Tx和Rx两个端口分别接发送端原始比特和接收端判决比特第三个输出端口Err就是误码率。这里还有一个关键参数StopTime。很多无线通讯 Simulink 工程的仿真跑太久或跑不完问题就出在 StopTime 设成无穷或太大。上面脚本里Nframe / Rs * sps是跑完一帧符号所需的总采样时间单位是秒传给sim()后仿真器会在收到这一帧全部采样点后停止时间不会白白空转。3.3 帧结构设置导频、前导码和数据段的 Simulink 实现无线通讯工程的模型里如果包含同步逻辑那么帧结构一定是若干Repeating Sequence Staircase或Signal From Workspace模块拼接出来的。常见做法是用一个MATLAB Function模块生成帧结构把前导码、导频和数据段按索引拼接成向量再输出给调制器。这样做的好处是改动帧结构只需要改函数里的数组不需要连一堆Mux和Selector调试效率高很多。function frames build_frame(pilotSeq, dataBits, pilotInterval) % 每 pilotInterval 个数据符号插入一个导频符号 frames []; for idx 1:pilotInterval:length(dataBits) frames [frames, pilotSeq, dataBits(idx:min(idxpilotInterval-1, end))]; endMATLAB Function 模块里的代码支持大部分标准 MATLAB 语法但要注意 Simulink 仿真对动态数组的赋值效率不高几百个符号的帧没问题上万符号就要预分配内存。如果工程里的帧长很长建议改用For Iterator Subsystem或先把帧生成脚本放到初始化脚本里把结果存成base workspace变量再用Signal From Workspace读入模型。4. 实战从零跑通一个无线通讯误码率仿真4.1 检查模型版本和依赖项MATLAB 版本不同可能导致 Simulink 模型打不开或模块缺失。.slx文件本质上是一个 ZIP 压缩包你可以在解压工程后先用unzip看里面的 XML 格式确认模型是用哪个版本保存的unzip -l ibb_wireless_model.slx | head -20.slx内部的核心文件是simulink/blockdiagram.xml打开后可以看到release字段比如R2021b。如果你本地的 MATLAB 版本比这个旧打开模型时会提示需要升级或干脆拒绝加载此时只能借用更高版本的 MATLAB 或让作者重新导出为兼容版本。如果本地版本比模型新一般可以正常打开但个别模块的默认参数可能会变务必先跑一遍初始化脚本再启动仿真。另一个常见依赖是 Communication Toolbox 和 Signal Processing Toolbox 的授权。很多无线通讯模型使用qammod、awgn或rcosdesign这类工具箱函数没有对应 Toolbox 时模型能打开但仿真会报错。检查方法是逐个看模型里模块所属的库% 检查模型依赖的工具箱 matlab.codetools.requiredFilesAndProducts(ibb_wireless_model.slx)执行后会在命令行打印需要的 Products 列表看有无 Communication Toolbox。如果工程里用了qammod而你的 MATLAB 没装可以考虑用dsp库或 Communication 库里的Rectangular QAM Modulator Baseband替代但改动较大不建议为跑通一个小工程重新搭链路。4.2 模型内部模块布线逻辑把模型完整跑通之后先别急着看 BER 曲线用 Scope 检查三个关键波形发送端成形滤波器的输出、信道输出、接收滤波器的输出。这个步骤在任何无线通讯工程里都值得做因为 BER 是一个统计量波形才能暴露同步和滤波问题。模型断点可以在AWGN Channel模块输出后连一个Buffer再到Scope或者直接右键信号线选择Create Connect Viewer。推荐使用Time Scope它专门面向通信信号可以设置Sample Time和多个信号叠加显示比普通 Scope 更直观。时间轴的单位是秒但你要换算成符号数来看眼图效果所以Time Scope中的Time Display Offset要按实际仿真延迟设置。% 查看接收滤波输出信号的星座图 constDiagram comm.ConstellationDiagram(SamplesPerSymbol, sps); constDiagram(receivedSignal);星座图是无线通讯仿真最直观的调试图。receivedSignal从模型里通过simoutTo Workspace 模块导出注意 Export 的类型要选 Array不要选 Structure否则还要多一步拆字段。星座图上 QPSK 的四个点应该在第一象限和第三象限各两个、第二象限和第四象限各两个灰度深浅代表噪声大小。如果看到四个点各绕成一个圆环说明载波同步没做或成形滤波器的群延迟导致符号间干扰严重要回接收端检查匹配滤波器的系数是否和发送端一致。4.3 BER 曲线跑出来以后怎么验证数值对不对跑完上面那段 for 循环脚本后把ber向量和 Eb/N0 轴画成 semilogy 图和理论值对比。QPSK 在 AWGN 信道下的理论误比特率是Pb 0.5 * erfc(sqrt(Eb/N0))在 MATLAB 里执行% 理论 BER EbNoLin 10.^(EbNoVec/10); theoryBer 0.5 * erfc(sqrt(EbNoLin)); semilogy(EbNoVec, theoryBer, b-); hold on; semilogy(EbNoVec, ber, r*); grid on; xlabel(Eb/N0 (dB)); ylabel(BER); legend(理论值, 仿真值);仿真的 BER 曲线实验值应该和理论值趋势一致在高信噪比区域由于仿真样本数量有限实验值会抖动但整体上不能偏离超过一个数量级。如果 QPSK 在 Eb/N010 dB 时 BER 还在 1e-2 量级链路一定有问题优先检查 AWGN 信道的 SNR 设置是否忘了做10*log10(log2(M)/sps)换算。5. 无线通讯 Simulink 工程的 5 个常见坑与排错对照5.1 模型能打开但 Run 按钮灰色这说明模型里有参数未定最常见的原因是模型 PreLoadFcn指向的初始化脚本文件名不对。打开File - Model Properties - Callbacks - InitFcn把脚本名改成实际存在的.m文件名或者在Base Workspace里手动补齐所有参数。这类问题在重命名工程文件夹后特别容易出现PreLoadFcn里的路径是相对路径文件夹一动就失效。5.2 Scope 里波形全红或者全绿没有信号如果发送端有信号但 Scope 没有显示先检查 Sample Time 是否设为inf或者-1。Simulink 的Scope模块在离散仿真中要求信号采样时间一致如果Spectrum Analyzer或Time Scope的 Sample Time 和信号不匹配画面就是一条直线。解决方法是右键模块选择Block Parameters把Sample Time从-1改为实际仿真步长1/Fs。5.3 BER 显示 0.5 且指针一直不动误码率 0.5 几乎可以断定是同步没有建立接收端判决时刻和发送端比特没有对齐比较器拿到的两路比特错位。错误发生在 Error Rate Calculation 模块的Rx端口收到的比特流比Tx晚了几个符号。对策是在Rx路径上加整数符号延迟补偿补偿量可以在接收端用Find Delay模块自动算出。5.4 仿真速度越来越慢甚至卡死无线通讯仿真里最拖速度的是高倍采样率加长仿真时间。sps从 16 降到 4 可以把仿真提速 4 倍代价是成形滤波器频谱旁瓣变高。如果工程对频谱要求不严可以先把sps改成 4 跑通流程再改回 16 做最终验证。另外Scope 模块开着很耗资源大批量仿真时关掉一切Scope和Display模块或者把它们从模型中移除。5.5 模型里出现代数环报错无线通讯模型里出现代数环是 Simulink 里比较烦的问题表现是Simulink 检测到代数环的黄色警告。常见产生位置是Error Rate Calculation模块的Enable端口接到了同一模型内部信号而该信号又依赖接收判决结果。解决办法是给警告信号路径加一个Unit Delay打破代数环。注意这会引入一个采样周期延迟对 BER 统计基本无影响但如果你在算每比特延迟值要把这个延迟算进去。6. 把工程跑通以后值得试的三个扩展6.1 用外部模式实时调参快速观察 Eb/N0 变化模型中只要把信号simout输出模块换成Dashboard里的Gauge、Slider之类的控件或者更直接地在模型里加一个Repeating Sequence模块生成扫频 Eb/N0 输入就可以在仿真过程中实时看 BER 变化。外部模式其实在普通的sim()仿真中就支持把变量改成tunable参数用 stream 方式每 100 帧更新一次比跑一组静态 BER 更高效。对于无线通讯模型来说这会显著缩短参数扫描实验的时间前提是模型没有用到需要重新编译才能改的结构参数。6.2 生成 C 代码或 FMU把无线链路移植到硬件验证如果工程是要与硬件对接的项目而不是只交课程报告Simulink 模型可以走 Embedded Coder 生成 C 代码。前提是模型里只能有支持代码生成的模块像Scope、Display、To Workspace这类仿真专用模块都得移除还要把样本时间设置成离散值。无线通讯模型的代码生成主要看链路里用的滤波器和调制模块是否是固定点兼容版本QPSK 调制解调通常没问题MATLAB Function里的浮点复数运算如果写得不规范会产生大段临时变量需要在配置参数里打开Inline function calls和Dynamic memory allocation相关选项来避免栈溢出。生成 FMU 也是 Simulink 官方支持的格式方法是在Simulink Compiler或Embedded Coder的导出面板里选 FMU 类型 2.0导出的 FMU 可以在 FMU 兼容环境中独立运行这对跨工具链集成很有用。6.3 从单链路到多载波把现有链路升级为 OFDM提到无线通讯工程很容易联想到热词里的 OFDM。如果当前工程是单载波 QPSK 链路扩展成 OFDM 并不需要从零搭通信工具箱里有现成的OFDM Modulator和OFDM Demodulator模块原链路中的调制器替换为 OFDM 调制器接收端把解调器换成 OFDM 解调器即可。需要额外关注的是导频子载波和循环前缀长度Cyclic Prefix Length一般设为信道时延扩展的 2 到 4 倍导频密度取决于多普勒频移。用 OFDM 模块时BER 计算要看子载波间的正交性是否被多普勒破坏在 AWGN 信道下 BER 曲线应当和单载波基本一致在多径信道下则明显优于单载波。这是无线通讯课程工程里最体现工作量的一步扩展。本文还有配套的精品资源点击获取