一、摘要本文搭建一套端到端简易数字通信系统完整流程随机信源序列→哈夫曼无损压缩信源编码→(7,4) 汉明码信道纠错编码→BSC 二进制对称信道加噪声传输→汉明译码纠错→哈夫曼译码恢复原始信源。通过改变 BSC 信道交叉概率统计不同噪声强度下系统整体传输正确率对比有无信道编码两种场景的性能差异分析信源编码、信道编码、噪声信道对通信可靠性的影响。实验融合信息论两大核心模块无损信源压缩与差错控制编码兼具理论推导与程序仿真完整复现现代数字通信底层流程。关键词信息论哈夫曼编码汉明码BSC 信道通信链路仿真二、实验目的掌握离散无记忆信源熵、哈夫曼最优前缀编码原理与编解码实现掌握 (7,4) 汉明码生成矩阵、校验矩阵构造、校验子纠错机制理解 BSC 二进制对称信道噪声模型搭建串联式完整通信链路区分信源编码与信道编码的不同作用定量分析信道噪声强度对传输正确率的影响验证信道编码的纠错增益学会通过仿真数据、对比曲线完成实验分析完成标准化课程大作业。三、理论基础3.1 哈夫曼信源编码离散信源熵哈夫曼自底向上合并最小概率节点生成最优二元前缀码实现无损压缩降低传输比特量。译码时利用前缀特性唯一还原原始符号。3.2 (7,4) 汉明码(7,4) 汉明码4 位信息位3 位校验位码长 7可纠正1 位随机错码。 标准生成矩阵 G校验矩阵 HS0无错码S0校验子对应 H 矩阵列定位错误比特并翻转纠错。3.3 BSC 二进制对称信道信道交叉概率p比特传输时以概率p翻转0↔11−p正确传输。 p越大信道噪声越强误码越多。3.4 完整通信系统链路原始信源符号 → 哈夫曼编码压缩→ 比特流分组 → (7,4) 汉明编码加校验纠错→ BSC 信道加噪声 → 汉明译码纠错 → 比特流拼接 → 哈夫曼译码 → 恢复原始符号 对比实验组去掉汉明编码模块仅哈夫曼编码直传作为无纠错对照组。四、系统整体设计与代码实现import math import random import matplotlib.pyplot as plt import numpy as np plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False random.seed(2026) np.random.seed(2026) # 1. 哈夫曼编码模块 class HuffNode: def __init__(self, sym, prob): self.sym sym self.prob prob self.left None self.right None def huffman_encode(src_dict): nodes [HuffNode(s, p) for s, p in src_dict.items()] while len(nodes) 1: nodes.sort(keylambda x: x.prob) n1 nodes.pop(0) n2 nodes.pop(0) new_node HuffNode(None, n1.prob n2.prob) new_node.left n1 new_node.right n2 nodes.append(new_node) code_map {} def traverse(node, code): if node.sym is not None: code_map[node.sym] code return traverse(node.left, code 0) traverse(node.right, code 1) if nodes: traverse(nodes[0], ) # 拼接完整比特流 bit_stream for sym in src_seq: bit_stream code_map[sym] return code_map, bit_stream def huffman_decode(bit_stream, code_map): reverse_map {v: k for k, v in code_map.items()} res [] temp for bit in bit_stream: temp bit if temp in reverse_map: res.append(reverse_map[temp]) temp return res # 2. (7,4)汉明码模块 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] ]) H np.array([ [1,1,0,1,1,0,0], [1,0,1,1,0,1,0], [0,1,1,1,0,0,1] ]) def hamming_encode(info_bits): info np.array(info_bits, dtypeint) codeword info G % 2 return codeword.tolist() def hamming_decode(receive_code): r np.array(receive_code, dtypeint) S (r H.T) % 2 if np.all(S 0): return r[:4].tolist() # 查找错误列 for col_idx in range(7): if np.array_equal(S, H[:, col_idx]): r[col_idx] ^ 1 break return r[:4].tolist() # 3. BSC信道加噪声 def bsc_channel(bits, p): out [] for b in bits: if random.random() p: out.append(1 - b) else: out.append(b) return out # 4. 全局参数与仿真主函数 # 生成信源 src_dict {A:0.4, B:0.3, C:0.2, D:0.1} src_seq [A,B,A,C,A,B,D,A,C,B] def full_system_simulation(p, use_hammingTrue): # 1.信源编码 code_map, bit_str huffman_encode(src_dict) raw_bits [int(c) for c in bit_str] if not use_hamming: rx_bits bsc_channel(raw_bits, p) rx_bitstr .join([str(x) for x in rx_bits]) decode_sym huffman_decode(rx_bitstr, code_map) match sum(1 for a,b in zip(src_seq, decode_sym)) acc match / len(src_seq) return acc # 带汉明编码流程 encoded_blocks [] idx 0 while idx len(raw_bits)-4: block raw_bits[idx:idx4] encoded_blocks.append(hamming_encode(block)) idx 4 # 信道传输 rx_blocks [] for blk in encoded_blocks: noisy_blk bsc_channel(blk, p) rx_blocks.append(noisy_blk) # 汉明译码 recover_bits [] for blk in rx_blocks: info hamming_decode(blk) recover_bits.extend(info) # 截断对齐原始比特长度 recover_bits recover_bits[:len(raw_bits)] rx_bitstr .join([str(x) for x in recover_bits]) decode_sym huffman_decode(rx_bitstr, code_map) match sum(1 for a,b in zip(src_seq, decode_sym)) acc match / len(src_seq) return acc # 5. 多噪声点仿真绘图 if __name__ __main__: p_list [0, 0.01, 0.02, 0.05, 0.08, 0.1, 0.15, 0.2] acc_hamming [] acc_no_hamming [] for p in p_list: a1 full_system_simulation(p, use_hammingTrue) a2 full_system_simulation(p, use_hammingFalse) acc_hamming.append(a1) acc_no_hamming.append(a2) print(f交叉概率p{p:.2f} | 带汉明正确率:{a1:.3f} | 无汉明正确率:{a2:.3f}) # 绘图 plt.figure(figsize(10,6)) plt.plot(p_list, acc_hamming, markero, linewidth2, label带(7,4)汉明纠错编码) plt.plot(p_list, acc_no_hamming, markers, linewidth2, label仅哈夫曼无信道纠错) plt.xlabel(BSC信道交叉概率 p) plt.ylabel(端到端符号传输正确率) plt.title(不同信道噪声下完整通信系统传输正确率对比) plt.legend() plt.grid(True) plt.show()五、仿真结果输出示例曲线规律直观现象无噪声 p0两种方案正确率均 100%噪声轻微上升无汉明方案正确率断崖下跌加入汉明码后系统容错能力大幅提升同等噪声下正确率显著更高噪声极强p0.15时信道出现 2 位及以上错码汉明码无法纠正正确率同步下滑。六、实验结果深度分析6.1 信源编码与信道编码分工差异哈夫曼信源编码只负责压缩数据、减少传输比特总量无任何抗噪声能力。一旦比特流中任意 1 位出错前缀码译码直接错位后续所有符号全部译码失败因此无纠错模块时信道轻微噪声就会导致系统崩溃。(7,4) 汉明码信道编码通过增加冗余校验比特换取纠错能力能定位并修复单比特错误。代价是码率降低原始 4bit 信息占用 7bit 传输带宽开销上升但极大提升通信可靠性。6.2 噪声强度对系统的影响低噪声区间 (p0.05)大部分错码为单比特汉明码可完全修复传输正确率保持高位高噪声区间 (p0.1)一个 7 比特码字内大概率出现 2 位及以上错误校验子无法区分错误位置纠错失效系统正确率持续下降。6.3 工程权衡仅做信源压缩节省带宽但完全不耐信道噪声仅适用于无损理想信道光纤近距离无干扰传输信源 信道编码串联现代通信标准通用架构压缩减少流量、冗余校验对抗无线噪声在带宽开销与可靠性之间折中汉明码局限仅纠正单错无法应对突发多比特干扰工程中会搭配交织码、卷积码使用。七、实验结论哈夫曼编码可实现信源无损压缩但不具备抗干扰能力单独使用时通信系统鲁棒性极差(7,4) 汉明码通过引入校验冗余可纠正单比特信道错误显著提升 BSC 噪声信道下的传输正确率完整数字通信链路必须同时配置信源编码与信道编码二者各司其职信源编码优化传输效率信道编码保障传输可靠性信道噪声强度越高纠错编码带来的性能增益越明显但噪声超过纠错码容错上限后系统可靠性仍会快速恶化。八、参考文献[1] 傅祖芸。信息论基础第 3 版[M]. 电子工业出版社[2] 樊昌信。通信原理 [M]. 国防工业出版社[3] Cover T M. Elements of Information Theory信息论基础