资讯详情

资讯详情

MATLAB 2FSK仿真全解析:从键控法到相干解调与误码率验证

简介面向通信工程与电子信息类专业学生的课程设计文档完整给出了基于MATLAB 7.0实现2FSK数字调制解调系统的设计与仿真全过程适合正在完成“通讯系统原理”课程设计或学习频移键控原理的读者参考。文档逐模块展开信源、发送滤波器、信道、接收滤波器、解调与信宿设计重点论述了采用开关法产生2FSK信号、用相干解调恢复基带信号的方案并配有设计任务、系统框图、调制解调原理图和性能评价。资源包内含1个doc文档容量约579KB内容涵盖完整MATLAB源程序、仿真波形分析与SNR-误码率曲线阅读时可结合代码运行观察二进制随机序列、调制信号、加噪信号及相干解调眼图便于对照理解各环节作用。通过这份文档读者能快速掌握2FSK调制解调系统的建模思路也可直接借鉴其章节结构与代码完成自己的课程设计报告。该资源已有853人学习下载适合通信专业本科课程设计选用。1. 2FSK课程设计仿真先把参数整除关系写清楚2FSK这门课程设计真正拉开差距的往往不是理论推导而是MATLAB仿真链路里那些封装函数和默认参数。很多同学拿到dmod/ddemod就直接填参数结果波形画出来不是缺半截就是误码率高到离谱最后只能把锅甩给“信道噪声太大”。这套基于 MATLAB 7.0 的 2FSK 键控法调制解调工程把随机信源、调制、加性高斯白噪声信道、相干与非相干解调、眼图和误码率统计全部串成可运行脚本适合正在做通信原理课程设计、或者想把通信仿真真正落到代码里的人。2FSK 看似简单但NFs/Fd非整数、载频与码速率不成整数倍这两个问题足够让整套仿真推倒重来。2. 先立系统框架键控法与相干解调为什么是这个组合设计一个 2FSK 仿真系统第一笔不是写代码而是定调制方式和解调方式。课程设计里明确采用“开关法键控法产生 2FSK 信号 相干解调接收”后面所有的滤波器、加噪公式、误码率统计全都围绕这一个组合展开。先把这个框架立住再看代码就不会晕。2.1 调制端的两种产生方式相位连续性与键控法的取舍2FSK 信号的产生方式有两种调频法和开关法。调频法是用基带信号直接控制压控振荡器VCO载波频率随信号连续变化所以相邻码元之间的相位是连续的波形过渡平滑。开关法则完全不同它用基带矩形脉冲去控制一个电子开关在 f1 和 f2 两个独立频率源之间做选择输出哪个频率完全由当前码元决定两个频率源彼此独立因此相邻码元之间的相位不一定是连续的波形在码元交界处可能看到明显的相位跳变。课程设计选开关法原因很实际第一两个频率源独立可调f1 和 f2 的频率差df可以随手改做参数实验非常方便第二MATLAB 通信工具箱的dmod函数在fsk模式下内部实现思路就是键控法——按输入码元的值去选择对应的载频输出天然契合开关法。从信号分析角度看2FSK 可以看作两个不同载频的 ASK 信号的叠加时域表达式写作s(t) s1(t) * cos(2π*f1*t) s2(t) * cos(2π*f2*t)其中 s1(t) 和 s2(t) 是互补的二进制基带脉冲序列码元为 1 时 s1 有效码元为 0 时 s2 有效。这个“两路 ASK 叠加”的视角非常关键因为接收端解调时第一步就是分别用两个带通滤波器把这两路 ASK 分量拆开后续的相干解调、包络检波全都建立在这个拆分的基础上。也就是说调制端虽然用键控法实现但分析问题时把它当作两路 ASK 叠加思维上会更顺。2.2 接收端的双路线相干与非相干差异体现在判决质量2FSK 的接收方式也分两类。非相干解调不利用相位信息结构上就是两路带通滤波器分别滤出 f1 和 f2 分量各自送入包络检波器再把两路包络同时送到抽样判决器比一比哪一路包络大就判哪个码元。这种方式没有本地载波相位同步问题实现简单但包络检波在低信噪比下存在门限效应噪声大时包络会抖动判决裕量变小。相干解调则要在带通滤波之后把每一路分别与对应的本地载波相乘再经过低通滤波器滤掉二倍频分量最后抽样判决。这里本地载波的频率和相位必须与发送端一致多了一路载波同步的开销但换来的是更优的误码率性能。课程设计把两种都做了核心意图就是让两者在误码率曲线上形成对比相干解调的理论误码率是0.5 * erfc(sqrt(EbN0/2))非相干是0.5 * exp(-EbN0/2)前者是互补误差函数衰减后者是指数衰减在同一信噪比下相干始终更优。这个结论不是靠嘴说第 6 章会给出理论曲线和仿真曲线的对照验证方法。2.3 仿真链路的关键参数先把 Fc、Fs、Fd、N 的关系摆平开始写代码之前先看一遍这套工程里最重要的 8 个参数它们决定了整个仿真能不能成立。参数取值含义Fc10载频 f1单位 HzFs40系统采样频率单位 HzFd1码速率单位 bpsN40每个码元对应的采样点数N Fs / Fddf10两个载频的间隔f2 Fc df 20 HznumSymb25进行仿真的信息码元个数M2进制数二进制seed[12345 54321]随机数种子控制可复现性这里最容易翻车的是三组整除关系。第一N Fs/Fd 40/1 40必须是整数它代表每个码元里采多少个点如果非整数dmod和ddemod内部的采样位置会错位解调输出的序列跟原码元对不上。第二Fc/Fd 10/1 10必须是整数它表示一个码元持续时间内装了多少个完整载波周期不整除的话波形会在码元边界处被截断看起来像“半截波形”。第三采样频率要满足采样定理这里Fs40最高载频f220恰好是 Nyquist 临界值实际工程中我会建议取更高的Fs比如 80让波形平滑度更好但课程设计环境里 40 也能跑通。这套参数说到底是让每个码元里恰好有 10 个完整的 f1 载波周期或者 20 个完整的 f2 载波周期波形干净肉眼好检查。第三组关系则决定了 2FSK 的频谱效率df10是码速率 Fd 的 10 倍频偏拉得足够开接收端两个带通滤波器可以轻松把两路 ASK 分量分开。如果把df改小到 2 或 3滤波分路就会变得困难误码率曲线在低信噪比区域会明显抬升。这几个整除关系我一般会写在脚本注释最顶部每次复制工程都先检查它们再开始跑仿真。3. 把信源和键控调制写成 MATLAB随机码、dmod 参数与波形检查框架定好之后就可以一步步把代码搭起来。整套工程脚本本质上是一条通信链路信源产生二进制随机码通过键控法调制成 2FSK 信号经过 AWGN 信道加噪然后送进解调器。这一章先解决前半段信源和调制以及调制波形怎么看。3.1 随机二进制信源用 randsrc 生成 25 个码元为什么只画前 15 个信源部分用randsrc生成指定数量的随机二进制码元这是通信工具箱里专门生成随机符号序列的函数比直接用rand再round要更正规一些。numSymb 25; % 仿真信息码元个数 M 2; % 二进制 x randsrc(numSymb, 1, [0:M-1]); % 生成 25 个 0/1 随机码元 figure(1) stem(0:numPlot-1, x(1:numPlot), bx); % 只画前 15 个码元的杆图 title(二进制随机序列) xlabel(Time); ylabel(Amplitude);注意randsrc的第三个参数是符号表[0:M-1]表示输出符号只会从 0 和 1 里取输出是numSymb x 1的列向量这是为了让后面dmod把每个元素当作一个码元处理。stem画的是离散杆图适合表现数字序列如果换成plot会把每个码元连成阶梯线看起来反而不直观。这里只取前 15 个码元来画是因为 25 个码元全画出来太密杆与杆会挤在一起看不出 0/1 的切换过程。numPlot在脚本里定义为 15它同时控制后面调制波形时域图的长度保证图和图之间看的码元范围一致。3.2 键控法调制dmod 的 fsk 模式到底做了什么调制是整套系统最核心的一步。dmod是通信工具箱的数字带通调制函数指定fsk模式后它内部会把输入序列中的 0 映射到载频Fc把 1 映射到载频Fcdf逐码元拼接出一段连续的已调波形。这个映射过程就是键控法码元切换处频率直接跳变相位不要求连续。Fc 10; % 载频 f1单位 Hz Fs 40; % 系统采样频率单位 Hz Fd 1; % 码速率单位 bps df 10; % 两个载频的间隔f2 Fc df 20 Hz y dmod(x, Fc, Fd, Fs, fsk, M, df); % fsk 键控调制 numModPlot numPlot * Fs; % 15 个码元对应的采样点数15*40600 t (0:numModPlot-1) / Fs; % 时间轴单位秒 figure(2) plot(t, y(1:length(t)), b-); axis([min(t) max(t) -1.5 1.5]); title(调制后的信号); xlabel(Time); ylabel(Amplitude);这里有一个容易被忽略的换算numModPlot numPlot * Fs 15 * 40 600它表示画前 15 个码元的已调波形需要取 600 个采样点。时间轴t用右除/Fs得到单位是秒所以横轴范围是 0 到 15 秒对应 15 个码元、每个码元持续 1 秒。把axis的纵轴固定在 -1.5 到 1.5是为了让波形在屏幕上有足够的上下留白否则余弦波的峰谷会贴着图边界频率切换的细节看不清。参数层面df的作用要重点体会它决定 2FSK 两个载频的间隔也就是频谱上两根谱线的距离。df10意味着 f110Hz、f220Hz间隔非常大接收端用带通滤波器分路时余量很足不容易串路。如果把df改小到 3两个频率分量会部分重叠带通滤波器很难完全分离解调误码率会明显上升。课程设计里df取 10 是比较保守且稳妥的选择。3.3 加性高斯白噪声awgn 的 SNR 为什么不能直接填 60调制完就要过信道。AWGN 信道在 MATLAB 里最常用的实现是awgn函数但这里有个非常容易踩坑的换算关系。脚本里定义SNRpBit60不是直接把 60 填进awgn而是做了一串折算。SNRpBit 60; % 每比特信噪比设定值 SNR SNRpBit / log2(M); % M2 时每比特信噪比等于符号信噪比 randn(state, seed(2)); % 固定噪声种子保证每次运行结果一致 y awgn(y, SNR - 10*log10(0.5) - 10*log10(N), measured, [], dB);为什么不能直接填 60因为awgn函数里的 SNR 参数定义是“信号总功率与带内噪声总功率之比”而 2FSK 信号在频域上是双边谱实际信息能量只集中在一个边带上白噪声却是均匀铺在整个采样带宽上的。10*log10(0.5)是单边谱折算10*log10(N)是采样带宽折算两项都要从名义 SNR 里扣掉噪声功率才能和信号带宽严格对应。如果不扣这两项注入的噪声会偏小误码率曲线整体右移看起来“性能比理论还好”实际是错的。randn(state, seed(2))是老版 MATLAB 固定随机数种子的标准写法作用是让每次运行加噪时都使用同一组噪声样本这样前后两次仿真的差异只来自算法本身而不是随机性。课程设计环境是 MATLAB 7.0这套写法没问题新版 MATLAB 里randn的状态控制建议改用rng(seed(2))但输出波形不会有什么区别。measured参数表示加噪前先实测输入信号功率再根据这个实测值计算噪声方差能消除信号功率估算偏差。加完噪之后一定要先画图看一眼确认噪声幅度没有把信号完全淹没再做解调。4. 两种解调一次跑完ddemod、误码率统计与眼图验证调制和加噪完成之后信号进入接收端。这套工程最值钱的部分在于相干解调和非相干解调共用同一个解调函数只是参数串不同两条路径的误码率对比一目了然。分析完这一章你就知道课程设计里的眼图、原序列比较图、误码率统计分别是怎么来的以及simbasebandex这个函数为什么画出来的曲线和你的系统实际误码率对不上。4.1 相干解调fsk/eye 模式输出判决序列相干解调的关键在于“先分路再相乘再低通最后抽样判决”。ddemod的fsk/eye模式把这四步封装好了同时输出带有波形过渡过程的判决序列方便直接和原码元对比。z1 ddemod(y, Fc, Fd, Fs, fsk/eye, M, df); % 默认相干解调 figure(5) stem(0:numPlot-1, x(1:numPlot), bx); % 原序列蓝色 x hold on; stem(0:numPlot-1, z1(1:numPlot), ro); % 解调序列红色 o hold off; axis([0 numPlot -0.5 1.5]); title(相干解调后的信号与原序列比较); legend(原输入二进制随机序列, 相干解调后的信号); xlabel(Time); ylabel(Amplitude);fsk/eye模式返回的z1是逐采样点的判决数据长度和调制信号一致所以拿去和原始序列x对比时只需要看每个码元起始位置的对应点。这里用stem叠加两种标记蓝色叉是发送端红色圈是解调端哪个位置两者不一致就是解调出错的码元。在信噪比充足的情况下红色圈应该完全压在蓝色叉上。axis([0 numPlot -0.5 1.5])把横轴限制在 0 到 15、纵轴限制在 -0.5 到 1.5是因为判决输出只有 0 和 1 两个电平留一点垂直余量能让 0 和 1 的杆不贴上边界。这里要顺便说明一个容易混淆的点ddemod还有一种不带/eye的fsk模式返回的是每个码元一个判决电平的压缩序列长度比带/eye的版本短很多。两者都能得到误码率但带/eye的版本保留了波形级信息画眼图、画码元对比图都更方便。课程设计里用fsk/eye是有意的不只是为了好看而是让结果可视化更直观。4.2 非相干解调同一个函数换个签名非相干解调和相干解调在ddemod里只差一个/noncoh后缀。它内部走的是带通滤波 包络检波 抽样判决的路径不需要本地载波相乘自然也不依赖载波相位同步。z2 ddemod(y, Fc, Fd, Fs, fsk/eye/noncoh, M, df); figure(7) stem(0:numPlot-1, x(1:numPlot), bx); hold on; stem(0:numPlot-1, z2(1:numPlot), ro); hold off; axis([0 numPlot -0.5 1.5]); title(非相干解调后的信号与原序列比较); legend(原输入二进制随机序列, 非相干解调后的信号);在课程设计的参数下SNR 很高、25 个码元相干和非相干的判决输出通常都能对上原序列肉眼很难看出差别。真正的差异要到低信噪比区域才显现相干解调用乘法器和低通滤波器压制了带外噪声判决裕量更大非相干解调的包络检波器在噪声大时包络会起伏靠近判决门限的点容易翻错。理论上相干 2FSK 误码率0.5*erfc(sqrt(EbN0/2))在中等信噪比下就低于非相干的0.5*exp(-EbN0/2)信噪比越高差距越明显。写报告的时候建议把两个解调结果画在同一张图上对比而不是分开两张。做法是z1和z2都用红色圈一个用ro一个用rs图例里写清楚。这个对比图比单独画两张更能说明“相干解调性能优于非相干”这个结论。4.3 symerr 统计与 simbasebandex为什么你的误码率图只有一个点误码率统计用的是symerr这个函数直接比较两个序列返回错误码元数和误码率。课程设计脚本里先对相干解调结果做统计再对非相干结果做统计然后调用simbasebandex画图。[errorSym, ratioSym] symerr(x, z1); % errorSym 是错误码元数ratioSym 是误码率 figure(8) simbasebandex([0:1:5]); % 独立基带仿真演示 title(相干解调后误码率统计); [errorSym2, ratioSym2] symerr(x, z2); figure(9) simbasebandex([0:1:5]); title(非相干解调后误码率统计);这里有个大坑simbasebandex是通信工具箱里一个独立的基带仿真演示函数它有自己内部的信号源、调制方式和误码率计算逻辑跟你当前系统的信噪比设置没有任何数据通路。换句话说你在外面把SNRpBit从 60 改成 10simbasebandex画出来的曲线一点都不会变它那个点跟你的 2FSK 系统毫无关系。很多同学在这里困惑“为什么我改了参数误码率还是老样子”原因就在这。课程设计把它放在这里本意是演示误码率曲线的样子但用它来验证自己的系统性能是错误的做法。要得到真正属于你自己系统的误码率曲线必须自己写循环对每个目标信噪比重新加噪、重新解调、重新调用symerr把每一个误码率点收集起来再画图。课程设计里 25 个码元只能说明流程跑通要画平滑曲线至少需要几千到上万个码元。这部分我在第 6 章给出完整的蒙特卡洛脚本。先记住一个结论symerr算误码率是对的simbasebandex当参考图可以但不能当自己的仿真结果。眼图部分同样值得解释。脚本里用eyediagram(yo2, N)画的是经过升余弦滤波后的眼图N40说明眼图以码元为单位横轴一个周期覆盖 40 个采样点。眼图的“眼睛”张开越大说明码间串扰越小“眼睛”越模糊说明噪声或者滤波器畸变越严重。2FSK 的眼图有两个频率段的轨迹叠加看起来比 2ASK 要复杂但只要能看到清晰的张开轮廓信道质量就有保证。5. 避坑手册五个让我反复返工的 2FSK 仿真问题课程设计正文里有一段“程序调试”记录了几个真实翻车点调制波形不完整、滤波器失真、抽样判决不会实现、误码率模块报错。这些坑我在复现时几乎原样踩了一遍下面按“现象 → 原因 → 解决”逐条展开。这些记录比仿真结果本身更值钱因为每一条都能帮你少折腾一个通宵。5.1 现象载波波形在半截处断裂根本凑不成完整周期现象画出调制信号后发现某些码元内的余弦波形在中间断掉或者一个码元内只画了 8.5 个周期看起来像锯齿拼接。把时间轴放大能看到波形的零点位置对不齐。原因载频与码速率不成整数倍。具体来说Fc/Fd不是整数一个码元持续时间内无法容纳整数个载波周期波形必然在码元边界处被硬生生截断。课程设计调试记录里写“振荡器的频率 f1 和 f2 需要为 pi 的倍数”翻译成工程语言就是先检查Fc/Fd是否整除再检查Fs/Fd是否整除。这两个整除关系是 2FSK 波形干净的前提。解决把参数固定为Fc10、Fd1、Fs40先手工验算N Fs/Fd 40是整数Fc/Fd 10是整数两个条件都满足再继续。如果改了Fc或Fd一定要重新验算这两组整除关系而不是只改一个数就跑。5.2 现象带通滤波器输出波形毛刺多包络明显失真现象在 Simulink 里做带通滤波时输出波形边缘有大量毛刺包络形状和理论值差很多。MATLAB 代码里用rcosine和rcosflt做升余弦滤波时也出现过滤波后波形和原始波形对不齐的情况。原因带通滤波器的上下限频率设置太贴近 f1 或 f2过渡带太陡滤波器阶数又不够导致频带边缘的相位响应发生畸变。Simulink 里的带通滤波器模块默认参数对 2FSK 这种两个离散频率分量并不友好直接把通带设成刚好包住 f1 或 f2反而把滤波器自身的振铃也放了出来。解决给带通滤波器留过渡带余量。比如 f110Hz 这一路通带可以设成[9.5, 10.5]再往外留一点过渡带而不是[10, 10]这种理想化的窄带。代码实现里用升余弦滤波器rcosine(Fd, Fs, fir, R, Delay)滚降系数取R0.5延时取 3 个码元先成形滤波再做眼图可以有效压掉带外噪声。我一般会先跑一把不带噪声的干净信号确认滤波后波形没有明显畸变再往信道里加噪声这样能分清失真到底是滤波器引入的还是噪声引入的。5.3 现象抽样判决不知道如何下手判决时刻怎么取现象解调链路做到最后一步低通滤波器输出已经出来了但不知道该怎么把模拟波形变成 0/1 序列。教材上的抽样判决器画成一个方框输入有“抽样脉冲”代码里完全不知道这个脉冲从哪来。原因教科书把“抽样脉冲”讲成一路信号输入但数字实现里它本质是一个位置索引不是一个真正的脉冲序列。低通滤波输出是连续的波形你需要做的只是在每个码元的中间位置取一个采样点把这个点的电压和判决门限比较大于门限判 1小于门限判 0。解决ddemod的fsk/eye模式已经内置了抽样判决你不用自己写。如果一定要手动实现做法是把解调输出按NFs/Fd40个采样点一组分组每一组取中间点第 20 个采样点与 0.5 比较大于 0.5 判 1否则判 0。这个“码元中点抽样”是通信仿真的通用约定因为码元边界的过渡态最容易误判中点位置最稳。5.4 现象symerr 误码率忽高忽低换个随机种子就变现象同一套代码第一次运行误码率是 0第二次运行变成 0.04第三次又变成 0。明明参数没动结果却不稳定写报告时根本不知道该填哪个数。原因numSymb25的样本量太小统计方差太大。25 个码元里只要错 1 个误码率就是 4%错 2 个就是 8%。这完全不是系统真实性能的稳定估计。课程设计用它来演示流程没问题但拿它当性能分析结果会很难看。解决做误码率统计时把码元数量级提到上万。比如numSymb20000在误码率 1e-3 量级时大约能统计到 20 个错误码元曲线才勉强平滑。别忘了固定随机种子randn(state, seed(2))否则两次仿真之间噪声样本不同结果差距会被样本量小放大得更厉害。每次报告里的数据都要写上“本次仿真码元数 N20000随机种子明确”否则别人没法复现你的数字。5.5 现象simbasebandex 画出的误码率曲线和你的 SNR 设置毫无关系现象在代码里把SNRpBit从 60 改成 10重新运行simbasebandex的图一点变化都没有。误码率曲线仍然是从左到右下降的一条标准曲线但你的系统在 10dB 下明明应该已经有错误了。原因如 4.3 节所说simbasebandex是独立运行的基带仿真演示它内部有自己的一套信号参数和误码率统计不会读取你当前工作区里的snr或SNRpBit变量。它和你正在做的 2FSK 系统唯一的共同点是都叫“误码率”数据上完全没有关联。解决彻底抛弃用simbasebandex验证系统性能的想法改成自己写蒙特卡洛循环。外层循环遍历信噪比列表内层对每个信噪比重新加噪、解调、调symerr统计把所有误码率点收集起来用semilogy画。这就是下一章要做的事。这五条坑有一个共同点它们都不是算法本身的错而是参数配套和工具边界没搞清楚。把这五关过了2FSK 仿真链路你基本就吃透了。6. 把误码率曲线画得和教材一致理论公式与蒙特卡洛验证课程设计最后要交一张 SNR-误码率曲线图。教材上的曲线是一条平滑下降的单调曲线但直接跑课程设计原代码你只能得到一个孤零零的点。要画出真正的性能曲线需要把理论公式和蒙特卡洛仿真结合到一起。6.1 理论曲线两行公式得到参照EbN0dB 0:1:12; % 横轴每比特信噪比单位 dB EbN0 10.^(EbN0dB / 10); % 换成线性值 ber_coh 0.5 * erfc(sqrt(EbN0 / 2)); % 相干 2FSK 理论误码率 ber_noncoh 0.5 * exp(-EbN0 / 2); % 非相干 2FSK 理论误码率 figure(11) semilogy(EbN0dB, ber_coh, b-, EbN0dB, ber_noncoh, r--); grid on; legend(相干2FSK理论, 非相干2FSK理论); xlabel(Eb/N0 (dB)); ylabel(Bit Error Rate);erfc是互补误差函数相干 2FSK 的误码率公式0.5*erfc(sqrt(EbN0/2))在主流通信原理教材里都能找到。非相干的0.5*exp(-EbN0/2)是包络检波在高信噪比下的近似式。两条曲线都画出来作为仿真结果的对照基线。6.2 仿真曲线加大样本量跑蒙特卡洛numSymb 20000; % 仿真码元数量级要够 x randsrc(numSymb, 1, [0:M-1]); % 重新生成长序列 y0 dmod(x, Fc, Fd, Fs, fsk, M, df); % 调制一次后续循环复用 for k 1:length(EbN0dB) % 每个信噪比都要重新加噪 yk awgn(y0, EbN0dB(k) - 10*log10(0.5) - 10*log10(N), measured, [], dB); zc ddemod(yk, Fc, Fd, Fs, fsk, M, df); % 相干解调 [~, ber_coh_sim(k)] symerr(x, zc); znc ddemod(yk, Fc, Fd, Fs, fsk/eye/noncoh, M, df); % 非相干解调 [~, ber_noncoh_sim(k)] symerr(x, znc); end figure(12) semilogy(EbN0dB, ber_coh_sim, o-, EbN0dB, ber_noncoh_sim, s--); grid on; legend(相干2FSK仿真, 非相干2FSK仿真); xlabel(Eb/N0 (dB)); ylabel(Bit Error Rate);关键点有两个。第一y0只调制一次循环里每次加噪都从同一个干净信号出发这样不同信噪比之间的差异完全来自噪声强度而不是调制波形的随机差异。第二awgn里的参数EbN0dB(k) - 10*log10(0.5) - 10*log10(N)必须和理论曲线的横轴保持同一个信噪比定义否则仿真曲线和理论曲线在图上会整体错位。这里的ber_coh_sim和ber_noncoh_sim在低信噪比区域会明显波动这是正常的蒙特卡洛统计噪声样本量越大曲线越贴理论。6.3 验证技巧曲线贴合理论但高信噪比出现“地板”仿真曲线和理论曲线对照时如果低信噪比贴合良好、高信噪比区域误码率不再下降形成一个“地板”说明系统里有固定误差源最常见的是滤波器带宽不够或者加噪公式折算错误。检查顺序是先看awgn的折算项有没有漏再看NFs/Fd是否和eyediagram的眼图张开度一致最后把升余弦滤波器的滚降系数R0.5、延时Delay3逐个试一遍。课程设计里rcosine那段代码的用途就是把带外噪声滤掉如果它和ddemod之间的延时对不齐眼图会倾斜高信噪比误码率会偏高。从那以后我每次拿到通信仿真工程第一件事不是急着跑而是先把三个整除关系写在脚本头部注释里再把信噪比折算公式单独抽出来写成一行备注。这样无论后面换 2ASK、2PSK 还是 QPSK思路都通用坑也少一大半。这套 2FSK 的源码你按“信源 → 调制 → 信道 → 解调 → 统计 → 滤波”的顺序一段段复现每一段都先看波形再进下一步就能完整跑通整个链路。希望帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →