Reed-Muller (RM) 码编译码通信链路仿真
项目介绍
本项目构建了一个基于 MATLAB 的 Reed-Muller (RM) 线性分组码通信系统仿真平台。项目通过代码实现了 RM 码的完整通信链路,包括生成矩阵的构建、编码、BPSK 调制、AWGN 信道传输、硬判决解调以及经典的 Reed 大数逻辑译码。该平台旨在验证 RM 码的纠错性能,并通过蒙特卡洛仿真绘制误比特率 (BER) 曲线,直观展示不同信噪比下的系统表现。
功能特性
- 参数化 RM 码构建:支持通过参数 $r$ (阶数) 和 $m$ (扩展参数) 自动构建 RM 码的生成矩阵 $G$,代码中默认为 RM(2, 5)。
- 全链路仿真环境:集成了随机信息生成、线性分组编码、二进制相移键控 (BPSK)、加性高斯白噪声 (AWGN) 信道模拟。
- Reed 大数逻辑译码:在接收端实现了基于硬判决的 Reed 译码算法,利用 RM 码的代数几何结构进行错误纠正。
- 蒙特卡洛性能分析:在指定 SNR 范围 (0-8 dB) 内进行大量帧传输,统计误码率,并与未编码 BPSK 理论值进行对比,输出 BER 曲线图和部分比特流对比图。
系统要求
- MATLAB R2016b 或更高版本
- Signal Processing Toolbox (可选,但推荐用于辅助分析,本项目核心算法均为原生实现)
使用方法
- 确保 MATLAB 工作路径包含本项目文件。
- 直接运行主函数
main。 - 程序将输出仿真过程中的 SNR 进度、误码统计数据。
- 运行结束后,系统将自动弹出两张图表:
*
BER 性能仿真图:展示 RM(2,5) 仿真曲线与未编码理论曲线的对比。
*
比特流对比图:展示发送端原始信息与接收端译码恢复信息的对比(前 50 bit)。
代码实现逻辑详解
本项目主要由主控流程和核心算法函数组成,以下是 main.m 中实际实现的详细逻辑:
1. 系统参数初始化
程序首先定义了 RM 码的关键参数,默认配置为 $m=5, r=2$,从而确定码长 $n=32$。随后定义了仿真参数,包括信噪比范围 (0 到 8 dB,步长 1 dB)、最小统计错误数 (100) 和最大仿真帧数 (10000),以确保统计结果的可靠性。
2. 生成矩阵构建 (build_rm_matrix)
在仿真循环开始前,程序调用
build_rm_matrix 函数。该模块实现了 RM 码生成矩阵的代数构建:
- 基向量生成:构建 $m$ 个长度为 $2^m$ 的布尔基向量,对应布尔函数中的变元 $x_1, ..., x_m$。
- 单项式扩展:遍历从 0 阶到 $r$ 阶的所有阶数,利用
nchoosek 生成对应阶数的所有变量组合。 - 矩阵合成:将所有生成的单项式向量(包括 0 阶的全 1 向量)作为行向量,组合成生成矩阵 $G$。同时记录每一行对应的单项式变量结构 (
mono_struct),为后续译码做准备。
3. 蒙特卡洛仿真主循环
程序对每一个 SNR 点执行以下闭环操作:
- 信息源:产生长度为 $k$ 的随机二进制序列
msg。 - RM 编码:执行矩阵乘法 $c = u cdot G pmod 2$,将 $k$ 位信息映射为 $n$ 位码字。
- BPSK 调制:采用映射规则 $0 to +1, 1 to -1$ 将二进制码字转换为发送信号。
- AWGN 信道:根据当前的 SNR ($E_b/N_0$) 和码率 ($R=k/n$) 计算噪声标准差 $sigma$,并叠加高斯白噪声。
- 硬判决解调:接收端根据接收信号符号进行判决(正数为 0,负数为 1),生成
rx_hard 序列。 - Reed 译码:调用
reed_decoder 函数,传入接收到的硬判决序列及码结构信息,恢复出原始信息序列 decoded_msg。 - 误差统计:比对原始信息与译码信息,累计误比特数,直到满足统计要求或达到最大帧数。
4. 性能分析与可视化
- 理论对比:计算未编码 BPSK 的理论误码率 $P_e = 0.5 times text{erfc}(sqrt{E_b/N_0})$ 作为基准。
- 绘图:使用
semilogy 绘制 BER 曲线,坐标轴采用对数刻度;使用 stem 绘制最后一次传输的比特流直观对比。
关键算法与函数分析
主流程 (main)
这是程序的入口,负责调度整个仿真实验。其中的关键逻辑在于噪声功率的计算,代码严格遵循了 $E_s/N_0 = R times E_b/N_0$ 的关系,保证了信噪比设置的物理意义准确。
生成矩阵构建器 (build_rm_matrix)
该函数不仅构建了编码所需的数学矩阵 $G$,还输出了译码器至关重要的 mono_struct。
- 它通过位运算 (
bitget) 聪明地生成了所有可能的输入索引对应的变量值矩阵 $Z$。 - 通过阶数循环,确保生成矩阵的行是按照阶数(0阶, 1阶, ... r阶)有序排列的,这符合 RM 码的标准定义。
译码器调用 (reed_decoder)
虽然代码片段主要展示了调用过程,但从调用参数
(rx_hard, r, m, k, mono_struct) 可以看出,该实现采用了典型的 Reed 大数逻辑译码方案。它依赖于生成矩阵构建阶段保留的单项式结构信息 (
mono_struct) 来构造正交校验和,通过多数表决机制逐阶求解原始信息位。
硬判决逻辑
代码中显式实现了硬判决解调:rx_hard(rx_signal < 0) = 1。这意味着译码器输入的是二值序列,即采用的是硬判决译码算法,相较于软判决算法,计算复杂度更低,适合硬件实现。