MATLAB Simulink仿真2DPSK通信系统:从差分编码到两种解调性能对比

发布时间:2026/8/5 2:48:59
MATLAB Simulink仿真2DPSK通信系统:从差分编码到两种解调性能对比 1. 项目概述从理论到仿真一次搞懂2DPSK在数字通信系统的学习和工程实践中仿真是一个绕不开的环节。它能让我们在投入硬件成本之前直观地验证理论、观察波形、分析性能尤其是对于调制解调这类核心过程。今天要聊的就是围绕“二进制差分相移键控”2DPSK这个经典调制方式在MATLAB Simulink环境下搭建完整通信系统仿真模型的一次深度实践。2DPSK因其不需要载波同步相干载波的显著优点在早期的中低速数据传输、卫星通信及一些对设备复杂度敏感的场景中有着广泛应用。虽然如今更高级的调制方式层出不穷但理解2DPSK的工作原理特别是其两种核心解调方法——相干解调法极性比较法和差分相干解调法相位比较法——对于夯实通信原理基础至关重要。这个仿真项目的目标非常明确不是简单地调用现成模块跑个波形而是要亲手从零开始在Simulink中搭建出包含信源、2DPSK调制、信道加入噪声、两种解调器以及误码率分析的全链路模型。我们将深入比较两种解调方法的内部结构、实现细节、性能差异并分析其背后的根本原因。通过这个过程你不仅能得到可运行的Simulink模型更能透彻理解差分编码如何克服相位模糊、相干解调为何需要差分译码、相位比较法又如何巧妙地避免了载波恢复这一难题。无论你是正在学习《通信原理》课程的学生还是需要快速回顾相关知识的工程师这篇结合了理论推导和Simulink实操的详细指南都将带你穿越迷雾直击核心。2. 核心原理与系统设计思路拆解在动手搭建Simulink模型之前我们必须把2DPSK以及两种解调方法的“灵魂”搞清楚。这决定了我们模型中每一个模块的设置和信号流的方向。2.1 2DPSK调制本质相对相位传递信息首先要明确2DPSK不是直接用绝对相位来表示0和1比如0度代表0、180度代表1那是2PSK。2DPSK用的是“相邻两个码元之间的相位变化”来传递信息。这是一种“差分”思想。通用的编码规则是信息码元为‘1’则当前码元的载波相位相对于前一码元的载波相位变化180度π。信息码元为‘0’则当前码元的载波相位相对于前一码元的载波相位变化0度。注意这里有一个关键的中间变量绝对码信息码和相对码差分码。调制器实际调制的是相对码。过程是先将绝对码通过“模二加”运算转换为相对码然后再对相对码进行绝对的2PSK调制。假设初始参考相位为0那么绝对码a_n转换相对码b_n的规则b_n a_n ⊕ b_{n-1}⊕表示模二加。然后对b_n进行2PSK调制b_n0调制为相位0度b_n1调制为相位180度。这样在接收端即便本地载波存在180度的相位模糊即恢复出的载波可能与发送载波同相或反相由于解调出的是相对码b_n‘再经过差分译码a_n’ b_n‘ ⊕ b_{n-1}’得到绝对码a_n‘相位模糊在差分译码过程中会被抵消掉。这就是2DPSK克服相位模糊的核心机制。2.2 两种解调方法的设计哲学理解了调制解调就有了方向。两种方法的目标都是从已调信号中还原出绝对码a_n但技术路径截然不同。2.2.1 相干解调法极性比较法这种方法的思想是“先按2PSK解调再差分译码”。它在接收端需要一个与发送载波同频同相的相干载波因此结构上包含一个载波恢复电路如科斯塔斯环。恢复出相干载波后与接收信号相乘鉴相再经过低通滤波得到包含相对码信息的基带信号。对该信号抽样判决就得到了相对码b_n‘。最后对b_n‘进行差分译码另一个模二加运算即可得到发送的绝对码a_n‘。注意这里的“相干”指的是解调时使用了相干载波但最终信息的恢复依赖于后续的差分译码因此系统整体对相位模糊不敏感。这是最容易与2PSK混淆的地方。2.2.2 差分相干解调法相位比较法这种方法更为巧妙它直接利用了2DPSK“相邻码元相位变化代表信息”这一本质。它不需要恢复相干载波而是将当前码元波形延迟一个码元周期T_s然后与当前码元本身相乘。这个相乘操作本质上是在比较相邻两个码元之间的相位差。如果相位差为0度对应信息‘0’相乘滤波后的信号为正极性。如果相位差为180度对应信息‘1’相乘滤波后的信号为负极性。 然后直接对这个结果进行抽样判决判决输出的就是原始的绝对码a_n‘一步到位无需额外的差分译码电路。提示差分相干解调法结构简单但有一个潜在缺点它将噪声也引入了乘法器在低信噪比下其误码性能通常略差于理想的相干解调法。因为前者是“噪声×噪声”而后者是“信号×噪声”。基于以上原理我们的Simulink仿真系统框图就清晰了需要生成随机二进制序列信源进行差分编码和2PSK调制然后通过一个加性高斯白噪声AWGN信道。在接收端并行搭建两套解调支路一套是包含载波恢复、乘法器、低通滤波、抽样判决和差分译码的相干解调支路另一套是包含延迟、乘法器、低通滤波和抽样判决的差分相干解调支路。最后将两支路的输出与原始信源进行对比计算并显示各自的误码率。3. Simulink模型搭建与核心模块详解接下来我们进入实操环节在MATLAB Simulink中将这些理论模块一一实现。我使用的是MATLAB R2021a不同版本界面可能略有差异但核心模块名称基本一致。3.1 发送端子系统构建首先新建一个Simulink模型我们从头搭建发送端。信源Bernoulli Binary Generator在Library Browser中搜索“Bernoulli Binary Generator”并拖入模型。这是最常用的二进制随机序列发生器。关键参数设置Probability of a zero设为0.5保证0和1等概出现这是理论分析的前提。Initial seed可以任意设置比如12345。Sample time设置为1/比特率。假设我们的比特率Rb 1000 bps则Sample time 1/1000 0.001秒。Samples per frame设为1表示每个采样点输出一个比特。实操心得务必勾选Frame-based outputs为Off我们这里需要标量序列。将模块重命名为信源。差分编码器2DPSK的核心预处理步骤。Simulink没有现成的差分编码模块我们需要用基本逻辑模块搭建。使用一个Unit Delay模块来自 Discrete 库对当前输入比特进行延迟得到上一时刻的比特b_{n-1}。使用一个XOR逻辑运算模块来自 Logic and Bit Operations 库实现b_n a_n ⊕ b_{n-1}。连接方式信源输出连接XOR的一个输入端和Unit Delay的输入端。Unit Delay的输出连接XOR的另一个输入端。XOR的输出即为相对码b_n同时反馈回Unit Delay的输入端形成递归。关键设置Unit Delay模块的Initial condition需要设定。它决定了差分编码的初始参考状态通常设为0。这相当于定义了第一个码元之前的“虚拟”相对码b_0 0。将这三个模块用Subsystem封装起来命名为差分编码。输入口命名为In_Abs输出口命名为Out_Rel。2PSK调制器对相对码进行调制。虽然可以直接用公式计算但使用通信模块更便捷。使用BPSK Modulator Baseband模块来自 Communications Toolbox 的 Modulation/Digital Baseband Modulation/PM 子库。参数设置Input type设为BitPhase offset (rad)设为0。这意味着相对码0映射为相位0振幅1相对码1映射为相位π振幅-1。这正好是BPSK的映射关系。连接差分编码子系统的输出到该调制器的输入。将模块重命名为BPSK调制。注意事项BPSK Modulator Baseband模块输出的是归一化的复基带信号即同相I分量和正交Q分量。对于BPSKQ分量为0I分量为1或-1。这已经包含了所有相位信息方便后续加入载波或直接进行相关运算。至此发送端完成。我们得到了一个复基带信号其幅度在1和-1之间切换代表了经过差分编码和BPSK调制后的信号。3.2 信道模型AWGN通信链路离不开信道。我们使用最经典的加性高斯白噪声AWGN信道来模拟信号衰减和干扰。使用AWGN Channel模块来自 Communications Toolbox 的 Channels 库。参数设置这是性能分析的关键。Mode选择Signal to noise ratio (SNR)。SNR (dB)这是我们仿真时要扫描的核心变量。可以先设为10进行初步测试。Input signal power (watts)必须正确设置。我们调制器输出的基带BPSK信号其功率是多少对于等概的1/-1序列信号平均功率是1^2 1瓦特假设负载电阻为1欧姆。因此这里填1。其他参数如Number of bits per symbol保持默认1。连接BPSK调制模块的输出到AWGN Channel的输入。将模块重命名为AWGN信道。重要提示Input signal power设置错误会导致SNR计算完全失准从而得到错误的误码率曲线。务必根据你调制信号的实际功率来计算。对于归一化的BPSK功率就是1。3.3 接收端子系统构建双路并行接收端是本次仿真的重点我们将搭建两套独立的解调系统。3.3.1 相干解调支路搭建载波恢复模拟理想情况在实际系统中载波恢复是个复杂环节。为了专注于解调原理比较我们这里做一个简化假设接收端已理想恢复出相干载波。在基带仿真中这意味着我们“知道”发送端载波的相位假设为0。因此我们不需要搭建科斯塔斯环而是直接使用一个“已知”的参考信号。实际上对于基带BPSK信号相干解调中的“载波”就是常数1。因为基带信号s(t)本身就是与载波1相乘的结果。所以相干解调的乘法器一端接接收信号r(t)另一端直接接常数1。这等效于理想载波恢复。使用一个Constant模块值设为1重命名为相干载波(基带)。乘法器与低通滤波器使用Product模块来自 Math Operations 库将AWGN信道的输出与相干载波(基带)相乘。相乘后的信号包含高频分量和低频分量我们需要用低通滤波器LPF提取出低频的基带信号。使用Analog Filter Design或Discrete Filter模块。为了简单和稳定推荐使用Discrete FIR Filter来自 DSP System Toolbox 的 Filtering/Filter Designs 库。滤波器设计设计一个截止频率略高于符号速率比特速率的低通滤波器。例如比特率Rb1000Hz符号率也是1000 Baud。我们可以设计一个截止频率Fc 1200 Hz的低通滤波器。采样频率Fs需要设置。由于我们的仿真是在离散时间进行的需要设定一个系统采样率。假设我们每个比特采样N个点比如N10则系统采样率Fs N * Rb 10 * 1000 10 kHz。具体操作在Discrete FIR Filter模块参数中Design method选EquirippleFilter type选LowpassFs填10000Fpass填1000Fstop填1500过渡带Apass和Astop用默认值。将模块重命名为LPF_相干。抽样判决器低通滤波器输出的是模拟波形我们需要在每个码元周期结束时对其进行抽样并根据门限判决。首先需要生成抽样脉冲。使用Pulse Generator模块来自 Sources 库Pulse type选Sample basedTime (t)选Use simulation time。Amplitude设为1Period (number of samples)设为N即每个比特的采样点数这里是10Pulse width (number of samples)设为1Phase delay (number of samples)设为N-1或根据波形调整确保脉冲在码元末尾出现。使用Zero-Order Hold模块来自 Discrete 库其Sample time参数就是抽样间隔应等于码元周期Ts 0.001s。但更常用的方法是使用Rate Transition模块或直接利用Discrete Filter输出的采样率。一个更简单可靠的方法是使用Downsample模块在LPF_相干后接一个Downsample模块来自 DSP System Toolbox 的 Signal Operations 库Downsample factor设为N10Offset设为0。这样就直接从每比特10个点中抽取了第1个点对应码元起始时刻附近。为了更精确对应码元中间或末尾可以结合延迟模块。简化方案由于我们使用了每比特多采样滤波器输出波形在比特周期内基本稳定。我们可以直接使用MATLAB Function模块写一个简单的判决脚本function y fcn(u) if u 0 y 0; else y 1; end。这个判决器对每个输入采样点都进行判决。虽然会在一个比特内产生多个相同的判决结果但后续我们按比特率进行采样比较时取其中一个即可。将模块重命名为判决_相干。差分译码器判决输出的是相对码b_n‘需要还原为绝对码a_n‘。译码规则是a_n‘ b_n‘ ⊕ b_{n-1}’。搭建方式与发送端的差分编码器完全对称一个XOR模块一个Unit Delay模块。Unit Delay的输入来自判决输出其输出延迟后送入XOR的另一端。XOR的输出即为解调出的绝对码。同样Unit Delay的Initial condition需与发送端编码器的初始状态一致设为0。封装为差分译码_相干子系统。3.3.2 差分相干解调支路搭建延迟单元这是该方法的标志性模块。需要将接收信号精确延迟一个码元周期T_s。使用Discrete Delay模块来自 Discrete 库。Delay length参数设为N每个码元的采样点数10。Initial condition设为0。这意味着在仿真开始阶段延迟线输出为0。重命名为延迟_Ts。注意事项Discrete Delay是按采样点延迟。必须确保延迟的采样点数正好对应一个码元时间。我们的系统采样周期T Ts/N 0.001/10 0.0001s。延迟一个码元就是延迟Ts/T 10个采样点。乘法器将当前接收信号与延迟后的信号即前一码元信号相乘。使用Product模块。将AWGN信道的输出直接接入一端将延迟_Ts的输出接入另一端。这个操作实现了r(t) * r(t-T_s)。低通滤波器与相干解调支路类似相乘后产生高频和低频分量需要用低通滤波器提取基带信号。使用与相干支路参数相同的Discrete FIR Filter重命名为LPF_差分。截止频率同样设为略高于符号速率。抽样判决器经过低通滤波后的信号其极性直接对应了发送的绝对码信息正为0负为1。可以采用与相干支路相同的简化判决方案使用MATLAB Function模块判决门限为0。if u 0, y0; else y1; end。重命名为判决_差分。注意此支路判决输出直接就是绝对码a_n‘不需要后续的差分译码模块。3.4 性能评估与结果显示为了直观比较两种解调方法的性能我们需要计算误码率BER。误码率计算使用Error Rate Calculation模块来自 Communications Toolbox 的 Comm Sinks 库。我们需要三个一个用于计算原始信源与相干解调输出的误码率一个用于计算原始信源与差分相干解调输出的误码率。参数设置Receive delay通常设为0。Computation delay设为0。Output data选Port。关键点信号同步。由于系统存在滤波延迟、差分编解码延迟等解调出的数据流与原始信源在时间上是对齐的。Error Rate Calculation模块会自动处理对齐。但为了更精确可以将原始信源通过一个Buffer模块调整一下或直接使用模块的延迟补偿功能。更简单的方法是让仿真多跑一些时间忽略初始瞬态过程的数据。连接第一个误码率计算模块Tx端接原始信源Rx端接差分译码_相干子系统的输出。第二个误码率计算模块Tx端同样接原始信源Rx端接判决_差分的输出。结果显示与保存使用Display模块来自 Sinks 库直接连接误码率计算模块的输出端口可以实时显示误码率、误码数、总码数。为了绘制误码率曲线BER vs. SNR我们需要在多个SNR下运行仿真并记录结果。这通常通过编写MATLAB脚本驱动Simulink模型sim命令来实现在脚本中循环改变AWGN Channel模块的SNR参数每次运行后从工作空间读取误码率数据最后用semilogy函数绘图。在Simulink内部可以将误码率数据输出到工作空间使用To Workspace模块连接误码率计算模块的输出变量名设为BER_Coherent和BER_Diff保存格式选Array。系统时钟与仿真参数在Model Configuration Parameters中设置Solver:Type选Fixed-stepSolver选discrete (no continuous states)。Fixed-step size (fundamental sample time): 设为系统采样周期T 0.0001秒对应Fs10kHz。Stop time: 设为仿真时间例如1秒可以传输1000个比特对于初步观察波形足够了。对于误码率统计需要更长时间如10秒10000比特以获得更稳定的统计结果。4. 仿真运行、结果分析与深度解读搭建好模型后点击运行。我们先在某个固定SNR比如10dB下观察波形然后再进行扫SNR仿真。4.1 波形观测与定性分析使用Scope模块观察关键点的信号波形。建议观察以下节点原始信源信源。差分编码器输出差分编码/Out_Rel。调制器输出BPSK调制实部。信道输出AWGN信道实部。相干解调支路LPF后信号、判决前信号、最终输出。差分相干解调支路延迟后信号、相乘后信号、LPF后信号、最终输出。你应该能看到原始信源是随机的0/1序列。差分编码输出与原始序列不同其变化发生在原始码为‘1’的时刻。BPSK调制输出是1/-1的序列。经过AWGN信道后信号上叠加了噪声1/-1的清晰度下降。在SNR较高时两个解调支路的最终输出都能较好地还原原始信源。4.2 误码率性能定量比较这是仿真的核心。我们通过MATLAB脚本自动化这个过程。% 假设模型已保存为 DPSK_Simulation.slx model DPSK_Simulation; load_system(model); % 设置要仿真的SNR点 SNR_dB 0:2:12; % 从0dB到12dB步长2dB BER_Coherent zeros(size(SNR_dB)); BER_Diff zeros(size(SNR_dB)); % 循环仿真 for i 1:length(SNR_dB) % 设置当前SNR set_param([model /AWGN信道], SNR, num2str(SNR_dB(i))); % 运行仿真 simOut sim(model, StopTime, 10); % 仿真10秒 % 从仿真输出中获取误码率数据假设使用To Workspace模块变量名为BER_Coherent_Data等 % 注意Error Rate Calculation模块输出是一个三维向量[误码率误码数总码数] % 我们取第一个元素即误码率 BER_Coherent(i) simOut.BER_Coherent_Data.signals.values(end, 1); BER_Diff(i) simOut.BER_Diff_Data.signals.values(end, 1); end % 绘制误码率曲线 figure; semilogy(SNR_dB, BER_Coherent, b-o, LineWidth, 1.5, MarkerSize, 8, DisplayName, 相干解调 (极性比较)); hold on; semilogy(SNR_dB, BER_Diff, r-s, LineWidth, 1.5, MarkerSize, 8, DisplayName, 差分相干解调 (相位比较)); grid on; xlabel(信噪比 SNR (dB)); ylabel(误码率 BER); title(2DPSK两种解调方式性能比较); legend(Location, best); % 可以同时画出理论曲线作为参考2DPSK相干解调理论误码率与2PSK相同 theory_BER_PSK 0.5 * erfc(sqrt(10.^(SNR_dB/10))); % 相干PSK理论误码率 semilogy(SNR_dB, theory_BER_PSK, k--, DisplayName, 理论 (相干PSK/2DPSK相干解调)); hold off;运行上述脚本后你会得到一张误码率曲线对比图。结果解读理论趋势在加性高斯白噪声信道下2DPSK相干解调极性比较法的理论误码率公式与2PSK相同P_e 0.5 * erfc(sqrt(E_b/N_0))。其中erfc是互补误差函数。仿真趋势你的仿真图中蓝色圆圈相干解调的曲线应该最接近黑色的理论虚线。红色方块差分相干解调的曲线应该位于蓝色曲线上方即在相同SNR下差分相干解调的误码率更高。性能差距这个差距就是差分相干解调付出的代价。因为它的乘法器是r(t)*r(t-T_s)当r(t)和r(t-T_s)都含有噪声时噪声项会相乘产生额外的噪声乘积项恶化了信噪比。理论分析表明在相同误码率要求下差分相干解调比相干解调大约有1dB的信噪比损失。工程意义这1dB的损失换来的是接收机结构的极大简化无需载波恢复环路。在那些对设备成本、复杂度和功耗敏感且信道SNR裕量足够的应用场景中例如某些短波通信、低成本传感器网络差分相干解调是极具吸引力的选择。4.3 模型调试与参数优化心得在搭建和运行这个模型的过程中我踩过几个坑也总结了一些技巧采样率与滤波器设计系统采样率Fs、符号率Rs、滤波器截止频率Fc必须协调。Fs必须满足奈奎斯特采样定理远高于Rs通常每符号8-16个采样点。滤波器Fc应略高于Rs以保留主瓣能量但远低于Fs/2以防止混叠。不合适的Fc会导致波形严重失真或码间串扰。延迟对齐这是差分相干解调支路最容易出错的地方。Discrete Delay模块的延迟点数必须精确等于每符号采样点数N。你可以用一个阶跃信号通过延迟模块用Scope观察输入输出来验证延迟时间是否正确。初始状态差分编码器和译码器中的Unit Delay模块的Initial condition必须一致通常都设为0。如果不一致会导致整个数据流译码错误表现为误码率接近50%。AWGN信道功率设置如前所述这是影响SNR和误码率结果正确性的最关键参数。务必根据你调制器输出的信号功率来设置。对于归一化BPSK功率就是1。如果你在调制后加入了其他增益或改变了信号幅度需要重新计算功率。仿真时间与误码统计为了获得可靠的误码率统计特别是低误码率如1e-4时需要传输足够多的比特。一般要求误码数至少几十个。例如要测量1e-4的误码率至少需要仿真1e5到1e6个比特。这会导致仿真变慢。可以采用加速模式Accelerator或Rapid Accelerator或者用MATLAB脚本控制仿真只保存误码率结果不显示Scope以提升速度。从复基带到通真的扩展我们这个仿真是在基带进行的。如果想模拟更真实的射频通信过程可以在调制后乘以一个载波如cos(2*pi*fc*t)在接收端先下变频再到基带。这会引入载波同步问题。对于相干解调就需要真正搭建载波恢复环如科斯塔斯环模型复杂度会大大增加但原理是相通的。5. 常见问题、排查技巧与扩展思考在实际仿真和理论理解中你可能会遇到以下问题问题1仿真得到的误码率曲线与理论值偏差较大尤其是在高SNR时。可能原因1滤波器和抽样点选择不当。低通滤波器性能不佳过渡带太宽或太窄纹波大或抽样时刻没有对准码元中间眼图张开最大处会导致码间串扰增加误码。排查观察滤波器输出的眼图。在滤波器后接一个Scope设置横轴为码元周期叠加多个码元的波形。调整抽样脉冲的相位延迟Phase delay使抽样点落在眼图最张开的位置。可能原因2仿真比特数不足。高SNR下误码率极低仿真传输的比特数太少可能一个误码都没发生计算出的误码率为0在对数坐标上无法显示。解决增加仿真时间传输更多比特或者对于高SNR点使用蒙特卡洛仿真多次并取平均。可能原因3AWGN信道输入功率设置错误。这是最普遍的原因。请再次确认发送信号的功率。验证可以在AWGN信道输入端接一个Mean模块计算均值和Variance模块计算方差即功率观察仿真中信号的实际功率。问题2差分相干解调支路的误码率始终在0.5左右完全无法解调。可能原因1延迟时间错误。延迟不是精确的一个码元周期T_s。排查用两个Scope分别观察接收信号和延迟后的信号。调整Discrete Delay的Delay length直到肉眼可见延迟后的波形与当前波形在形状上相同但正好错开一个码元的距离。可能原因2乘法器输入接反或类型错误。确保是当前信号乘以延迟信号。如果信号是复数基带表示确保使用Product模块的复数乘法模式。可能原因3判决门限错误。差分相干解调LPF后的信号正负极性直接对应信息。判决门限必须是0。如果你的判决器设成了比如0.5的门限就会完全错误。问题3相干解调支路性能甚至比差分相干还差。可能原因差分译码器初始状态错误或未对齐。检查相干支路中差分译码器的Unit Delay初始条件是否与发送端编码器一致通常为0。检查译码器输入即判决输出的相对码是否与发送端的相对码在时间上对齐。可以暂时断开AWGN信道SNR设很高观察在无噪声情况下两支路是否能无误码恢复。如果不能问题一定出在编解码或对齐上。扩展思考这个基础的2DPSK仿真模型可以作为一个平台进行许多有趣的扩展研究加入载波频偏和相偏在调制后乘以exp(j*(2*pi*delta_f*t phi))来模拟载波不同步然后研究载波恢复环路如科斯塔斯环对相干解调性能的影响。比较不同调制方式将BPSK调制器换成QPSK、8PSK等研究多进制DPSKMDPSK的性能。加入信道编码在信源后加入卷积码或LDPC编码器在接收端加入相应的译码器如Viterbi译码观察编码增益。研究定时同步的影响用更真实的模型代替理想的抽样脉冲比如使用早迟门或Gardner算法来恢复符号定时。硬件实现考虑思考如何将Simulink中的浮点算法转换为定点Fixed-Point实现以逼近FPGA或DSP中的实际处理过程。通过这个从理论推导到Simulink实现再到结果分析和问题排查的完整过程我相信你对2DPSK及其两种解调方法的理解已经不再停留在公式层面而是有了直观的、可操作的工程认识。仿真不仅是验证理论的工具更是探索问题、深化理解的无损实验室。希望这个详细的指南和模型能成为你学习通信系统仿真的一块扎实的垫脚石。