news 2026/8/24 12:56:18

从零搭建:基于Simulink的PCM-Hamming-TDMA-DBPSK通信链路全流程解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从零搭建:基于Simulink的PCM-Hamming-TDMA-DBPSK通信链路全流程解析

1. 从零开始:为什么要在Simulink里“搭积木”?

如果你对通信系统感兴趣,或者正在学习相关课程,你肯定听过PCM、汉明码、TDMA、DBPSK这些名词。它们听起来很复杂,像是教科书里一堆抽象的公式和框图。我以前学的时候也这么觉得,直到我开始用Simulink。你可以把Simulink想象成一个功能无比强大的“电子积木”平台,我们今天要做的,就是把“信源”、“编码”、“调制”这些抽象的“积木块”找出来,按照通信的逻辑一块块拼接起来,最终搭建出一条能从A点把信息可靠地传到B点的“高速公路”。

这个“高速公路”的起点是一个随机信号(比如模拟一段语音),终点是把它几乎一模一样地还原出来。中间要经历什么呢?首先,得把连续的模拟信号变成数字信号(PCM编码),不然计算机没法处理;接着,给这些数字信号穿上“防弹衣”,防止在传输路上被“噪声”打坏(汉明码信道编码);然后,为了让一条“路”能同时跑多辆“车”,我们需要安排时间表,让不同用户的数据轮流上路(TDMA时分复用);最后,为了让这些数字信号能“坐”上高频的无线电波进行远距离传输,我们需要进行“打包”(DBPSK调制)。在接收端,再把这一系列过程反过来操作一遍。

听起来步骤很多?别怕。Simulink的好处就是,它把每一个复杂的数学过程都封装成了一个一个看得见、摸得着、能连线的模块。我们不需要从零开始写每一行代码,而是专注于理解每个模块是干什么的、参数怎么设、模块之间怎么连。这个过程就像解一道复杂的数学题,Simulink帮我们把每一步的草稿都打好了,我们只需要确保逻辑正确。我当年第一次在Simulink里跑通整个链路,看到发送的波形和接收的波形几乎重合时,那种“原来如此”的成就感,至今难忘。下面,我就带你一步步复现这个激动人心的过程。

2. 搭建通信舞台:信源与滤波

任何通信系统都得有要传的东西,这就是信源。在仿真里,我们通常用一个随机信号发生器 (Random Number Generator)来模拟。这就像你准备了一段随机变化的语音或者传感器数据。

打开Simulink库浏览器,找到Sources库里的Random Number模块,拖到模型里。双击它,我们来设置关键参数。均值 (Mean)设为0,方差 (Variance)设为1,这会产生一个标准的高斯分布(正态分布)随机信号,比较贴近很多真实信号的特性。还有一个超级重要的参数叫采样时间 (Sample time),这里我们先设为0.001。这意味着这个信号源每0.001秒(即1毫秒)产生一个新的随机数。这个值会贯穿整个系统,是系统时序的基准之一,后面很多模块的采样时间都和它有关联。

但是,直接用一个随机信号太“毛糙”了,它包含的频率成分太丰富。现实中,比如语音信号,其主要能量集中在某个频率范围内。所以,我们通常会让信号先经过一个低通滤波器 (Lowpass Filter),把不需要的高频成分滤掉,得到一个更平滑、更像真实信号的波形。我们从DSP System ToolboxFiltering库里拖一个Digital Filter模块出来(如果找不到,用Simulink自带的Analog Filter Design也可以,但要注意设置为数字模式)。

这里有个小技巧,也是我踩过的坑:为了模拟两个不同的用户(比如用户1和用户2),我们不能用一模一样的信号。一个简单有效的方法是,使用两个截止频率不同的低通滤波器。假设我们的信号采样率是1kHz(由采样时间0.001s决定),那么根据奈奎斯特定理,有效信号最高频率在500Hz以下。我们可以为用户1的滤波器设置截止频率为6Hz,为用户2的设置8Hz。这样,两个信号经过滤波后,虽然都是低频缓变信号,但细节上会有差异,便于我们后期观察TDMA复用和解复用的效果。

滤波器模块的参数设置需要留意:选择低通滤波器类型,设计方法可以用巴特沃斯(Butterworth),因为它通带比较平坦。为用户1的滤波器设置截止频率 (Passband edge frequency)为6Hz,阶数 (Filter order)设为8,可以获得比较陡峭的滚降。为用户2的滤波器设置截止频率为8Hz,阶数同样为8。这样,我们就得到了两路特性相似但又不完全相同的模拟源信号,为后续处理做好了准备。

3. 模数转换的核心:PCM编码详解

PCM(脉冲编码调制)是数字通信的基石,它的任务就三个:采样、量化、编码。简单说,就是给连续的模拟信号“拍照”(采样),然后给拍出来的“亮度值”分级(量化),最后把属于哪一级用二进制数字写下来(编码)。在Simulink里,我们需要用几个模块组合起来实现这个过程。

首先,采样。我们用一个零阶保持器 (Zero-Order Hold)来实现。它的作用是以固定的时间间隔“抓住”输入信号的瞬时值,并保持到下一个时刻。这其实就是采样。从Discrete库中找到Zero-Order Hold模块。它的采样时间 (Sample time)需要仔细计算。整个系统的“节奏”是由它决定的。假设我们原始信号经过6Hz或8Hz滤波后,最高频率成分约10Hz。根据奈奎斯特采样定理,采样频率至少需要20Hz。为了留有余量,我们选择0.05秒作为采样时间,对应的采样频率就是20Hz。将这个值填入模块。

采样后的信号幅度可能范围很广,为了方便后续量化,我们最好先进行限幅。从Math Operations库拖一个Saturation模块,设置上下限,比如-22。这样,所有超过±2的电压值都会被“削顶”,限制在这个范围内。

接下来是量化前的关键一步:压缩。这是PCM的一个精髓,叫做非均匀量化。因为小信号比大信号更敏感,我们希望对小信号“放大”其量化间隔的影响,对大信号“压缩”其影响。在Simulink中,我们可以用A-Law Compressor模块(在Communications ToolboxUtility子库中)来模拟A律压缩。双击模块,A值设为国际标准值87.6峰值信号幅度 (Peak signal magnitude)设为刚才的限幅值2

压缩后的信号就可以送进量化器 (Quantizer)了。从Math Operations库拖出Quantizer量化间隔 (Quantization interval)设为1。这意味着我们把从-2到2的范围,以间隔1进行划分,总共会得到5个量化电平(-2, -1, 0, 1, 2)。但注意,经过A律压缩的非线性变换后,实际对小信号的量化会更精细。量化器输出的是一个浮点数,代表它落在了哪个量化电平上。

最后是编码。我们需要把这个量化电平转换成一串二进制比特。这里分两步走。第一步,处理符号位。在量化之前,我们可以用Sign模块(取符号,正为1,负为-1)和Data Type Conversion模块(转换为布尔型,即0或1)来生成代表正负的最高位(符号位)。第二步,处理幅度值。将限幅后的信号取绝对值(用Abs模块),然后经过压缩、增益、量化。这里需要一个增益模块Gain,设置为127/2,这是为了将幅度映射到0-127的整数范围,便于编码。量化后,用Float to Integer Converter模块将浮点数转换为整数(选择‘floor’取整方式)。然后,使用Integer to Bit Converter模块,将0-127的整数转换为7个比特。这7个比特就是幅度的编码。

最终,将1个符号位比特和7个幅度比特合并,就组成了一个8位的PCM码字。我们可以用Mux(复用器)模块将它们按顺序合并成一个8位宽的信号。至此,一路模拟信号就成功变成了每秒20个、每个8比特的数字流。

4. 给数据穿上防弹衣:汉明码信道编码

数字信号在信道里传输,就像快递包裹在运输途中,难免会磕碰(引入误码)。汉明码就是一种“防撞包装”,它能检测并纠正一定程度的错误。我们这里用的是 (7,4) 汉明码,意思是它把4个有效信息位,编码成7个比特的码字,其中加入了3个校验位。这样,这7个比特之间就存在特定的数学关系(监督关系),一旦某个比特在传输中翻转(0变1或1变0),接收端通过校验就能发现并纠正它。

在Simulink中实现汉明编码非常方便,因为Communications Toolbox提供了现成的模块。在库浏览器中找到Error Detection and Correction子库,里面有一个Hamming Encoder模块。直接拖到模型中。但是要注意,我们的输入是8位的PCM码字,而(7,4)汉明码一次处理4个比特。所以我们需要一个“拆分-处理-合并”的过程。

具体操作是这样的:用一个Bit to Integer Converter模块将8位PCM码字转换回一个0-255的整数(仅为了方便处理)。然后,我们可以用MATLAB Function模块写一小段脚本,或者更直观地,用两个Buffer模块进行重排。思路是将8位数据视为两个4位组。首先用一个Unbuffer模块将8位宽的串行数据拆成比特流,然后用一个长度为4的Buffer模块,每收集到4个比特,就输出一组4位数据给汉明编码器。Hamming Encoder模块选择(7,4)模式,它就会自动输入4比特,输出7比特的汉明码字。

由于一路PCM码字是8位,对应两个4位组,所以会生成两个7位的汉明码字。我们需要把它们按顺序重新组合起来。用一个Buffer模块设置长度为14,将两个7位码字依次存入,输出就是一个14位宽的数据块。这样,原来8位的数据,经过汉明码保护后,变成了14位,增加了冗余度,但抗干扰能力大大增强。这就是用带宽换可靠性的经典权衡。

5. 一条车道跑多辆车:TDMA时分复用

现在我们有了两路用户的数据(假设都经过了PCM和汉明编码),但我们的目标是用一条物理信道(比如一根电缆或一个频段)把它们同时传出去。TDMA(时分多址)的解决方案特别直观:把时间切成很小很小的片段,然后让用户1用第一个时间片,用户2用第二个时间片,用户1再用第三个时间片……如此循环。

在Simulink里,我们需要一个精确的“交通警察”来指挥调度。这个警察就是一个脉冲发生器 (Pulse Generator)。从Sources库拖出Pulse Generator,将其设置为数字模式。关键参数是周期 (Period)脉冲宽度 (Pulse width)。如何确定这个周期呢?想一想:一个用户的一个完整数据块(14位汉明码字)需要在一个时间片内传完。之前PCM的采样周期是0.05秒,即每个数据块产生间隔是0.05秒。TDMA要在0.05秒内完成两个用户数据的轮流发送,所以每个用户占用的时间片宽度应该是0.05 / 2 = 0.025秒。但注意,我们的数据块是14位,如果考虑用更底层的时钟脉冲来一位一位地传输,我们需要进一步划分。假设我们用一个更快的时钟来同步,那么脉冲发生器的周期可以设为0.05 / 14 / 2。这里“14”是因为一个数据块14位,“2”是因为有两个用户。这样,每个极短的时间脉冲,可以用来控制一个比特位的切换。

设置脉冲发生器:振幅为1,周期设为计算值(例如0.05/14/2),脉冲宽度设为1(占空比50%)。这个脉冲信号会是一个0和1交替的方波。我们可以用它来控制一个选择开关。Simulink中的Multiport Switch模块就像一个单刀双掷开关。将脉冲信号连接到它的控制端(第一个端口),将用户1的数据连接到第二个输入端口,用户2的数据连接到第三个输入端口。当控制信号为0时,开关输出端口2的数据(用户1);当控制信号为1时,输出端口3的数据(用户2)。这样,就在时间上把两路数据流完美地交织在了一起,形成了一路更高的数据率流。

6. 让数字信号“坐”上载波:DBPSK调制

经过TDMA合并后的数据是数字基带信号,它包含丰富的低频成分,不适合直接在无线信道中远距离传输。我们需要调制,把基带信号“搬移”到高频载波上。DBPSK(差分二进制相移键控)是BPSK的一种改进,它不直接用电平绝对值表示0和1,而是用相邻符号的相位变化来表示。这样做的好处是,接收端不需要一个绝对精确的本地参考载波(相干载波)来解调,抗相位模糊能力更强,工程上更容易实现。

在Simulink中搭建DBPSK调制器,我们可以遵循以下步骤,这也是我调试过好几次后觉得最稳定的连接方式:

  1. 差分编码:这是DBPSK的关键。用XOR(异或)模块来实现。将当前的输入比特与上一个时刻的比特进行异或运算。如果当前比特与前一比特相同,则输出0(代表相位不变);如果不同,则输出1(代表相位反转)。这就需要用到Unit Delay模块来获取上一个时刻的比特值。
  2. 双极性变换:差分编码后的比特流(0和1)需要转换成适合调制的电平,通常是+1和-1。用一个Gain模块,增益设为2,然后减去1,就可以实现(0 -> -1, 1 -> +1)。或者用MATLAB Function模块写个简单的2*u-1也行。
  3. 载波相乘:用一个Sine Wave模块产生高频载波,比如频率设为1000 Hz(1kHz)。用Product乘法模块,将双极性数字序列(+1/-1)与载波正弦波相乘。当数字序列为+1时,输出就是原载波;当为-1时,输出就是反相的载波。这就完成了相位的切换,即PSK调制。

解调是调制的逆过程,采用相干解调(虽然叫差分编码,但解调时仍需要载波同步,只是对同步精度要求低):

  1. 相干解调:将接收到的已调信号再次与相同的1kHz载波相乘。这个乘法运算会产生一个高频的2倍频分量和一个低频的基带分量。
  2. 低通滤波:用一个截止频率设置合理的低通滤波器(比如800Hz)滤除高频的2倍频分量,剩下的就是包含原始数字信息的低频信号。这个信号在时间轴上,对应发送的+1或-1。
  3. 抽样判决:在最佳采样时刻(通常需要时钟同步,在简单仿真中我们可以用零阶保持器延迟半个符号周期来近似),对滤波后的信号进行判决。如果采样值大于0,判为+1(对应比特1);小于0,判为-1(对应比特0)。可以用一个Relational Operator(关系运算符)模块,判断输入是否>=0,输出布尔值。
  4. 差分解码:将判决得到的比特流再进行一次异或差分解码(过程与发送端的差分编码完全一样),就能恢复出原始的比特流。至此,DBPSK的调制与解调过程就完成了。

7. 分拣包裹与复原信息:解复用、解码与滤波

信号经过信道(我们这里假设是理想信道,没有加入噪声模块,你可以后期自己加入AWGN Channel模块来测试抗噪性能)到达接收端后,需要把合并的流量重新分开,并一层层拆掉“包装”,还原出最初的模拟信号。

第一步:TDMA解复用。这就像是快递分拣中心。我们需要一个和发送端一模一样的“交通警察”(脉冲发生器),产生完全同步的开关控制信号。使用相同的参数:周期0.05/14/2,脉冲宽度50%。然后用这个信号控制一个Switch开关模块。当控制信号为1时,将输入信号导向输出端口1(对应用户1);当为0时,导向输出端口2(对应用户2)。这里需要注意,由于开关动作,输出信号在非选通时段会是0,我们需要用触发器或采样保持电路来保持住选通时的值。一种实用的方法是使用Enabled Subsystem(使能子系统),用脉冲信号作为使能端,当选通时,子系统输出输入值;否则,保持前一次的输出。这样就得到了两路独立的、但中间掺杂了零值的用户数据流。

第二步:汉明解码。对于每一路数据,我们首先要用一个零阶保持器,采样时间设置为一个完整的用户数据块周期,即0.05/14秒,将分散的比特重新“收集”成14位的数据块。然后,使用Hamming Decoder模块进行解码。模块会自动检测并纠正这14位(实际上是两个7位码字)中的单比特错误,并恢复出原始的8位PCM数据。如果错误超过1位,它可能检测出但无法纠正,会报错。解码后,我们得到了受保护前的8位PCM码字。

第三步:PCM解码。这是编码的逆过程。首先,将8位码字用Demux(解复用器)拆分成1位符号位和7位幅度位。将7位幅度位通过Integer to Float Converter转换为整数,然后经过一个Gain模块,增益设为2/127,这是编码时127/2增益的逆运算,将数值还原到0-2的幅度范围。接着,通过A-Law Expander(A律扩张器)模块,参数与编码时的压缩器对称(A=87.6,峰值2),进行非线性扩张,恢复出均匀量化前的幅度值。最后,将这个幅度值与符号位(转换为+1或-1)相乘,恢复出原始的量化后采样值序列。

第四步:重建模拟信号。此时我们得到的是一串离散的采样值,采样频率是20Hz。要还原出连续的模拟信号,我们需要一个重建滤波器。它的作用是滤除由采样产生的高频镜像频谱,只保留原来的基带信号。这里我们使用低通滤波器,截止频率略高于原始信号的最高频率(我们之前源信号用了6Hz和8Hz的滤波器)。因此,为用户1的通路连接一个截止频率为6Hz的低通滤波器,为用户2的连接一个8Hz的低通滤波器。滤波器输出就是重建的模拟信号。为了更平滑,可以适当提高滤波器的阶数。

8. 眼见为实:仿真结果分析与调试心得

搭建完所有模块并连接好线后,点击运行仿真。要直观地看到效果,一定要多用Scope(示波器)模块。我通常会连接几个关键的观测点:

  1. 发送端:两路源信号(滤波后)的波形。
  2. 发送端:两路信号经过PCM编码后的二进制比特流(可以用Time Scope并以离散模式显示)。
  3. 发送端:TDMA复用后的合并数据流。
  4. 发送端:DBPSK调制后的已调波形(高频正弦波)。
  5. 接收端:解调并判决恢复出的比特流。
  6. 接收端:最终重建的两路模拟信号。

将第1个和第6个示波器的波形放在一起对比,是验证系统成功与否的关键。理想情况下(无噪声信道),两条曲线应该几乎完全重合。你可能会看到重建的信号比原信号有轻微的延迟,这是正常的,因为处理各个环节都需要时间。还会看到一些量化带来的台阶状波形,这是因为PCM量化引入了量化噪声,提高量化位数(比如从8位增加到16位)可以明显改善。

在实际调试中,最容易出问题的地方是时序同步。各个模块的采样时间设置不一致,会导致数据丢失或错位。务必检查所有零阶保持器、量化器、滤波器以及脉冲发生器的采样时间或周期参数,确保它们之间是整数倍关系,并且整个数据流是顺畅的。另一个常见问题是数据格式,比如模块输出是布尔型、uint8还是double型,不匹配会导致连接错误。多使用Data Type Conversion模块进行显式转换。

当你第一次看到发送和接收的波形在示波器上紧紧跟随,那种整个系统从无到有、在自己手中活起来的感觉,是看书和做题无法比拟的。这个基于Simulink的PCM-Hamming-TDMA-DBPSK链路,虽然是一个简化模型,但它涵盖了现代数字通信系统最核心的流程。通过动手搭建它,你不仅理解了每个模块的“为什么”和“怎么用”,更掌握了用仿真工具解决复杂工程问题的思路。下次你可以尝试在其中加入噪声信道,观察汉明码如何纠错;或者调整TDMA的时隙分配,看看对信号还原的影响。仿真世界的大门,从此为你敞开。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 16:48:37

高速PCB设计实战:差分布线与等长布线的协同策略

1. 从“单打独斗”到“协同作战”:为什么高速PCB设计需要组合拳? 大家好,我是老张,一个在硬件设计坑里摸爬滚打了十多年的工程师。这些年,我画过的板子堆起来能当桌子用,踩过的坑也足够写一本《PCB设计避坑…

作者头像 李华
网站建设 2026/7/14 16:48:50

软考架构师90天冲刺|DAY06·架构风格-黑板架构

核心知识点:黑板架构的组成、适用场景 精炼讲解:知识共享与协作处理的实现 真题实战:2024年综合知识第18题 - 黑板架构应用 实践应用:分析语音识别系统的黑板架构设计 黑板架构是软考系统架构设计师考试中的高频核心考点,在历年真题中反复出现。本文将从核心概念、组成结构…

作者头像 李华
网站建设 2026/7/14 16:48:48

解锁pyenv隐藏能力:手动链接系统Python版本实现统一管理

1. 为什么你的pyenv“看不见”系统里的Python? 你是不是也遇到过这种情况?兴致勃勃地装好了pyenv,准备大展拳脚统一管理手头的好几个Python版本,结果一敲 pyenv versions,终端里只孤零零地显示一个 system,…

作者头像 李华
网站建设 2026/7/14 16:48:49

MTools科研助手应用:文献综述自动生成+核心术语提取+摘要双语对照

MTools科研助手应用:文献综述自动生成核心术语提取摘要双语对照 1. 项目简介:您的智能科研助手 MTools是一个专为科研工作者设计的智能文本处理工具箱,它基于先进的Ollama框架和Llama 3大语言模型,为您提供一站式的文献处理解决…

作者头像 李华
网站建设 2026/7/14 16:48:49

CentOS 7.9-minimal 下 TigerVNC Server 1.8.0-22 的快速部署与Xfce桌面集成

1. 为什么选择TigerVNC与Xfce这对“黄金搭档”? 如果你手头有一台安装了CentOS 7.9-minimal的服务器,无论是物理机还是云主机,想给它装个图形界面方便远程管理,但又担心臃肿的桌面环境拖慢系统,那你来对地方了。我这些…

作者头像 李华
网站建设 2026/7/14 16:48:48

腾讯会议录屏修复实战:利用recover_mp4与FFMPEG拯救损坏的MP4文件

1. 当你的腾讯会议录屏突然打不开了 我猜你现在的心情一定很着急。辛辛苦苦开了一上午的会,讨论的全是重点,你特意点了腾讯会议的“本地录制”,想着会后能好好复盘。结果会议开到一半,电脑突然蓝屏或者断电重启了。等你手忙脚乱地…

作者头像 李华