
简介MFSK多进制频移键控作为数字通信常用调制方式其频谱效率、误码率及频谱特性是评估系统性能的重要依据。这份仿真资源面向通信专业学生、科研人员及算法验证工程师以完整工程形式演示基于 Matlab 的 MFSK 性能分析流程。压缩包内共 3 个文件包含可运行的 runme.m 主程序执行仿真并绘图、操作演示 avi 视频逐步展示运行步骤与工程路径配置以及 fpga 与 matlab 联调说明 txt整体仅 743KB轻量便于下载。当前已有 598 人学习使用适合快速复现典型实验。借助代码可直观得到误码率曲线、频谱占用和频谱效率变化结合视频可规避环境配置问题说明文件还补充了相关设计思路与注意事项可作为课程设计、毕业设计或项目预研的参考脚本方便二次开发与教学演示。1. MFSK的频谱效率与误码率MATLAB仿真能给出什么结论在没有看仿真结果之前很多人会以为M进制数越大MFSK的带宽利用率越高。实际算下来在最小非相干正交间隔下4FSK的频谱效率就已经到顶8FSK、16FSK的bit/s/Hz反而一路走低换来的是抗噪性能持续提升。这个“带宽换误码率”的交换关系正是MFSK在深空通信、水声通信和低速遥测里仍然有位置的原因。MATLAB仿真在这类问题里的价值不是把教科书公式再背一遍而是把频谱占用、误码率曲线和信号波形放在同一套参数下观察。调制指数h从1改成0.5会怎样成形滤波器加不加差多少蒙特卡洛点数不够时曲线为什么抖这些只有跑起来才能直观回答。这篇文章按常见流程展开先建立信号模型并算频谱效率再写误码率蒙特卡洛代码然后用pwelch做频谱测量最后把脚本整理成可录制演示视频的形式。适合准备课程仿真、物理层评估或毕业设计的读者。2. MFSK信号模型与频谱效率的理论计算2.1 MFSK的符号定义与正交性条件MFSK把每k log2(M)个比特映射成M个载频之一M个符号波形统一写成s_m(t) sqrt(2 * Es / Ts) * cos(2 * pi * (fc m * df) * t)m 0, 1, ..., M-1其中Es是每符号能量Ts是符号周期df是相邻两个符号的频差。仿真里一般取基带等效模型fc设为0只保留相对频率 m * df方便直接在实数域生成波形和加噪。df的取值决定MFSK是不是正交的。非相干检测时正交条件要求df n / Ts最小间隔是df 1 / Ts相干检测时最小间隔可以压到df 1 / (2 * Ts)。原因很直接非相干接收端不知道载波初始相位相关积分必须正好覆盖整数个频率周期才能保证不同符号间的积分结果为0相干检测因为有本地载波相位对齐半个周期的相位差就足以把相关峰区分开。工程上习惯用调制指数h描述这个间隔df h * RsRs 1 / Ts所以h 1对应非相干最小正交间隔h 0.5对应相干最小正交间隔。MATLAB仿真里最容易犯的错是把h设成任意值还当正交用解调误码率会整体抬高一块。先确认检测方式是相干还是非相干再倒推h比直接抄参数靠谱。2.2 频谱效率公式为什么4FSK反而是极大值MFSK的已调信号占用带宽可以用工程近似BW (M - 1) * df 2 * Rs第一项是M个频率的跨度第二项是单个符号脉冲的主瓣扩展。把df h * Rs代入再除以比特速率Rb Rs * log2(M)得到频谱效率eta log2(M) / ((M - 1) * h 2)这个公式能直接解释很多直觉错误。以非相干最小间隔h 1为例M 2时的eta是1 / 3 0.333 bit/s/HzM 4时达到2 / 5 0.4M 8时回到3 / 9 0.333M 16时只有4 / 17 0.235。MFSK的频谱效率不是随M单调上升而是在M 4附近封顶之后每翻一倍进制数带宽近似线性增长比特率却只增长一个比特。这就是标题里“频谱效率”最需要被仿真理清的点。把h 0.5的相干情况也放进来对比结论会更完整M非相干h1理论谱效 (bit/s/Hz)相干h0.5理论谱效 (bit/s/Hz)误码率随Es/N0的走势20.3330.400基线40.4000.571显著优于2FSK80.3330.615继续优于4FSK160.2350.545高频谱效率回落误码率走势这一列先说明结论来源M增大时符号间的最小欧氏距离拉开但每符号携带信息也变多。后面的蒙特卡洛仿真会量化这个差异。实际工程里如果链路预算紧张会优先选M 8或M 16的非相干MFSK宁可多占带宽也不让误码率失控如果带宽受限则要把M压到4以下。这些取舍用MATLAB做一张eta对比曲线比背结论清楚得多。2.3 参数化脚本把带宽预算写进代码仿真第一段建议先把所有可调参数集中定义并顺手把理论带宽和频谱效率算出来后续所有模块都引用这套参数避免改M时漏改其他常量。%% MFSK 参数初始化 M 4; % 进制数可选 2,4,8,16 k log2(M); % 每符号比特数 h 1; % 调制指数1为非相干最小正交间隔 Rs 1000; % 符号速率 (Baud) Ts 1 / Rs; % 符号周期 (s) fs 16 * Rs; % 采样率每个符号采16个点 Nsym 100000; % 蒙特卡洛仿真的符号数 df h * Rs; % 相邻符号频率间隔 (Hz) BW (M - 1) * df 2 * Rs; % 占用带宽估计 (Hz) eta Rs * k / BW; % 频谱效率 bit/s/Hz fprintf(M%d, h%.2f, BW%.1f Hz, eta%.3f bit/s/Hz\n, ... M, h, BW, eta);参数说明里最值得强调的是采样率fs和符号速率Rs的比值。每个符号16个采样点意味着最大可表示的频偏是fs / 2 8 * Rs。当M 16、h 1时最大频率是15 * Rs直接超过奈奎斯特边界波形会混叠。遇到这种情况要把过采样倍数提到32甚至64或者改用复基带模型。fs不是越大越好它同时决定阵列表长度和仿真耗时代码里用16倍起步跑通后再根据频谱图决定是否加密。3. 误码率蒙特卡洛仿真与理论曲线对照3.1 公式选择非相干MFSK的误符号率非相干正交MFSK的误符号率有闭式解Ps sum_{i1}^{M-1} [(-1)^(i1) * C(M-1, i) / (i1) * exp(-i * k * EbN0 / (i1))]注意这里的EbN0是线性值不是dB。Es k * Eb公式中的k * EbN0实际是Es/N0。当M较大时这个求和涉及符号交替的项浮点误差会被放大建议用vpa高精度算理论值或者只画到M 16以下。误比特率没有同样简洁的闭式常见做法是用误符号率近似换算Pb ≈ Ps * M / (2 * (M - 1))这个换算默认符号错误等概率落到其他M-1个符号上对非格雷编码的MFSK是合理近似。如果仿真里做了格雷映射误码率会略低于这个近似值需要在代码注释里注明。3.2 蒙特卡洛仿真主程序与参数说明%% 生成M个正交符号模板 nspb round(fs * Ts); % 每符号采样点数这里等于16 t (0:nspb-1) / fs; % 一个符号内的采样时刻 Es 1; % 符号能量归一化为1 tmpl zeros(M, nspb); for m 0:M-1 tmpl(m1, :) sqrt(2 * Es / Ts) * cos(2 * pi * m * df * t); end %% 发送符号序列并拼成连续波形 tx_symbols randi([0, M-1], 1, Nsym); tx_wave reshape(tmpl(tx_symbols 1, :), [], 1); %% 误码率扫描 EbN0_dB_list 0:2:14; ber_sim zeros(size(EbN0_dB_list)); for idx 1:length(EbN0_dB_list) EbN0_lin 10^(EbN0_dB_list(idx) / 10); N0 Es / (k * EbN0_lin); % 由符号能量反推噪声谱密度 noise sqrt(N0 / 2) * randn(size(tx_wave)); rx_wave tx_wave noise; rx_sym reshape(rx_wave, nspb, []); % 每列是一个符号 corr tmpl * rx_sym; % M x Nsym 相关输出 [~, hard] max(corr, [], 1); err sum((hard - 1) ~ tx_symbols); ber_sim(idx) err / Nsym / k; % 转成比特错误率 end这段代码里最核心的一行是corr tmpl * rx_sym。tmpl是M行、每行一个符号波形rx_sym的每一列是一个接收符号矩阵乘法一次完成M个相关器的并行积分输出第(m, n)个元素就是第m个模板与第n个接收符号的相关值。max沿第一维取最大值所在行行号减1就是判决符号。整个解调器没有显式的for循环速度比逐个符号相关快很多。噪声功率推导逻辑是这样的先由当前扫描的EbN0反推N0噪声方差为N0 / 2这是匹配滤波器输出端的噪声功率密度再乘上randn生成的单位方差序列就得到正确的加性白高斯噪声。如果直接把randn乘一个固定的幅度误码率曲线会整体右移和理论对不上。3.3 曲线抖动处理与错误率下界误码率仿真跑出来的点不会平滑地贴在理论曲线上Nsym 100000时10^-3附近的点通常有±10%的随机起伏。分两种情况处理误码率高于10^-2时统计量充足直接看仿真点低于10^-4时至少要跑10^6个符号否则一个错误比特都没有的发生概率很高曲线尾部会突然断掉。另一个经验是每个信噪比点用不同的随机种子重跑几次取平均比单次加大Nsym更能暴露实现上的bug。这里的“实现bug”最常见的是频偏不满足正交条件、噪声方差算错、以及模板能量未归一化。把仿真点和理论曲线叠画在一起就能看出来如果低信噪比对齐、高信噪比偏离多半是正交性破坏或数值精度如果整体右移优先检查N0和Es的换算。4. 频谱观测、带宽测量与频谱效率的实测换算4.1 用pwelch画出不同M下的频谱叠加算理论带宽是一回事从生成的波形里测出占用带宽是另一回事。周期图法对矩形包络MFSK的频谱泄漏很敏感直接fft出来的谱线旁瓣很高看不出主瓣边界。用pwelch加汉宁窗做Welch平均谱线平滑得多。%% 功率谱密度估计 nfft 4096; win hann(nfft); [psd, f] pwelch(tx_wave, win, nfft * 3/4, nfft, fs, centered); psd_dB 10 * log10(psd / max(psd)); %% 绘制归一化频谱叠加理论带宽边界 figure; plot(f, psd_dB, LineWidth, 1.2); xline(-BW/2, --r); xline(BW/2, --r); xlabel(频率 (Hz)); ylabel(归一化功率谱密度 (dB)); title(sprintf(%dFSK 频谱, h%.1f, 理论带宽 %.0f Hz, M, h, BW)); grid on;pwelch的参数依次是数据、窗函数、重叠长度、FFT点数和采样率。重叠设成nfft * 3/4可以减少窗边缘损失让频谱估计方差更小。centered选项让频率轴以0为中心便于和理论带宽边界对比。代码里的两条竖线是2.3节算出的BW边界如果实测频谱主瓣超出这个范围说明参数脚本里的带宽估算是低估的。4.2 从功率累积谱测量占用带宽更工程化的做法是不依赖肉眼读数直接计算占用带宽。先把功率谱密度归一化成累积功率找到包含99%功率的频率范围这个范围比-3dB带宽更接近实际信道分配时用的占用带宽。%% 99%功率占用带宽计算 p psd / sum(psd); % 归一化功率 cdf_p cumsum(p); % 累积功率 idx_low find(cdf_p 0.005, 1); % 下边界累积到0.5% idx_high find(cdf_p 0.995, 1); % 上边界累积到99.5% B_occ f(idx_high) - f(idx_low); eta_measured Rs * k / B_occ; % 实测频谱效率 fprintf(99%%占用带宽%.1f Hz, 实测频谱效率%.3f bit/s/Hz\n, ... B_occ, eta_measured);之所以用0.5%和99.5%做边界是因为矩形包络MFSK的频谱旁瓣衰减慢如果从1%算到99%结果会受旁瓣长度的显著影响。把边界收紧到0.5%测出来的B_occ和理论BW更接近也更符合实际接收机前端滤波器的通带设计。这里测出的eta_measured通常比理论值低5%到15%差异主要来自理论BW公式的第二项2 * Rs是对主瓣的简化估计。4.3 M与调制指数h对实测带宽的影响把M 2、4、8、16的频谱叠在一张图里能看出一个明显的趋势M翻倍频谱的主瓣宽度近似线性增加但谱峰数量也变多。M较大时相邻符号频率间隔不变的情况下整体频谱更像一个平坦的台座M较小时频谱更接近两簇分离的谱线。这个形态直接决定接收端带通滤波器的阶数选择。h的调整同样在频谱上看得清清楚楚。h从1降到0.5M个频率的跨度缩短一半占用带宽明显变窄但前提是检测方式改成相干。非相干检测下强行把h降到1以下频谱效率会短暂上升误码率曲线却出现错误平台信噪比再高也压不回去。判断平台原因有个技巧把调制端和解调端放在同一个频率误差下观察如果误码率平台随Es/N0增大完全不动基本可以断定是非正交引入的符号间干扰而不是噪声问题。5. 把仿真脚本组织成可演示的操作视频5.1 脚本结构数据生成、仿真、绘图分离这类带演示视频的仿真资料录制的痛点往往不是代码跑不动而是脚本结构太乱。我一般会把工程拆成三个.m文件mfsk_params.m只定义参数mfsk_sim.m跑误码率并把结果存成.matmfsk_plot.m读取.mat后画图。这样录屏时可以随时修改参数重跑第一部分不用从头滚动代码视频节奏也不会拖沓。5.2 用drawnow做出扫频动画直观展示参数变化演示MFSK频谱时静态曲线不如动画有说服力。在循环里逐次修改h或M每算完一帧就调用drawnow刷新坐标区就能看到频谱从紧凑到展开的动态过程。动画代码的核心是set更新曲线句柄而不是每次循环重绘整个figure这样可以避免闪烁录屏出来后也清晰。5.3 演示前必须做的三组验证录制前至少验证三件事误码率仿真曲线在低信噪比段和高信噪比段都覆盖到理论曲线附近占用带宽的数字和理论公式相差不超过15%M 2时程序退化成BFSK结果和教科书BFSK曲线重合。这三组验证通过后再去谈录屏软件的分辨率、帧率和鼠标操作节奏否则视频越精致错误越显眼。蒙特卡洛次数到10^6后误码率置信区间会收到±0.1dB以内这时录下来的曲线才经得起细看。本文还有配套的精品资源点击获取