从零搭建:基于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 Toolbox的Filtering库里拖一个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模块设置上下限比如-2到2。这样所有超过±2的电压值都会被“削顶”限制在这个范围内。接下来是量化前的关键一步压缩。这是PCM的一个精髓叫做非均匀量化。因为小信号比大信号更敏感我们希望对小信号“放大”其量化间隔的影响对大信号“压缩”其影响。在Simulink中我们可以用A-Law Compressor模块在Communications Toolbox的Utility子库中来模拟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调制器我们可以遵循以下步骤这也是我调试过好几次后觉得最稳定的连接方式差分编码这是DBPSK的关键。用XOR异或模块来实现。将当前的输入比特与上一个时刻的比特进行异或运算。如果当前比特与前一比特相同则输出0代表相位不变如果不同则输出1代表相位反转。这就需要用到Unit Delay模块来获取上一个时刻的比特值。双极性变换差分编码后的比特流0和1需要转换成适合调制的电平通常是1和-1。用一个Gain模块增益设为2然后减去1就可以实现0 - -1, 1 - 1。或者用MATLAB Function模块写个简单的2*u-1也行。载波相乘用一个Sine Wave模块产生高频载波比如频率设为1000 Hz1kHz。用Product乘法模块将双极性数字序列1/-1与载波正弦波相乘。当数字序列为1时输出就是原载波当为-1时输出就是反相的载波。这就完成了相位的切换即PSK调制。解调是调制的逆过程采用相干解调虽然叫差分编码但解调时仍需要载波同步只是对同步精度要求低相干解调将接收到的已调信号再次与相同的1kHz载波相乘。这个乘法运算会产生一个高频的2倍频分量和一个低频的基带分量。低通滤波用一个截止频率设置合理的低通滤波器比如800Hz滤除高频的2倍频分量剩下的就是包含原始数字信息的低频信号。这个信号在时间轴上对应发送的1或-1。抽样判决在最佳采样时刻通常需要时钟同步在简单仿真中我们可以用零阶保持器延迟半个符号周期来近似对滤波后的信号进行判决。如果采样值大于0判为1对应比特1小于0判为-1对应比特0。可以用一个Relational Operator关系运算符模块判断输入是否0输出布尔值。差分解码将判决得到的比特流再进行一次异或差分解码过程与发送端的差分编码完全一样就能恢复出原始的比特流。至此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 ExpanderA律扩张器模块参数与编码时的压缩器对称A87.6峰值2进行非线性扩张恢复出均匀量化前的幅度值。最后将这个幅度值与符号位转换为1或-1相乘恢复出原始的量化后采样值序列。第四步重建模拟信号。此时我们得到的是一串离散的采样值采样频率是20Hz。要还原出连续的模拟信号我们需要一个重建滤波器。它的作用是滤除由采样产生的高频镜像频谱只保留原来的基带信号。这里我们使用低通滤波器截止频率略高于原始信号的最高频率我们之前源信号用了6Hz和8Hz的滤波器。因此为用户1的通路连接一个截止频率为6Hz的低通滤波器为用户2的连接一个8Hz的低通滤波器。滤波器输出就是重建的模拟信号。为了更平滑可以适当提高滤波器的阶数。8. 眼见为实仿真结果分析与调试心得搭建完所有模块并连接好线后点击运行仿真。要直观地看到效果一定要多用Scope示波器模块。我通常会连接几个关键的观测点发送端两路源信号滤波后的波形。发送端两路信号经过PCM编码后的二进制比特流可以用Time Scope并以离散模式显示。发送端TDMA复用后的合并数据流。发送端DBPSK调制后的已调波形高频正弦波。接收端解调并判决恢复出的比特流。接收端最终重建的两路模拟信号。将第1个和第6个示波器的波形放在一起对比是验证系统成功与否的关键。理想情况下无噪声信道两条曲线应该几乎完全重合。你可能会看到重建的信号比原信号有轻微的延迟这是正常的因为处理各个环节都需要时间。还会看到一些量化带来的台阶状波形这是因为PCM量化引入了量化噪声提高量化位数比如从8位增加到16位可以明显改善。在实际调试中最容易出问题的地方是时序同步。各个模块的采样时间设置不一致会导致数据丢失或错位。务必检查所有零阶保持器、量化器、滤波器以及脉冲发生器的采样时间或周期参数确保它们之间是整数倍关系并且整个数据流是顺畅的。另一个常见问题是数据格式比如模块输出是布尔型、uint8还是double型不匹配会导致连接错误。多使用Data Type Conversion模块进行显式转换。当你第一次看到发送和接收的波形在示波器上紧紧跟随那种整个系统从无到有、在自己手中活起来的感觉是看书和做题无法比拟的。这个基于Simulink的PCM-Hamming-TDMA-DBPSK链路虽然是一个简化模型但它涵盖了现代数字通信系统最核心的流程。通过动手搭建它你不仅理解了每个模块的“为什么”和“怎么用”更掌握了用仿真工具解决复杂工程问题的思路。下次你可以尝试在其中加入噪声信道观察汉明码如何纠错或者调整TDMA的时隙分配看看对信号还原的影响。仿真世界的大门从此为你敞开。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2409033.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!