ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

二进制数字调制与MATLAB仿真:2ASK/2FSK/2PSK从原理到误码率曲线

2026/9/1 14:53:52 拓冰建站 浏览量
二进制数字调制与MATLAB仿真:2ASK/2FSK/2PSK从原理到误码率曲线 简介本资源面向通信工程专业本科生、数字信号处理初学者及MATLAB实践者聚焦二进制数字调制核心原理与仿真验证解决理论抽象难理解、调制类型易混淆、MATLAB实现无从下手等典型学习痛点。压缩包含3个MATLAB脚本文件.m总大小仅2KB轻量精炼其中主程序binarymod.m实现ASK/FSK/PSK三种调制与解调全流程T2F.m完成时域到频域转换支撑频谱分析sigexpand.m用于信号升采样与波形展宽保障可视化质量。已有433人学习下载代码结构清晰、注释完整覆盖二进制序列生成、载波调制、AWGN信道加噪、匹配滤波解调及误码率评估等关键环节可直接运行观察眼图、星座图与BER曲线是理解数字通信基础调制技术的高效实践入口。 通信原理这门课里二进制数字调制2ASK、2FSK、2PSK往往是很多人第一次真正接触调制到底在干什么的起点。我当年学的时候书上公式背得滚瓜烂熟但仿真一跑波形、频谱、误码率全对不上折腾了一整天才搞明白是信噪比定义错了。这篇东西就是把我做二进制数字调制及MATLAB仿真时踩过的坑、用顺手的代码框架、以及判断结果靠不靠谱的经验写出来。适合正在学通信原理的学生、考研准备复现知识点的朋友以及刚接触软件无线电、需要快速搭一套链路验证算法的工程师。不管你是哪种看完至少能自己跑出一张能跟理论曲线对上的BER图。1. 三种基础调制方式从信号模型看懂2ASK、2FSK、2PSK的本质区别1.1 为什么必须先把数字调制这件事拆清楚很多人上来就写代码结果连发的是什么波形都不清楚。我建议先想明白一个问题为什么要调制基带数字信号是0和1的电压序列频率成分集中在低频附近直接通过天线发射效率极低而且无线信道是带通型的低频信号根本传不出去。数字调制干的事情就是把二进制符号搬到某个高频载波上用载波的幅度、频率或相位来区分0和1。这一步之后信号才能在带通信道里传输。这三种基础调制方式本质区别就是信息藏在载波的哪个参数里。幅度变化的是2ASK频率变化的是2FSK相位跳变的是2PSK。把这一点刻在脑子里后面所有高阶调制QAM、OFDM都能顺着这个思路理解。仿真也一样先分清你到底在改哪个参数代码才不会写成一锅粥。1.2 2ASK最直观的开关调制2ASK的表达式很直白s(t) m(t) · A·cos(2πf_ct)其中m(t)是单极性NRZ波形发1时等于1发0时等于0。所以2ASK其实就是有载波和没载波两种状态也常被称为OOKOn-Off Keying。这个调制方式最直观也最好理解。我后来做光通信仿真的时候发现很多光发射机的调制本质上就是OOK激光器发光代表1不发光代表0。大家的生活里也有类似例子手电筒快速开关对面的人通过亮灭判断信息。仿真中生成2ASK特别简单直接用0/1序列乘上余弦载波就行。但要注意因为2ASK在发0时信号为零接收端在判决时需要一个阈值通常取载波幅度的一半所以它的抗噪声能力天然弱于两个信号等幅对称的调制方式。这个特点在误码率曲线上会看得很清楚。1.3 2FSK把0/1写成两个频率2FSK用两个不同频率的载波分别代表0和1s(t) A·cos(2πf_1t)发1时s(t) A·cos(2πf_0t)发0时频率不同幅度不变这就是频率调制。两个频率之间的间隔Δf |f_1 - f_0|不是随便取的它直接影响两个信号的正交性和带宽。工程上经常要求Δf 1/T_b的整数倍T_b是一个码元持续时间这样两个频率在相关解调时能保持正交互不干扰。我仿真时习惯用8kHz和12kHz代表0和1码元速率1kHzΔf 4kHz 4/T_b正交性没问题频谱上也能清楚看到两个峰。有个容易忽略的点2FSK有相位连续和相位不连续之分。如果每个码元独立生成余弦波形码元切换处相位可能突变这会使频谱出现明显的旁瓣。蓝牙里用的GFSK就是通过高斯滤波整形让频率平滑切换从而压窄频谱。仿真里为了简单一般直接做相位不连续的2FSK但如果你发现频谱旁瓣很大不要以为是bug这就是相位不连续的代价。1.4 2PSK效率最高的二相调制2PSK的表达式用双极性信号s(t) ±A·cos(2πf_ct)发1时载波相位是0发0时载波相位是π也就是相位反转180°。2PSK可以看成把原来的余弦载波正着用和倒着用信息量藏在相位里。从信号空间的距离来看2PSK的两个符号分别位于星座图的1和-1距离是2√E_b归一化后而2ASK的两个点是0和1距离只有√E_b。距离越大抗噪声能力越强。所以理论上2PSK比2ASK有3dB的性能增益。这句话很多人背过但真正跑一次仿真曲线之后才算理解同样达到10⁻³误码率2PSK要求的信噪比比2ASK低大约3dB。2PSK还有个著名的坑因为信号关于原点对称接收端如果用相干解调本地载波存在180°相位模糊问题。你不知道锁出来的载波是正确相位还是反了180°这也是后面要做2DPSK差分编码的根本原因。仿真的时候可以做个小实验把本地载波故意写成cos(2πf_ctπ)你会发现解调出来的比特全部取反误码率接近1而不是0.5这点很有意思。1.5 三者性能与带宽对比一张表说清楚调制方式信号模型特点理想带宽通带相干解调误码率AWGN典型应用场景2ASK/OOK幅度键控0/1对应载波通断2R_bP_e≈0.5·erfc(√(E_b/(4N_0)))光通信、射频标签2FSK频率键控0/1对应两个频率|f_1-f_0|2R_bP_e≈0.5·erfc(√(E_b/(2N_0)))早期调制解调器、蓝牙GFSK2PSK/BPSK相位键控0/1对应0°/180°2R_bP_e≈0.5·erfc(√(E_b/N_0))卫星通信、GPS、高速数字传输表格里的公式是理论值也是后面仿真要验证的目标。注意2ASK和2PSK的带宽看起来一样但性能差3dB2FSK因为用了两个频率带宽最宽这是它换来的代价。这个对比关系搞通信的人一定要形成直觉。2. 搭建MATLAB仿真链路从随机比特到误码率曲线的完整流程2.1 参数设计与采样率选取原则仿真的第一件事不是写代码而是定参数。我常用的参数如下建议你直接照抄参数值说明码元速率R_b1000 bit/s每个比特持续1ms采样率F_s100 kHz每个码元100个采样点载波频率f_c10 kHz必须远低于F_s/2且远高于R_b2FSK频率f_0、f_18 kHz、12 kHz保证正交性间隔4kHz仿真比特数N20000~50000太少统计不了低误码率信噪比范围E_b/N_00~10 dB覆盖从完全不可用到低误码区采样率为什么取100kHz而不是刚好2倍载波的20kHz因为仿真里我们不仅要看波形还要做滤波、乘载波、抽样这些操作都需要足够的过采样率。每个码元100个采样点滤波后的波形包络还比较平滑抽样判决点也好找。如果采样率太低抽样点稍微偏一点误码率就会异常升高你还没法判断是算法问题还是采样问题。载波频率f_c取10kHz有个好处跟码元速率1kHz差距够大调制后频谱能明显看到以10kHz为中心的主瓣跟采样率100kHz差距也够大不会出现频谱混叠。要记住一条硬性原则f_c F_s/2并且不小于5~10倍的R_b。2.2 调制器实现代码怎么写最不容易错下面是调制部分的MATLAB代码。核心思路是先把比特序列扩展成NRZ波形每个比特重复100个点再乘载波。%% 参数设置 Rb 1000; % 码元速率 1000 bit/s Fs 100e3; % 采样率 100 kHz spb Fs / Rb; % 每码元采样点数 100 fc 10e3; % 载波频率 10 kHz Nbit 20000; % 发送比特数 EbN0_dB 0:10; % Eb/N0 仿真范围(dB) rng(1); % 固定随机种子结果可复现 bits randi([0 1], 1, Nbit); t (0:Nbit*spb-1) / Fs; % 单极性/双极性NRZ波形 bits_up reshape(repmat(bits, spb, 1), 1, []); uni_up bits_up; % 单极性: 0/1 bip_up 2*bits_up - 1; % 双极性: -1/1 carrier cos(2*pi*fc*t); % 三种已调信号 s_ask uni_up .* carrier; % 2ASK: 1时发载波0时静默 s_psk bip_up .* carrier; % 2PSK: 相位0/pi % 2FSK: 逐码元生成对应频率的波形 s_fsk zeros(1, Nbit*spb); f0 8e3; f1 12e3; for k 1:Nbit seg (k-1)*spb 1 : k*spb; if bits(k) 1 s_fsk(seg) cos(2*pi*f1*t(seg)); else s_fsk(seg) cos(2*pi*f0*t(seg)); end end写这段代码有两个经验第一用repmat和reshape做波形扩展比for循环快很多Nbit到5万也不卡。2FSK因为每个码元频率不同只能用for循环逐段生成但这里循环次数等于比特数只要spb不大速度也能接受。第二载波相位从0开始是没问题的。因为仿真里接收端假设理想同步相位模糊问题先不处理后面专门聊。2.3 AWGN信道信噪比换算与加噪陷阱平时最常犯的错误是把snr和EbN0混为一谈。通信原理里我们习惯用E_b/N_0每比特能量与噪声功率谱密度之比来横轴画BER曲线但MATLAB自带的awgn函数需要的是信噪比SNR信号功率与噪声功率之比。两者必须换算。对实带通信号采样率为F_s信号带宽大约对应F_s/2所以SNR (2·R_b / F_s) · (E_b / N_0)换算成dB就是SNR_dB E_b/N_0(dB) 10·log10(2·R_b / F_s)我推导过很多次直接记住这个式子就行。给一个直观理解每个比特的采样点数越多噪声功率被摊得越宽同样E_b/N_0下每个采样点上的噪声方差相对更小所以SNR会更低。加噪代码SNR_dB EbN0_dB(ii) 10*log10(2*Rb/Fs); r_ask awgn(s_ask, SNR_dB, measured); r_fsk awgn(s_fsk, SNR_dB, measured); r_psk awgn(s_psk, SNR_dB, measured);measured参数的意思是让awgn先测量信号功率再加噪声这样即使你忘记归一化幅度也不会算错噪声功率。我一开始没用这个参数信号幅度是2还是1结果完全不对后来一直用measured省心很多。还有一个容易被忽略的点每个信噪比点都要重新加一次噪声而且最好把随机种子固定这样不同调制方式之间比较时用的是同一套随机噪声曲线对比更公平。如果每次加噪都用默认随机种子三次仿真的噪声完全不同曲线会有额外抖动。2.4 相干解调与低通滤波器的设计相干解调的本质是接收端用同一个载波同频同相乘回来把已调信号搬回基带再用低通滤波器滤掉高频分量最后在码元中点抽样判决。以2PSK为例%% 2PSK相干解调 Norder 64; % 滤波器阶数建议偶数 lpf fir1(Norder, 2*Rb/(Fs/2)); % 低通截止频率设为Rb(Hz) r_coh r_psk .* (2*cos(2*pi*fc*t)); % 乘2倍载波是为了让基带幅度恢复 r_fil filter(lpf, 1, r_coh); delay Norder/2; % 线性相位滤波器群延迟 r_fil r_fil(delay1:end); % 在每个码元中点抽样 sample_idx delay round(spb/2) : spb : delay Nbit*spb; demod r_fil(sample_idx); bits_hat demod 0;几个关键点低通滤波器截止频率取R_b而不是F_s/2是因为基带信号主瓣宽度大约为R_b取R_b能把高频残余和带外噪声滤掉又不至于把基带波形压得太狠。阶数64是经验值再高滤波更陡但延迟更大再低可能滤不干净。r_coh里乘的是2*cos(...)而不是cos(...)。因为cos^2 (1cos2)/2乘2之后基带分量幅度正好恢复成原来的信号幅度判决阈值刚好在0附近方便处理。filter是有群延迟的线性相位FIR滤波器的群延迟正好是阶数的一半32个采样点。如果抽样前不把这32个点补偿掉你取的码元中点实际上是偏移的高信噪比时可能没事低信噪比时误码率会明显异常。这个问题我一定会单独拿出来讲因为太多人栽在它上面。2ASK的相干解调思路完全一样只是判决阈值要从0改成0.5因为信号是单极性一个状态是0另一个状态接近1。2FSK则需要两个支路分别用f0和f1的本地载波相关然后比较两个支路输出的大小%% 2FSK相干解调 r0 filter(lpf, 1, r_fsk .* (2*cos(2*pi*f0*t))); r1 filter(lpf, 1, r_fsk .* (2*cos(2*pi*f1*t))); % 补偿延迟后抽样 d0 r0(sample_idx); d1 r1(sample_idx); bits_hat d0 d1; % 哪个支路输出大就判哪个频率发0时f0支路输出大发1时f1支路输出大。比较判决比单独设阈值更稳因为不需要知道信号绝对幅度。2.5 误码统计边界处理与样本数要求误码统计看起来简单其实有讲究。err sum(bits_hat ~ bits); ber err / Nbit;但要注意由于前面滤波产生了延迟我一般把前几十个码元丢弃避免滤波器初始暂态影响统计。上面代码里sample_idx从delay round(spb/2)开始已经自然避开了前导暂态。另外bits要和抽样后的bits_hat长度严格对齐。很多人因为filter返回的向量长度没变就以为对不对齐无所谓但如果你的本地载波有相位模糊或者滤波器延迟没补偿整体错位一个码元误码率会显示成0.5附近很难排查。还有一个残酷的数学事实要测量10⁻³的误码率至少需要约1000个错误比特才会比较稳定也就是至少10⁶个比特。如果只发20000bit你最多只能测到10⁻²~10⁻³量级再低就是零个错误曲线会断掉。所以低误码率区域想获得可靠统计要么增加比特数要么用蒙特卡洛多次仿真取平均。课程仿真一般到10⁻³就够了2万到5万比特是够用的。3. 仿真结果分析为什么2PSK曲线最低2ASK曲线比2FSK差3dB3.1 三条误码率曲线与理论公式的叠加验证跑完仿真把误码率和理论曲线画在一起。理论公式如下EbN0_lin 10.^(EbN0_dB/10); pe_psk 0.5 * erfc(sqrt(EbN0_lin)); % 2PSK pe_fsk 0.5 * erfc(sqrt(EbN0_lin/2)); % 2FSK相干 pe_ask 0.5 * erfc(sqrt(EbN0_lin/4)); % 2ASK相干画出来的图你应该能看到三条规律第一2PSK曲线在最下面性能最好。在10⁻³附近2PSK比2FSK大约好3dB比2ASK好6dB。注意这里不是2ASK比2PSK差3dB而是差6dB。因为2ASK除了距离减半损失3dB还要再损失3dB的功率效率平均功率只有一半时间在发射。如果用峰值功率对比2ASK只比2PSK差3dB但按平均功率算就是6dB。工程中常按平均功率算因为电池耗电按平均功率来。第二2FSK比2ASK大约好3dB。这个容易理解2FSK的两个符号等概率、等能量星座之间的距离比2ASK的0到1要远所以抗噪能力强。第三仿真曲线和理论曲线大致重合但在高E_b/N_0区域仿真点会开始抖动甚至偏低。这很正常因为高信噪比下错误比特数太少统计涨落变大。如果你想减少抖动可以在每个信噪比点多跑几次取平均或者增大Nbit。3.2 从星座点和眼图看调制质量误码率是数字指标眼图和星座图则是视觉指标。在MATLAB里eyediagram(r_fil, spb); % 看解调后基带信号的眼图 plot(demod, real(demod), .); % 星座图实信号只在实轴跑出来你会看到2PSK的眼图开口最大两条轨迹在电平1和-1处汇聚中间的交叉点附近比较细2ASK眼图只有上半部分有清晰的眼睛下半部分在0附近收拢2FSK看解调后抽样值的话会看到两个输出支路的差值在正负两个区域聚集。眼图能直观反映判决裕量。眼睛睁开越大、越清晰误码率一定越低。眼图上有几个常见的眼睛参数眼高上下电平间距、眼宽可抽样时间段、交叉点抖动。2PSK的眼高明显大于2ASK这是它性能更好的可视化证据。有个细节如果滤波器截止频率太低眼图的眼睛会变小波形被压平如果截止频率太高带外噪声进来眼图的轨迹会变粗。所以我通常会把滤波器的截止频率从0.5R_b到2R_b扫一遍选一个眼睛最清晰的。理论上R_b附近是最佳折中。3.3 时域波形一条曲线读懂一种调制第一次跑出时域波形的人十有八九会盯着图看半天。2ASK的波形特征是幅度有通断一眼就能看出哪些位置发了12FSK的特征是频率疏密变化0和1的段落明显不一样长低频段波形更稀高频段波形更密2PSK的特征最微妙幅度、频率都不变只有某些码元边界处波形突然翻转相位跳变了180°。如果你发现2PSK波形看不出相位跳变别急那是因为cos在过零点的附近相位变了不明显。试试点开图形放大或者把载波频率调低一点比如5kHz相位跳变的位置会清晰很多。这也是为什么仿真时载波频率不能取得太高的原因之一。3.4 高信噪比区域的平台效应仿真跑多了你会发现一个现象在E_b/N_0超过12dB之后误码率曲线下降得越来越慢好像有个地板。这不是无线通信里的误差地板error floor而往往是统计样本不足导致的。20000个比特中错误数只有个位数BER的置信区间就非常大画出来当然不平滑。更隐蔽的情况是如果仿真链路里有系统性的残余误差比如载波相位差个几度、抽样点偏几个采样点、滤波器延迟没补偿干净高信噪比时曲线会出现一个误码平台不管信噪比多高误码率就是降不下去。这时候不要怀疑统计噪声大概率是同步或补偿方面有固定偏差。排查方法很简单把信噪比设成30dB、50dB看误码率会不会趋向0。如果趋向0说明链路是对的如果停在某个非零值说明有系统性bug。这个方法我几乎每次写新仿真都会用。4. 工程中的坑仿真能跑通和仿真能信是两回事4.1 载波同步相干解调的命门仿真里我直接用发送端的载波做相干解调这在现实中是不可能的。收端到发端之间有频偏、相偏收端必须自己从接收信号里提取载波。最常见的办法是Costas环、平方环或者对已知导频做数据辅助估计。载波相位误差对误码率的影响有多大可以做个简单实验在加噪前给接收信号乘一个exp(j*theta)等效基带中也就是把相位转一个角度theta。你会发现theta5°时几乎没影响theta30°时误码率明显上升theta90°时直接不可用。BPSK对相位误差是cos(theta)的关系所以小角度可以忍大角度崩盘。我建议仿真阶段至少做一次这个实验它比背很多公式都有用因为你会直观感受到相位同步误差这个抽象的指标到底意味着什么。4.2 相位模糊与2DPSK差分编码前面提到2PSK的相干解调存在180°相位模糊。原因是BPSK星座只有1和-1两个点旋转180°后完全重合锁相环可能锁定在任何一个方向上。如果锁反了解调后所有比特取反误码率接近1。工程上的标准解法是差分编码也就是2DPSK编码时不直接用比特控制相位而是用相位是否变化来代表信息。发1时相位相对于上一个码元翻转180°发0时相位不变。接收端只需要比较相邻两个码元的相位差不需要知道绝对相位天然规避了相位模糊问题。用MATLAB做2DPSK调制端可以这样实现d [0 bits(1:end-1)]; d mod(d bits, 2); % 差分编码1触发翻转 d_phase 2*pi*0.5*d; % 0相位或pi相位 s_dpsk cos(2*pi*fc*t upsample_phase);不过要注意差分编码会让一个错误变成两个错误一个错误同时影响当前和下一个码元的差分判决所以2DPSK的误码率性能比2PSK理论上略差一点。这是用简化接收机换来的代价工程上完全值得。4.3 定时同步判决点偏移带来的灾难仿真代码里我直接用delay round(spb/2)当抽样点因为我知道每个码元的起点在哪。但实际接收机不知道码元边界必须靠定时同步算法恢复。常用的是早迟门、Gardner算法、Mueller-Muller算法。你可以做个测试把抽样点从码元中点逐渐偏移比如偏移2个采样点2%码元周期误码率几乎没变化偏移10个采样点10%高信噪比时就会看到性能劣化偏移30个采样点以上曲线彻底废掉。原因是NRZ波形的最佳采样点在中点偏移越多判决变量离最大值越远等效信噪比下降。这个坑在仿真里特别隐蔽因为你可能无意识地选择了一个恰好还好的抽样点。建议写代码时明确注释为什么在这里抽样、滤波器延迟补偿了多少、抽样点落在码元周期的百分之几。代码写成这样以后自己回来读也省心。4.4 滤波器的群延迟为什么解调端波形向右平移了很多第一次做仿真的同学会遇到解调后的基带波形跟发送端基带波形看起来像错位了。这正是FIR滤波器群延迟造成的。MATLAB的filter函数输出跟输入等长但输出序列的每个点实际上是输入前若干点的加权和波形整体被延迟了(L/2)个采样点L是滤波器阶数。我用的是阶数64的fir1所以延迟正好32个采样点。抽样前必须把信号前移32个点也就是r_fil(delay1:end)否则抽样点不在码元中点。这里有个细节delay必须是整数。所以FIR阶数最好选偶数这样群延迟是整数个采样点补偿起来精确无误。如果用了奇数阶延迟是半采样点MATLAB里没法精确补偿仿真结果会出现莫名抖动。这是我在实际调试中踩过的坑现在选阶数一律用偶数。4.5 判断仿真有没有bug的经验法则我评判自己的仿真结果可不可信通常按下面的清单排查不发噪声时误码率是否为0。如果加了噪声之前就出错那一定是调制/解调/抽样环节有bug。E_b/N_0很低0dB甚至-5dB时误码率是否接近0.5。接近0.5说明链路是通的只是噪声太大如果远低于0.5反而可能有错比如判决阈值不对。仿真曲线与理论曲线的形状是否一致。两条线可以有几dB偏移但斜率必须大致相同。如果斜率不一致多半是解调方式或信噪比定义错了。增大Nbit后曲线是否更平滑。如果增加样本后曲线形状剧烈变化说明之前统计量不够。频谱是否合理。2ASK和2PSK的频谱应该以f_c为中心、主瓣宽度2R_b2FSK应该有两个主峰。用pwelch看一眼能堵住很多低级错误。这五条不是废话我见过太多人报出仿真结果不好但根本没说清楚是哪条不满足。自己先按清单过一遍至少能筛掉80%的代码问题。5. 从二进制到实用系统你能往哪些方向扩展5.1 从2PSK到QPSK/8PSK带宽效率换来了什么把两个比特组合成一个符号每个符号用4种相位表示就得到了QPSK。带宽跟2PSK一样符号速率减半但每符号2bit所以带宽效率翻倍代价是星座点之间距离变近同样E_b/N_0下误码率会差一些。再往上是8PSK一个符号3bit带宽更省但抗噪声能力进一步下降。如果你跑通了2PSK的仿真扩展到QPSK是很顺的只要把比特流两两分组映射成I/Q两路分别做正交调制。这也是后面所有QAM的基础。建议作为练手项目写一遍不复杂但收获很大。5.2 从2FSK到GFSK/MSK连续相位调制的演进2FSK频率跳变会产生带外辐射这在频谱资源紧张的无线通信里不能接受。改进方向是让频率连续变化MSK就是最小频移键控能在保持正交性的前提下让相位连续变化。GFSK则在MSK基础上用高斯滤波器对基带信号整形进一步压低频谱旁瓣。蓝牙经典版BR用的就是GFSK调制指数0.35左右。做仿真的时候可以在2FSK基础上尝试对频率切换点做平滑观察频谱旁瓣如何下降。这个实验不需要复杂的理论只要在代码里对频率控制信号做个低通滤波然后积分生成相位就能看出来效果。5.3 从仿真到实物软件无线电平台上的注意点同一个仿真代码拿到软件无线电平台上跑会多出几个现实问题发射机和接收机的时钟不同源采样率有微小偏差载波频率有频偏必须用自动频率控制AFC信道不再是单纯AWGN可能有多径衰落。你会发现原来在仿真里天生就有的完美同步在实物里每一项都要额外花大力气。好在基础链路调制、成型滤波、解调、判决是通用的仿真阶段把原理搞扎实了上实物主要补同步和信道估计的课。很多人问为什么要用MATLAB仿真调制度现在应该有答案了仿真不是为了画一张漂亮的曲线而是让你把每种操作在信号上产生的效果看清楚。看得多了后面遇到问题就能大致猜到是哪个环节出的毛病。最后说个我自己的习惯。每次做完一种调制仿真我都会把发送端信号、加噪信号、解调后信号的频谱分别画出来存成一张图。等排查问题的时候这张图比任何日志都好用。另外代码里所有跟信噪比、延迟补偿相关的公式我会在旁边写上推导来源或备注否则三个月后再看真的会怀疑自己当时为什么要除以2。本文还有配套的精品资源点击获取