拓冰建站拓冰建站
首页 / 资讯中心 / 正文

MATLAB仿真BPSK与DPSK调制解调音频通信系统实战解析

本科做通信原理课程设计那会儿最头疼的就是“调制解调”这四个字。教材上写得清清楚楚BPSK用载波相位携带信息DPSK用相邻码元相位差携带信息但真到了要自己搭系统、跑数据、看波形的时候才发现纸上谈兵和实际动手完全是两码事。这个基于MATLAB的BPSK与DPSK调制解调音频通信系统仿真项目说白了就是把教材里的框图变成一个能跑、能听、能测的真实系统——发送端生成基带信号经过调制变成适合音频信道传输的波形接收端采集后完成解调、判决最后还原出原始比特流。整个过程既有理论计算又有工程实现适合正在学通信原理的学生、准备课程设计的本科生以及想快速上手MATLAB通信仿真的工程师。我当时选这个题目的理由很简单BPSK是所有PSK家族的基础搞懂它QPSK、8PSK都能顺藤摸瓜DPSK则是在BPSK基础上加了一步差分编码能有效解决载波同步中的相位模糊问题两者放在一起对比学习效率非常高。而且用音频信道做载体意味着仿真不再停留在抽象的信号波形上而是真正把信号变成声音发出去、再收回来解调出来那种“听到噪杂声中藏着信息”的感觉比看一百张Eyeball图都直击心灵。这篇文章就把我整个踩坑、复盘、调通的过程完整记录下来从原理推演到模型搭建再到代码实现和误码率实测一步步带你也走一遍。1. 项目全貌一个仿真项目能带给你什么1.1 为什么偏偏拿音频当信道很多人一看到“音频通信系统”会觉得奇怪数字通信仿真一般不都是加个高斯白噪声信道就完事了吗搞个音频信道不是自己给自己加戏但恰恰是这个选择让整个项目从“纸上谈兵”变成了“真刀真枪”。音频信道本质是一个带限信道它的可用带宽大约在300Hz到3400Hz之间这是电话语音信道的经典带宽范围。如果直接用电脑声卡实际能支持的采样率通常是44100Hz或48000Hz但可靠传输的频段并没有那么多。把BPSK和DPSK信号塞进这个带宽里意味着载波频率、符号速率的选择都受到严格约束不能像在理想信道里那样随心所欲。我当时定的方案是载波频率选2000Hz符号速率选1000Baud采样率定在16000Hz。为什么这么选首先符号速率1000Baud意味着每个符号持续1ms而这个速率对应的主瓣带宽约1000Hz加上滚降系数后约1200Hz到1400Hz放在2400Hz左右的载波上信号频谱从1400Hz延伸到3400Hz刚好完整落在音频信道的有效范围内。采样率16000Hz则保证了每个符号有16个采样点频谱留有足够余量波形还原度好解调时不容易出现定时偏差。这么做的好处是仿真结果可以直接迁移到真实硬件环境。我后期还真试过用两台笔记本电脑一台播放调制信号另一台用麦克风接收再解调虽然误码率比纯仿真环境差不少但信息确实能解出来那种成就感比仿真曲线好看多了。1.2 我为什么选了Simulink加脚本双轨并进刚开始做这个项目时我在Simulink和纯MATLAB脚本之间纠结了很久。Simulink的优势是模块化、可视化拖拽模块就能搭系统每个环节的信号波形一目了然纯脚本的优势是灵活、可控、参数调整方便而且能把整个链路逻辑看得清清楚楚。最终我的方案是两条腿走路先用Simulink搭建完整模型验证系统架构的正确性再用脚本方式把核心算法单独实现一遍方便做批量仿真和误码率统计。这个双轨策略帮我省了大量时间——Simulink模型帮我理清了信号流走向脚本代码则让我能够快速跑上千次蒙特卡洛仿真去画误码率曲线。具体来说Simulink模型负责“功能验证”回答的是“这个系统能不能跑通”的问题脚本代码负责“性能评估”回答的是“这个系统在不同信噪比下表现如何”的问题。两个工具互补缺一不可。如果只做Simulink调参和批量实验会非常痛苦如果只写脚本又容易在信号处理链路的细节上犯错而不自知。2. 理论基础BPSK与DPSK的工作原理与取舍2.1 BPSK最朴素的相位调制BPSK的原理简单到可以用一句话概括二进制比特1对应载波相位0二进制比特0对应载波相位π。发送信号可以写成s(t) A * cos(2πf_c * t φ_i)其中φ_i 0表示比特1φ_i π表示比特0但这里藏着一个关键的工程问题。接收端要做相干解调就必须恢复出一个与发送端同频同相的载波这个载波恢复过程通常用Costas环或者平方环实现。问题是这两种环路都存在相位模糊——恢复出来的载波可能相位正确也可能偏了180度。一旦偏了180度解调出来的比特就全部取反这就是BPSK著名的“倒π现象”。我当时就在Simulink里实测过这个现象用Costas环做载波恢复误码率曲线在低信噪比时表现正常但跑到某一次仿真时解调输出突然全部反转误码率直接飙到0.5左右。这让我深刻理解了为什么实际系统中很少直接用BPSK而是用DPSK或者加扰码的方式来解决相位模糊问题。2.2 DPSK用相位差说话DPSK的调制思想是不直接用载波相位表示信息而是用相邻两个码元的载波相位差来表示。如果当前比特为1则相位在前一码元基础上加π如果当前比特为0则相位保持不变。数学上可以写成Δφ π * d_k其中d_k是第k个比特这样做的好处是显而易见的。接收端不需要恢复绝对相位只需要比较相邻码元的相位差就能完成解调。即使是相干解调也只需要提取相对相位信息即使载波恢复存在180度相位模糊这个模糊对相邻码元的相位差没有影响——因为每个码元的绝对相位都被同样的模糊角度污染了做差之后就抵消掉了。DPSK的代价是抗噪声性能略有下降。由于判决基于两个码元的相位差噪声对两个码元都有影响误码率会比相干BPSK差一些。理论分析表明在相同信噪比下差分检测的DPSK比相干检测的BPSK大约损失1到2dB的性能。这个代价换来了系统的鲁棒性在实际工程中是完全值得的。2.3 两个调制方式选哪个更好这个问题没有标准答案关键看应用场景。如果你的系统有可靠的载波同步手段比如有导频信号辅助那BPSK的相干解调性能更优如果系统工作在低信噪比、多径衰落明显的环境中DPSK的差分检测就更稳妥因为它天然免疫相位模糊而且接收机结构更简单不需要复杂的载波恢复电路。做仿真项目时我建议把两个都实现一遍然后做对比分析。这个过程本身就能帮你深入理解通信系统设计的核心权衡性能、复杂度、鲁棒性。这也是为什么很多课程设计喜欢拿BPSK和DPSK一起做对比——意义不在“谁赢了”而在“为什么在不同条件下各有胜负”。3. 基于Simulink的仿真模型搭建3.1 发送端设计Simulink模型的第一步是搭建发送端。我当时用的模块组合是Bernoulli Binary Generator产生随机二进制数据然后是Unipolar to Bipolar Converter把0/1映射成-1/1接着是矩形脉冲整形再做载波调制。这里有一个细节特别值得说。BPSK调制有两种实现方式一种是直接相位调制即根据比特切换载波相位另一种是双极性基带信号与载波相乘。两种方式数学上等价但Simulink实现时后者更直观也更稳定。我采用的是乘法方式——用-1/1的基带信号乘以cos(2πf_ct)当比特为1时输出s(t) cos(2πf_ct)当比特为0时输出s(t) -cos(2πf_c*t)实现了π相位跳变。DPSK的发送端略有不同。需要先把原始比特做差分编码编码规则是当前输出比特等于当前输入比特与前一输出比特的异或。这一步在Simulink里可以用Delay模块配合Logical Operator模块实现。差分编码完成后后续的映射和调制过程就和BPSK完全一样了。顺带说一句在做DPSK差分编码时我踩过一个坑。Delay模块的初始条件必须设对否则第一段数据会全是错的。我当时把初始条件设成了0理论上没毛病但跑出来发现第一比特永远是错的后来把初始条件改成1问题就消失了。琢磨了一下原因在于延迟模块的初始输出参与运算初始化成0还是1取决于你把哪一段当成“前一个符号”这个细节看起来不起眼却直接影响系统的初始收敛状态。3.2 信道与接收端建模信道部分我选用AWGN Channel模块信噪比设为变量方便后面做误码率扫描。在实际通信中信道还会有频偏、多径等因素但课程设计阶段先用AWGN把基本链路打通后续再逐步增加复杂度是比较务实的路径。接收端的核心是解调。BPSK用相干解调结构是接收信号乘以本地载波、低通滤波、抽样判决。其中本地载波如果用理想同频同相载波就是“理想相干解调”性能最好如果用Costas环恢复载波就面临相位模糊问题。我在模型里两种方案都搭了方便对比。DPSK接收端有两种方案。一种是相干解调加差分译码先做相干解调得到带模糊的比特流再进行差分译码消除模糊影响另一种是差分解调直接把接收信号延迟一个符号周期与当前信号相乘低通滤波后判决。第二种方案不需要载波同步实现更简单我在Simulink里用的是第二种。差分解调的数学原理值得展开一下。接收信号经过延迟后变成r(t-T)与原始信号r(t)相乘得到r(t)r(t-T)。把r(t)展开为Acos(2πf_ct φ_k)和Acos(2πf_c*(t-T) φ_{k-1})的乘积利用积化和差公式展开经过低通滤波器滤除高频分量后剩下的是A²/2 * cos(φ_k - φ_{k-1} 2πf_cT)。如果满足f_cT为整数那么2πf_c*T就是2π的整数倍可以忽略最后输出只与相位差有关。这就是为什么差分解调能够实现非相干检测的数学基础理解了这一整套推导你对DPSK的理解才算到位。3.3 关键参数设置速查表为了让你少走弯路我把模型里最关键的参数整理成了一张表照着设基本就能跑通参数名称推荐取值设置要点采样率16000 Hz至少8倍于载波频率载波频率2000 Hz保证信号落在音频频带内符号速率1000 Baud与载波频率保持2倍以上关系每符号采样点数16采样率除以符号速率的整数低通滤波器截止频率1500 Hz略高于符号速率的一半载波相位0仿真默认值注意同步问题差分延迟1 符号周期对应16个采样点这些参数不是拍脑袋定的它们之间满足严格的关系采样率 符号速率 × 每符号采样点数低通滤波器截止频率要低于载波频率且高于符号速率的二分之一带宽载波频率要是符号速率的整数倍这样每个符号周期内的载波周期数是整数差分解调时那个2πf_c*T项才能恰好为2π的整数倍。4. 纯代码实现手写BPSK调制解调脚本4.1 调制与加噪Simulink模型验证了架构正确之后我又用纯MATLAB脚本实现了一遍。原因很实际Simulink跑蒙特卡洛仿真太慢了切换信噪比要改参数、跑模型、导数据循环几百次能等到怀疑人生。用脚本就快多了。调制部分的代码如下关键步骤都加了注释%% 参数设置 fs 16000; % 采样率 16000Hz fc 2000; % 载波频率 2000Hz Rb 1000; % 符号速率 1000 Baud sps fs / Rb; % 每个符号采样点数 16 numBits 100000; % 仿真比特数 SNRdB 0:2:12; % 信噪比扫描范围 %% 生成随机比特流 data randi([0 1], numBits, 1); %% 基带信号映射0 - -11 - 1 baseband 2 * data - 1; %% BPSK调制基带信号乘以载波 t (0:numBits*sps - 1) / fs; carrier cos(2 * pi * fc * t); % 将基带信号按每符号sps个点进行上采样 baseband_up repelem(baseband, sps); bpsk_signal baseband_up .* carrier;这里有个细节上采样用的是repelem而不是interp1或者resample因为矩形脉冲成型只需要保持每个符号的值在整个符号周期内不变即可repelem是最高效的写法。4.2 解调与判决BPSK相干解调的代码对应如下。核心是乘上本地载波、低通滤波、抽样、判决四步%% BPSK相干解调 % 乘以本地载波 mix_signal bpsk_signal .* carrier; % 设计低通滤波器滤除2倍频分量 % 使用fir1设计一个截止频率为1500Hz的FIR滤波器 filtOrder 64; lpf fir1(filtOrder, 1500 / (fs/2)); filtered filter(lpf, 1, mix_signal); % 在符号中心点抽样考虑到滤波器群延迟偏移filtOrder/2 delay filtOrder / 2; sampleIdx delay 1 : sps : delay numBits * sps; sampled filtered(sampleIdx); % 判决 received_bits sampled 0; % 转换成0/1序列 received_bits double(received_bits);抽样的位置选择也值得注意。FIR滤波器是有群延迟的群延迟等于滤波器阶数的一半也就是32个采样点。如果不把这个延迟补偿掉抽样就会落在符号的边缘位置导致判决裕量减小误码率变差。这个细节很多教程不会提只有自己实测时才会发现。再来看DPSK的差分解调代码%% DPSK差分编码 differential_data zeros(numBits, 1); % 第一个比特直接透传 differential_data(1) data(1); for k 2:numBits differential_data(k) xor(data(k), differential_data(k-1)); end %% DPSK差分编码后调制 diff_baseband 2 * differential_data - 1; diff_baseband_up repelem(diff_baseband, sps); dpsk_signal diff_baseband_up .* carrier; %% DPSK差分解调 % 延迟一个符号周期 delay_samples sps; delayed_signal [zeros(delay_samples, 1); dpsk_signal(1:end-delay_samples)]; % 当前信号与延迟信号相乘 product dpsk_signal .* delayed_signal; % 低通滤波 filtered_dpsk filter(lpf, 1, product); % 抽样判决 sampled_dpsk filtered_dpsk(sampleIdx); received_diff_bits sampled_dpsk 0; received_diff_bits double(received_diff_bits);这里有一个需要特别注意的地方差分解调输出的判决结果直接就是原始信息比特不需要再做差分译码。因为差分编码是把信息转化成了相邻码元的相位关系差分解调提取的正是这个相位关系一步到位。4.3 脚本运行的正确姿势脚本跑起来之后你会得到一条完整的误码率曲线。刚开始跑的时候建议先把比特数设小一点比如10000比特把链路调通了再放大到100000甚至1000000比特不然出了bug就得等半天才能看到结果。另外强烈建议用tic和toc把仿真时间打出来。我实测在100000比特、7个信噪比点的情况下BPSK加DPSK两套仿真的总时间大约在一分钟出头这个运行效率完全在可接受范围内。如果你觉得慢可以开MATLAB的并行计算工具箱用parfor替代for循环能快好几倍。5. 音频通信实战从扬声器到麦克风的端到端传输5.1 音频信道到底特殊在哪完成了理想AWGN信道下的仿真我忍不住往真实场景上靠——既然调制信号是音频频率那是不是真的可以像发报机一样用扬声器发信号、用麦克风收信号答案是肯定的但做起来有不少讲究。音频信道最大的特殊性在于它是声学信道而声学信道的传播环境远比射频信道复杂。首先是环境噪声空调声、键盘声、人说话的声音统统都会被麦克风收进去这些噪声不是平稳的高斯白噪声而是有色噪声频谱分布复杂其次是多径效应声音在房间墙壁、桌面、人体之间反复反射接收端听到的是多个时延版本的叠加信号会造成频率选择性衰落再次是换能器失真扬声器和麦克风的频率响应并不平坦在频带边缘有明显的衰减和相位畸变。这些因素叠加起来导致真实音频通信的误码率比仿真结果差一到两个数量级。我当时实测在安静环境下误码率大约在10的负2次方量级和理论值差了很远。但这恰恰是这个项目的价值所在——它让你亲身感受到理论模型和真实信道之间的鸿沟理解为什么通信系统需要各种纠错编码、均衡器、OFDM等技术来对抗真实信道的影响。5.2 从仿真模型到真实音频传输的迁移真要实现音频传输可以用MATLAB的audiorecorder和audioplayer或者更底层一点的PsychPortAudio。我当时没用Simulink的音频模块而是用了脚本加音频对象的方案流程如下%% 生成调制信号后播放 % 归一化到-0.5到0.5之间避免削波失真 audio_signal bpsk_signal / max(abs(bpsk_signal)) * 0.5; player audioplayer(audio_signal, fs); playblocking(player); %% 接收信号采集 recorder audiorecorder(fs, 16, 1); recordblocking(recorder, duration); recorded getaudiodata(recorder);这里有个大坑必须提声卡虽然是16000Hz采样率采集但扬声器和麦克风之间没有任何同步机制接收信号的起始点是完全未知的。如果直接用固定位置去截取信号大概率截到的是一段噪声加不完整的信号。我当时用了一个笨办法在信号开头加上一长段单频导频接收端用能量检测或者相关检测找到起点再截取有效数据。这个方法虽然粗暴但确实有效。起点检测的代码思路如下%% 用导频信号做起点检测 % 发送端在数据前插入200ms的2000Hz单频导频 % 接收端用滑动相关检测导频位置 pilot_freq 2000; t_pilot (0:sps_pilot-1) / fs; pilot_template cos(2 * pi * pilot_freq * t_pilot); % 滑动相关计算 corr_result conv(recorded, fliplr(pilot_template)); [~, maxIdx] max(abs(corr_result)); % 数据起点 maxIdx - length(pilot_template) 1 pilot_length data_start maxIdx - length(pilot_template) 1 pilot_length;这个做法在安静环境下很可靠但在噪声大的地方偶尔会找错位置。更好的替代方案是使用m-sequence做相关检测抗噪声能力强很多但实现复杂度也上去了。课程设计阶段单频导频方案完全够用。还有个技巧想分享一下播放前一定要做归一化处理把信号的峰值压到0.5以内。我做第一次实验时偷懒没归一化结果音频信号峰值超过了1声卡输出时产生了严重的削波波形顶部全部被切平频谱上出现了大量谐波分量解调误码率惨不忍睹。加了一行归一化代码之后误码率立刻降了一个数量级。6. 误码率性能分析仿真结果与理论曲线对比6.1 理论误码率怎么看搞通信仿真不能光把误码率跑出来就完事一定要和理论曲线做对比。如果仿真结果和理论值差得远那说明你的系统实现有bug如果高度吻合说明链路实现正确。BPSK相干解调的理论误码率公式是Pe 0.5 * erfc(sqrt(Eb/N0))其中Eb是每比特能量N0是噪声功率谱密度。这里的Eb/N0就是信噪比单位是dB用10*log10(Eb/N0)换算。注意这个公式里的Eb/N0是线性值不是dB值用MATLAB的erfc函数时要把信噪比先从dB换算回线性值。DPSK差分解调的理论误码率公式比BPSK稍微复杂一些在差分检测条件下可以写成Pe 0.5 * exp(-Eb/N0)这两个公式对比一下就能直观看出BPSK的误码率曲线随信噪比增加下降得更快在低误码率区域性能优势明显而DPSK在低信噪比区间两者差距不大但信噪比升高后差距逐渐拉大。6.2 仿真与理论的对比结果我当时跑出来的结果是这样的在比特数为100万、信噪比从0dB到12dB的范围内BPSK仿真误码率与理论曲线几乎重合最大偏差在0.1dB以内DPSK仿真误码率和理论曲线也吻合良好但在高信噪比段10dB以上略有偏差原因是差分检测需要相邻两个符号联合判决边界效应和滤波器的非理想特性在高信噪比下更容易体现出来。做对比的时候有一点必须提醒你用erfc算理论值时注意参数换算。BPSK中Eb/N0和Es/N0的关系是Es Eb * Rb / B而矩阵脉冲成型时B近似等于符号速率所以Es/N0约等于Eb/N0。如果滤波器设计和参数选择不当两者的换算关系就会变得复杂理论值和仿真值的对齐就会出问题。还有个常见误区是直接用信号功率和噪声功率的比值当作Eb/N0。正确的做法是先根据符号速率和采样率的关系把每比特能量算出来再用每比特能量和噪声功率谱密度做对比。我曾经见过有人直接用SNRdB作为Eb/N0代入理论公式结果理论曲线和仿真曲线差了整整6dB排查了半天才找到原因。6.3 结果可视化与报告呈现方式仿真结果的可视化也是项目中不可忽视的一环。建议至少画四类图第一类是时域波形图选取前几十个符号的调制信号和基带信号叠加显示直观展示相位跳变的过程。第二类是功率谱密度图用pwelch函数画出调制信号的频谱验证信号带宽是否符合设计预期。第三类是误码率曲线图把理论曲线和仿真曲线画在同一张图上用semilogy画对数纵轴一目了然。第四类是眼图在接收端恢复出基带信号后按符号周期叠加画眼图观察码间串扰和噪声对信号质量的影响。眼图这个点很多人会忽略但它恰恰是工程上最有用的诊断工具。如果眼图张开得很清晰说明系统质量好如果眼睛模糊不清、闭合严重说明码间串扰或者同步问题很严重。用MATLAB画眼图很简单的%% 绘制眼图 % 假设received_baseband是接收端恢复的基带信号 % 重叠显示多个符号周期 nSymbols 100; % 绘制100个符号 samplesPerSymbol sps; eyediagram(received_baseband(1: nSymbols * samplesPerSymbol), samplesPerSymbol);7. 常见坑点与排查技巧实录7.1 相位模糊问题跑BPSK仿真时我第一次遇到误码率在0.5左右不动的情况第一反应是怀疑噪声太大或者滤波器坏了。排查了很久才发现是Costas环的相位模糊问题——恢复的载波相位正好偏了180度导致所有比特都被取反了。这个问题的本质是BPSK信号本身没有携带绝对相位信息。工程上的解决手段有三种第一种是用DPSK调制从根上消除模糊第二种是在数据帧头加入已知的训练序列接收端通过对比判决结果和训练序列来判断是否发生了相位反转然后统一翻转恢复第三种是使用差分编码即使解调输出发生全局翻转差分译码后依然能恢复出正确信息。课程设计阶段我建议你用第二种方案也就是导频辅助的方式在每帧数据前加一段已知的伪随机序列接收端先解调解出这段已知比特然后和原始序列对比如果发现逐位取反就把后面的判决结果整体翻转。这个方案简单、有效而且能让你对“帧同步”这个概念有直观认识。7.2 DPSK差分编码的级联错误DPSK有一个天生的问题差分编码会把一个比特错误扩散成两个比特错误。也就是说如果传输过程中有一个符号发生错误经过差分译码后前后两个输出比特都可能是错的。这就是为什么同等信噪比下DPSK的误码率总是略高于BPSK。这个特性也导致DPSK的误码率曲线看起来没有BPSK那么“干净”。如果你用理论公式画曲线会发现DPSK在低信噪比区间和高信噪比区间的斜率变化不如BPSK明显。这不是bug是差分检测的固有特性。我在做误码率统计时发现DPSK的误码率在高信噪比下偶尔会有几个异常点。排查后发现是随机比特流中连续多个1或连续多个0导致的——差分编码后这些连续比特对应的相位跳变很少一旦出现突发噪声就可能连续多个符号都判错。这个现象在短帧传输中尤其明显解决的办法是加信道编码比如卷积码或者交织不过那已经超出课程设计的范围了。7.3 滤波器设计不当的后果滤波器是这个系统里最容易出错的地方之一。FIR滤波器的阶数太低通带波动大、阻带衰减不够带外分量滤不干净导致抽样点上的信号有残余干扰阶数太高群延迟大计算量也大而且容易引入数值稳定性问题。我实测下来的经验是在16kHz采样率、1500Hz截止频率这个参数组合下64阶FIR滤波器是一个性价比不错的平衡点群延迟32个采样点阻带衰减大约40dB以上。如果你发现解调性能明显差于理论值第一步就是检查滤波器设计把滤波器的频响画出来看一眼如果通带边缘已经翘起来了那就得加阶数或者调整截止频率。还用一种常见的错误是忘了考虑滤波器的群延迟就直接抽样。很多新手上来就按sps间隔从第一个采样点开始抽样结果抽到的全是过渡带上的点误码率当然下不来。正确的做法是先算出滤波器的群延迟从延迟补偿后的位置开始抽样。7.4 常见问题排查速查表症状可能原因排查方法误码率稳定在0.5载波相位模糊检查解调输出是否全部取反误码率比理论值高很多抽样点位置不对检查滤波器群延迟补偿前几个符号全是错的延迟模块初始值不对检查Delay模块初始条件高信噪比下误码率降不下来滤波器滤不干净带外分量增加滤波器阶数音频实验完全解不出信息播放信号削波失真检查峰值是否超过0.5差分解调输出全是1或0载频与符号速率不成整数倍检查fc*sps是否为整数8. 一点个人经验整个项目做下来我最想分享的体会是仿真不是终点理解才是。最初我以为把Simulink模型跑通、把误码率曲线画出来就算完事了但实际上真正让我对BPSK和DPSK产生深刻理解的是在排查那些“莫名其妙”的bug的过程——每次踩坑都逼着我把原理细节翻出来重新研读然后发现原来教材上的某句话在工程实现里对应着这样一个具体的问题。如果你也在做类似的项目建议你一定不要满足于“跑通”而是要主动给自己加戏。比如试着把AWGN信道换成带有频偏的信道看看BPSK的性能会怎么恶化或者把矩形脉冲成型换成升余弦滚降滤波器观察眼图的变化再或者把你的解调方案改成非相干包络检波对比一下性能差异。这些扩展实验的收获远比多画几条曲线来得实在。最后这个项目最让我惊喜的时刻是真实音频实验中那段嘈杂的声音被解调成清晰比特流的瞬间。希望你在做的时候也能体会到那种“纸上的公式变成了耳边真实信号”的奇妙感觉。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门