简介:数字通信系统中,信道编码以增加冗余为代价换取可靠性,其核心指标是误码率与编码增益。香农限揭示了容量上限,而线性分组码、循环码与卷积码则通过不同机制逼近这一极限。理解生成矩阵、校验矩阵、最小汉明距离及Viterbi译码的路径度量逻辑,是掌握FEC前向纠错的关键。工程实践中,CRC校验、LDPC码、Turbo码已广泛用于以太网、5G NR与卫星链路。在课件制作或教学培训中,将编码原理与实际误码率曲线、硬判决与软判决增益对比结合,能有效避免常见误区,让工程师快速选型码率与纠错能力,平衡性能与实现复杂度。本文从PPT叙事结构出发,拆解分组码算例、卷积码网格图绘制与仿真演示方法,为通信课程设计提供可落地的参考。
1. 信道编码.pptx:一份能把误码率讲明白的课件为什么难做
在通信原理这门课里,信道编码是最容易被“讲死”的一章。很多刚站上讲台的老师或做内部培训的一线工程师,拿到一份《通信原理》信道编码.pptx,通常的做法是按樊昌信第七版的顺序:先写编码定义,再抄线性分组码公式,最后放一张误码率曲线,然后学生听完只记得“卷积码很复杂”。问题不在内容,而在叙事:信道编码本质是“用多余度换可靠性”的工程权衡,课件如果只堆数学推导,不让学生看见编码增益、码率和复杂度三者怎么打架,这页PPT就是无效的。
这篇笔记基于我自己打磨这份课件的经验,讲清楚信道编码章节到底该怎么组织、哪些页面值得做厚、哪些公式必须配算例,以及仿真曲线和课堂演示里最常见的几个坑。受众是通信专业学生、高校青年教师,以及需要给硬件/嵌入式团队讲链路可靠性的工程师。目标只有一个:按这份思路做完PPT,你能让听的人不仅看懂编码原理,还能说出“这段链路该选哪种编码、码率取多少、纠错能力够不够”。
2. 先立框架:信道编码PPT的三种打开方式与选型理由
2.1 从“为什么要编码”切入:香农限与误码率地板
信道编码这一章,最忌讳一上来就抄生成矩阵。我会先花一页PPT讲一个反直觉的事实:数字通信系统的误码率存在一个物理下限,而这个下限离工程师想要的“零差错”差距很大。
背景铺垫是香农第二定理:在一个带宽为 B、信噪比为 SNR 的加性高斯白噪声信道上,信道容量 C = B·log2(1+SNR)。只要传输速率 R 小于 C,就存在一种编码能让误码率任意小。这句话学生都会背,但很少人意识到它意味着“误码率曲线不会无限逼近0,而是有一个编码增益的天花板”。实际工程里,你不可能无限增加编码冗余,因为带宽和时延都有限。
所以我的PPT第2页会放一张“无编码BPSK误码率 vs 香农极限”的示意图:横轴是Eb/N0,纵轴是误码率。图上画三条线——香农限、未编码BPSK、某一种编码后的曲线。让学生看到编码能把同样误码率对应的信噪比需求往左推几个dB,这个“左边距”就是编码增益。课件里文字不要多,但这个图必须大,因为整章所有内容都是在解释这个左移是怎么做到的。
2.2 从“差错控制三策略”展开:检错重发、前向纠错、混合纠错
第三页PPT我会停下来,把差错控制的三种策略对比做成一页表格,而不是直接进入编码数学。这个表格在《通信原理》教材里通常只是几行字,但这恰恰是工程选型的起点。
| 策略 | 典型编码 | 是否需要反向信道 | 适用时延 | 典型场景 |
|---|---|---|---|---|
| 检错重发(ARQ) | CRC、奇偶校验 | 需要 | 较高 | 以太网、I2C、Modbus |
| 前向纠错(FEC) | 汉明码、BCH码、卷积码、RS码 | 不需要 | 较低 | 卫星链路、移动通信、无线传感器 |
| 混合纠错(H-ARQ) | Turbo码 + CRC | 需要 | 中等 | LTE/5G高速数据 |
这一页的关键是让学生明白:信道编码分为“检错码”和“纠错码”,检错码像CRC,便宜但不能省重传;纠错码直接纠正,但冗余位会吃掉有效吞吐。嵌入式工程师接触过的I2C、SPI总线里通常只做奇偶校验或CRC,那是因为总线时延低、重传成本低;而卫星通信里信号往返数百毫秒,重传一次代价太大,所以必须用RS+卷积级联的前向纠错。
这一页PPT我可以给你一个具体的排版建议:表格放在页面中间偏左,右侧留白,用三行大字标注结论——“低时延链路用检错重发”“长时延链路用前向纠错”“高吞吐链路用混合纠错”。这个结论后面讲交织、级联码时还要反复引用。
2.3 确定PPT的叙事主线:分组码→卷积码→级联与Turbo/LDPC
框架打好后,整章PPT我建议只走一条主线:从“能算明白的”分组码,到“性能更强但看不见的”卷积码,再到“现代通信系统真正在用的”级联码与Turbo/LDPC。这条线的逻辑是“编码性能越来越强,但讲述和工程复杂度也越来越高”。
分组码先讲汉明码和CRC,因为这两个能用手算验证。汉明码的生成矩阵、校验矩阵、伴随式译码都是有限域上的线性代数,学生只要会矩阵乘法就能立刻算出一个码字的纠错过程。CRC则是工程中最常见也最容易被低估的内容,它本质上是循环码,用多项式除法实现,硬件上就是一个移位寄存器异或网络,这一点后面单独展开。
卷积码需要引入状态、网格和Viterbi译码,视觉化要求很高。我喜欢把它比作“动态规划找最短路径”,这个比喻学生接受度极高,但前提是网格图要画清楚,不能一页PPT就塞三张图。建议做成连续三页:第一页只有状态转移表,第二页画网格图的一部分,第三页放完整网格和一个路径回溯示例。
最后,级联码和Turbo/LDPC只需要做到概念层。鲁棒性强的讲述是:级联码把“纠正突发错误”的RS码和“纠正随机错误”的卷积码串联,Turbo码用两个卷积码并行交织迭代译码,LDPC码用稀疏校验矩阵和置信传播算法逼近香农限。这里不需要写满公式,重点是给一张5G NR编码方案表——数据信道用LDPC,控制信道用Polar码,这是当前最真实的工程参考。
3. 把线性分组码和循环码讲成“可计算”的内容:PPT页面的公式与算例设计
3.1 线性分组码的最小距离与纠错能力:一个(7,4)汉明码的完整算例
线性分组码的开篇公式只有一个核心:最小汉明距离 dmin。我需要让学生建立两个条件反射:dmin ≥ 2e+1 时可以纠正 e 个错误;dmin ≥ e+1 时可以检测 e 个错误。很多PPT直接把这两个不等式写出来就翻页,结果学生记混。我的做法是放一个(7,4)汉明码的具体算例,让学生亲手把四个信息位编成一个七位码字,并演示它在接收端出错后的译码流程。
(7,4)汉明码的生成矩阵典型形式如下:
import numpy as np # (7,4)汉明码生成矩阵: 系统码形式 [I4 | P] G = np.array([ [1, 0, 0, 0, 1, 1, 0], [0, 1, 0, 0, 1, 0, 1], [0, 0, 1, 0, 0, 1, 1], [0, 0, 0, 1, 1, 1, 1] ], dtype=int) # 校验矩阵 H = [P^T | I3] H = np.array([ [1, 1, 0, 1, 1, 0, 0], [1, 0, 1, 1, 0, 1, 0], [0, 1, 1, 1, 0, 0, 1] ], dtype=int) info = np.array([1, 0, 1, 1]) # 信息位 codeword = np.dot(info, G) % 2 # 编码: 信息位 * 生成矩阵模2 print("编码输出:", codeword) # 模拟接收端发生1位错误 received = codeword.copy() received[2] ^= 1 # 第3位翻转 syndrome = np.dot(H, received) % 2 # 伴随式 print("接收向量:", received) print("伴随式:", syndrome) # 查找伴随式对应的错误位置: 伴随式恰好等于H中该列 error_pos = -1 for col in range(H.shape[1]): if np.array_equal(H[:, col], syndrome): error_pos = col break if error_pos >= 0: corrected = received.copy() corrected[error_pos] ^= 1 print("纠错后:", corrected)这段代码的逻辑是:编码时用生成矩阵 G 把四比特信息映射成七比特码字;接收端用校验矩阵 H 计算伴随式。伴随式为全零说明无错,非零时它对应 H 中某一列,那一列的位置就是错误位置。这里的参数核心是 dmin=3,所以它能纠正 t=1 位错误,检测 2 位错误。注意代码里用的是系统码形式,前四位就是信息位本身,后三位是校验位,这种结构在PPT上最好演示,因为学生能直接核对“信息位没变,多出来三位”。
我写这段代码一般会当场跑一遍,并让学生跟着手算一位错误的伴随式。PPT上只放“生成矩阵、接收向量、伴随式、纠错结果”四行,不要把代码全粘上去——课件里放代码块是给讲师看的备课注释,学生看的是算例分步结果。
3.2 生成矩阵与校验矩阵的PPT呈现:从矩阵到电路
很多通信原理PPT在这里会陷入“矩阵乘法堆砌”,学生看不懂,老师讲得也累。我的解决办法是:矩阵公式只出现一页,第二页立刻把它画成编码器电路图。
(7,4)汉明码的编码电路就是一个异或门网络:三个校验位分别是信息位某些组合的模2和。比如常见码位安排下,校验位 p1 = d1 ⊕ d2 ⊕ d4,p2 = d1 ⊕ d3 ⊕ d4,p3 = d2 ⊕ d3 ⊕ d4。这个用PPT的文本框加直线就能画出来,不需要绘图软件。关键是让学生看到:矩阵乘法不是黑匣子,而是“哪些位参与异或”的规则。
译码端同理。伴随式的三个比特就是三个校验方程的失败指示器。我一般会设计一页“伴随式与错误位置对照表”:
| 伴随式 | 错误位置 |
|---|---|
| 001 | 第1位 |
| 010 | 第2位 |
| 100 | 第3位 |
| 011 | 第4位 |
| 101 | 第5位 |
| 110 | 第6位 |
| 111 | 第7位 |
这张表在PPT上比公式直观得多。学生只要算一次伴随式,查表就知道纠谁。这个“查表”思想延续到后面的卷积码就是“最大似然路径搜索”,打分页能建立很好的连贯性。
3.3 CRC循环冗余校验:用多项式除法讲透工程中最常见的信道编码
CRC在通信原理教材里通常放在循环码一节之后,但工程上它的重要性远超汉明码。嵌入式工程师调试I2C、Modbus、TTY电流环时都在用CRC,却很少意识到这就是信道编码里循环码的工程实现。我在PPT里会专门留三页给CRC:第一页讲多项式表示与生成多项式,第二页讲手工长除法,第三页给一段能直接搬到微控制器上的查表算法。
先看最核心的编码过程。发送端把待发送数据多项式 M(x) 左移 r 位(r 是生成多项式次数),然后除以生成多项式 G(x),余数就是校验位。接收端收到数据后同样做除法,余数为零则认为没错。这里参数最重要的是生成多项式选择:CRC-8常用多项式 x^8+x^2+x+1,CRC-16常见 x^16+x^15+x^2+1,CRC-32是 x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1。PPT上需要列一张“常见生成多项式与误码检测能力”表,但不必让学生背多项式,只要强调“生成多项式的选取决定了检错能力,最高次数等于校验位长度”。
算例用短数据最清楚。假设数据是 0x53(二进制1010011),用 CRC-8 多项式 x^8+x^2+x+1(0x07)编码,可以用下面这段 Python 验证:
def crc8(data_bytes, poly=0x07, init=0x00): crc = init for byte in data_bytes: crc ^= byte for _ in range(8): if crc & 0x80: crc = ((crc << 1) ^ poly) & 0xFF else: crc = (crc << 1) & 0xFF return crc # 数据: 0x53, 附加的校验字节 data = [0x53] checksum = crc8(data) print("CRC-8校验字节: 0x%02X" % checksum) # 接收端完整校验: 数据 + 校验字节 全算一次 rx_with_crc = data + [checksum] print("接收端余数: 0x%02X" % crc8(rx_with_crc))这段代码的关键参数是 poly=0x07 和 init=0x00。poly 是省略了最高位 x^8 后的低八位表示;init 是CRC寄存器的初值,很多协议会用 0xFF,这一点是工程里最容易踩的坑——同一个多项式,初值不同,算出来的CRC完全不同。PPT上我建议同时展示“初值0x00”和“初值0xFF”两个结果,并注明“查表法只是把逐位计算变成查表,但初始值和处理顺序(MSB先还是LSB先)必须跟协议一致”。
我一般讲到这里会加一句俗话:CRC这种“看起来像黑匣子”的校验,本质就是一次多项式长除法,工程上所谓“CRC不匹配”八成是初值、字节序或反射处理不一致,不是算法本身有问题。
4. 卷积码与Viterbi译码:PPT里最难画的图,怎么分解成动画/分步图
4.1 卷积码的约束长度与编码率:状态图、树图、网格图三件套
卷积码跟分组码最大的区别是:它没有明显的“码字边界”,编码器输出的校验位不仅与当前输入有关,还与前几个输入有关,这个“记忆深度”就是约束长度。PPT上的定义通常写成 K = m+1,其中 m 是编码器中寄存器的个数。码率 R = k/n,比如(2,1,3)卷积码的意思是每输入1比特、输出2比特,约束长度3。
这个定义学生能背,但理解需要三种图。状态图展示编码器在某一时刻的状态跳转;树图展开时间维度,展示不同输入序列产生的输出;网格图把树图折叠起来,形成“列”状结构,是Viterbi译码的基础。很多PPT把三张图堆在同一页,视觉效果爆炸。我的顺序是:状态图放左半页,配状态转移表;树图放右半页,只画前三级;网格图单独占下一页,并且每一列用不同底色区分不同时间步。
这里要特别强调约束长度的物理意义:约束长度越长,同一时刻的编码输出越依赖于更早的信息,抗噪声能力理论上越强,但译码复杂度呈指数上升。以(2,1,3)为例,状态数是 2^(m)=4 个;如果约束长度变成 9,状态数是 256,Viterbi译码的路径度量计算量会暴涨。PPT上可以画一条“约束长度 vs 状态数”的折线,让学生直观看到复杂度爆炸曲线。
4.2 Viterbi译码的“最小路径度量”逻辑:一个(2,1,3)卷积码的手算网格
我在课堂上发现,Viterbi译码如果用“网格图上找最短路径”这个说法开场,学生第一反应是“这不就是数据结构里的Dijkstra嘛”。没错,Viterbi算法就是前向动态规划,只是每一步只保留幸存路径。PPT上要拆成五步:
第一步,初始化:在第0时刻所有状态度量为0。第二步,在第1时刻,从起始状态出发,计算每个分支的汉明距离(接收序列与分支输出比较),更新到达状态的度量。第三步,从第2时刻开始,每个状态可能有两条汇入路径,只保留度量最小的一条,另一条删除。第四步,继续到接收序列末尾,选出全局度量最小的状态。第五步,从终点向前回溯,得到译码输出。
手算算例我用最常讲的(2,1,3)卷积码,生成多项式通常用八进制表示为 7 和 5(即二进制111和101)。下面这段代码演示了网格度量更新的前几步,适合抄到PPT讲义里:
# (2,1,3)卷积码: 生成多项式 G0=7(111), G1=5(101) # 编码器状态用寄存器的后两位表示: 00,01,10,11 states = ['00', '01', '10', '11'] def next_state_and_output(state, bit): reg = int(state, 2) next_reg = ((bit << 2) | (reg >> 1)) & 0b11 # 输出: 当前输入+上一状态参与模2卷积 out0 = (bit ^ (reg >> 1 & 1) ^ (reg >> 0 & 1)) # 多项式111 out1 = (bit ^ (reg >> 1 & 1)) # 多项式101 return f'{next_reg:02b}', f'{out0}{out1}' # 从状态00开始, 分别输入0和1, 打印状态转移 for start in ['00']: for bit in [0, 1]: ns, out = next_state_and_output(start, bit) print(f"状态{start} 输入{bit} -> 状态{ns}, 输出{out}")这段代码的核心逻辑是模拟卷积编码器的移位寄存过程。参数里最需要注意的是生成多项式的位数与约束长度匹配:约束长度3意味着多项式用三位表示,最高位对应当前输入,后两位对应移位寄存器内容。输出计算本质是“当前输入与寄存器某些位异或”。在PPT上跑这段代码前,我会先让学生根据状态转移表手工画网格图,再用代码验证,这样代码不是黑匣子,而是算例的自动化复核。
Viterbi译码的完整代码我会放在PPT的“扩展阅读”附录里,不占用课堂时间。课上只要把核心思想——“每步只留最小度量路径”——用一个网格图动画讲透就够了。PPT的动画功能可以用:每点击一次,出现一个新列,同时旧路径中度量较大的分支变成灰色。这个动画用PowerPoint自带的“擦除”动画效果就能做,不需要额外插件。
4.3 编码增益怎么量化:用Python画BER曲线并截图放进PPT
卷积码这一章最重要的工程结论是编码增益曲线。我不会直接贴教材截图,而是课堂上用Python现场生成一张BER对比图,再截图贴到PPT里存档。这样学生能看见仿真过程,也能理解“增益是在相同误码率下,横轴Eb/N0的差值”。
下面这段代码模拟BPSK调制下,未编码与(2,1,3)卷积编码+硬判决Viterbi译码的误码率对比:
import numpy as np import matplotlib.pyplot as plt from scipy.special import erfc from scipy.linalg import toeplitz # 未编码BPSK理论误码率 def ber_bpsk_uncoded(eb_n0_db): eb_n0 = 10 ** (eb_n0_db / 10) return 0.5 * erfc(np.sqrt(eb_n0)) # 简化卷积码性能: 使用近似编码增益 2.5dB (硬判决, (2,1,3)) def ber_conv_approx(eb_n0_db): # 编码速率1/2, 所以编码后每比特能量是未编码的一半, 但增益补偿 gain_db = 2.5 eb_n0_eff = 10 ** ((eb_n0_db - gain_db) / 10) return 0.5 * erfc(np.sqrt(eb_n0_eff)) eb_n0_range = np.arange(0, 9.1, 0.5) ber_uncoded = [ber_bpsk_uncoded(x) for x in eb_n0_range] ber_coded = [ber_conv_approx(x) for x in eb_n0_range] plt.figure(figsize=(8, 5)) plt.semilogy(eb_n0_range, ber_uncoded, 'k-o', label='BPSK未编码') plt.semilogy(eb_n0_range, ber_coded, 'b-s', label='(2,1,3)卷积码') plt.xlabel('Eb/N0 (dB)') plt.ylabel('误码率') plt.legend() plt.grid(True, which='both') plt.savefig('channel_coding_ber.png', dpi=150)这段代码的前两行是理论公式;应广大工程师要求,我直接用了近似增益2.5dB的简化模型,真实性能需要完整Viterbi仿真。所谓编码增益,是两条曲线“同一纵坐标的横坐标差”,比如误码率10^-4处,未编码需要约8.5dB,编码后只需要约6dB,增益就是2.5dB。注意,代码中我用了“编码速率1/2”的约束:同样码率下,编码信号带宽翻倍,所以横坐标必须用Eb/N0而不是SNR,否则会把带宽扩展带来的增益和编码增益混淆。这一点是PPT上最容易被忽略的学术规范,建议用一行红字标注在曲线图下面:比较基准是相同信道容量下的Eb/N0,不是SNR。
5. 信道编码PPT避坑指南:从符号错误到仿真曲线翻车的4个常见问题
5.1 现象:把校验位长度当码长,纠错能力算错
有一次我在企业内部培训授课,一个做无线抄表的老工程师拿着PPT问:“我们的数据包是32字节,CRC-16校验,那这算不算能纠正16比特错误的编码?”这就是被教材里的“冗余位数”误导了。CRC-16只能保证检测能力,完全没有纠错能力,它的校验位长度是16,但不代表dmin是16。
原因是很多PPT在讲循环码时,把“生成多项式次数r”和“能纠错t位”混在一起。实际上,CRC是检错码,它的检错能力和生成多项式的因式结构有关,比如生成多项式含(x+1)因子就能检测奇数个错误,这与汉明码的dmin=3完全不是一回事。解决这个问题的方法是在PPT里做一张“编码类别对比表”,明确区分检错码、纠错码,以及各自的“可计算参数”:检错码看生成多项式和突发错误长度;纠错码看dmin和t。
5.2 现象:硬判决和软判决的增益差被学生误解
每次讲到Viterbi译码,总有人问“为什么教材里的卷积码增益曲线有3~4dB,而我的仿真只有2dB”。原因多半是仿真用了硬判决,而教材曲线画的是软判决。硬判决在解调器输出只有0/1,每个比特只提供1比特信息;软判决输出量化后的可靠性信息,比如3比特量化代表8个置信等级,译码器能利用“这个比特不太确定”的信息来修正路径度量。
PPT这里我会画一个对比示意图:左边硬判决量化成两格,右边软判决量化成八格,下面标注“软判决可获得约2dB额外增益”。这不是玄学,而是信息论里的“量化损失”问题——越粗的量化丢弃越多软信息。给学生的建议很直接:工程实现但凡算力允许,优先用软判决;FPGA实现时最少用3比特量化,再低增益损失就明显了。
5.3 现象:仿真曲线低信噪比处“编码后更差”,被问得说不出话
这个现象几乎每年都会出现。你在PPT上放BER曲线,编码后的曲线在低信噪比区域反而高于未编码曲线,学生立刻抓住问题。这不是编码没用,而是“对比基准错了”。当Eb/N0很低时,信道本身已经很恶劣,编码的冗余率又降低了有效信息传输效率,因此误码率确实可能比未编码更差。这正说明编码增益只在“中等信噪比以上”才能体现,也就是“编码阈值”的概念。
我的PPT上会明确标注三条线:未编码曲线、编码曲线、香农极限线,并在图中圈出“交叉区”。然后加一句注释:如果交叉区出现在误码率10^-2以上,说明这个编码需要配合交织或更长的约束长度才能发挥;如果交叉区左移很厉害,说明编码方案选得不对。这个问题一定要在讲完曲线后主动抛出来,否则学生课后自己仿真时会被这个交叉吓到,以为代码写错了。
5.4 现象:PPT里只放公式不放工程场景,学生上手就忘
最后一个坑来自课件本身。很多PPT讲完RS码和卷积码,学生能默写生成多项式,但问他“手机4G/5G哪个信道用了Turbo,哪个用了LDPC”,答不上来。因为课件缺了“映射到真实协议”这一环。我在章节末尾固定放一张“真实系统编码方案表”:WiFi 6的LDPC码率可选5/6、3/4、2/3、1/2;5G NR数据信道用LDPC,控制信道用Polar码;NB-IoT上行用Turbo码,下行用LDPC;北斗短报文用RS+卷积级联。这张表不需要详细参数,只需“协议名 + 编码类型 + 码率范围”,作用是让学生知道教科书公式在现实中长什么样。
解决这个问题的最小的课堂动作是:在PPT每页右下角加一个“工程一角”小字条。比如讲CRC时,加“Modbus RTU就是CRC-16,初值0xFFFF”;讲汉明码时,加“DDR5 ECC纠错内存用的是广义汉明码”。这些小字条不需要扩展讲解,但能极大提升“这课有用”的感知。
6. 让信道编码PPT能“动起来”:四个进阶演示与课后验证技巧
6.1 用Excel模拟BSC信道下的汉明码译码
如果课堂上不想开Python,Excel也能完成分组码的动态演示。做法是:第一行生成7位随机0/1码字,第二行按错误概率翻转某一位,第三行用校验矩阵计算伴随式,第四行用IF函数匹配错误位置并纠正。Excel公式里MOD和SUMPRODUCT函数足够表达模2运算,30分钟能做出一个可交互的“错误注入器”。这个演示的好处是学生能手动改错误位置,立即看到伴随式变化,比静态PPT记忆更牢。
我更倾向于把Excel作业放在课后,课上仍以PPT动画为主。因为Excel带给学生的体验是“我亲手做了一次信道编码”,这比任何直播间或短视频里的动画都更有代入感。
6.2 课堂演示:把一张图片做BPSK调制+信道编码+纠错,用误码前后对比引出交织
有一个我屡试不爽的课堂演示:把一张二维码图片当作信源,先做BPSK调制,加入高斯白噪声,直接解调,得到一张布满雪花点的图片;再用同样噪声但先经过(7,4)汉明码编码,解调译码后,图片恢复干净。这个演示的关键在于加噪程度——要控制到未编码时肉眼可见明显误码,但编码后能完全修复。如果噪声太大,汉明码也救不回来,演示就翻车。
我做过的经验值是:256x256像素的灰度图,每个像素用8比特表示,BPSK调制后加高斯白噪声使Eb/N0约等于6dB。这个工况下未编码解调误码率大约在1%量级,图片有可见噪点;而(7,4)汉明码在随机单比特错误下能全部纠正,图片无损。这个演示之后,我可以很自然地引入交织的概念:如果噪声是突发噪声,比如一段脉冲干扰,汉明码会连续错上好几个比特,纠不过来;这时把编码后比特按行列交织,让突发错误分散到多个码字里,就能恢复。PPT上配一张“交织前后错误分布对比”的图,这个知识点就闭环了。
6.3 课后作业:给一段I2C数据包,让学生手工计算CRC-8
我会布置一个非常工程化的作业:给出一段I2C通信中的寄存器写入数据包,例如设备地址 0x50,寄存器地址 0x10,写入数据 0xA5,需要学生手工计算CRC-8,并说明如果该数据包使用Modbus协议,CRC应该交换高低字节。这个作业看起来简单,但能一次性训练多项式除法、字节序、初值三个知识点。
作业答案可以直接用第3.3节的Python验证。评分关键点不是结果对不对,而是看学生有没有写出“先左移8位,再除以生成多项式”的中间步骤。这个步骤在工程中对应硬件移位寄存器,也是很多CRC仿真代码北漂后出错最多的地方。
6.4 期末必考读图题:编码增益、码率、时延三角权衡
课程最后30分钟,我会专门设计一页“三角权衡”图,一个三角形的三个顶点分别写“编码增益(dB)”“码率(有效吞吐)”“译码复杂度/时延”。这页PPT不讲新知识,只用来总结:任何信道编码方案都是在这三个维度找平衡。比如汉明码增益小但时延极低,Turbo码增益逼近香农限但译码时延很大,LDPC码在中等时延下增益接近Turbo但更便于并行实现。
期末考试的压轴题我会用这个三角出:题目给一个高速无线点对点系统,要求误码率10^-6,时延不超过1ms,现有三套方案——汉明码、卷积码(硬判决)、LDPC码。让学生画出横轴为码率、纵轴为编码增益的散点图,并选择一个方案说明理由。这道题没有唯一答案,但答得太离谱的一定是没搞懂码率与编码增益的换算关系。
作为收尾,我习惯在最后一张PPT写上:信道编码章节最重要的不是你记住了多少生成多项式,而是你能判断一段链路“值不值得加编码、加几成冗余、用什么算法解”。这句话会一直留在课程说明里。我这些年讲了多遍,发现最能让学生记住的永远是动手算过的那一页,而不是我听过的公式。希望这篇拆解和算例能帮你也做出一份真正能落地、能讲明白的信道编码课件。
本文还有配套的精品资源,点击获取