LDPC码在CCSDS中设定的规范 (2006 Aug)

文章目录

CCSDS官网
https://public.ccsds.org/_layouts/15/osssearchresults.aspx?u=https%3A%2F%2Fpublic%2Eccsds%2Eorg&k=Low%2DDensity%20Parity%2DCheck

讲解链接
https://www.cnblogs.com/sea-wind2

LDPC原理
https://www.cnblogs.com/sea-wind2/p/4282640.html

CCSDS标准的LDPC编译码仿真
https://www.cnblogs.com/sea-wind2/p/4320943.html

background

20 世纪 90 年代中期的亮点是信道编码领域低密度奇偶校验码 (LDPCC) 的重新发现(参考文献 [C1.1])。这种编码技术最初由 R. Gallager 在 1961 年的博士论文中发明(参考文献 [C1.2]),但 30 多年来基本上被遗忘了。 LDPCC 的主要进步是发现了一种迭代解码算法,现在称为置信传播 (BP) 解码,该算法以可管理的复杂度为大型线性 LDPCC 提供近乎最佳的性能。在 20 世纪 60 年代初期,LDPCC 的性能提升在技术上很难实现。经过数十年的VLSI发展,终于使这些代码的实现变得实用。

最初的建筑现在称为 Gallager LDPCC,已被视为 LDPCC 的特殊类别。 LDPC 码构造的最新进展导致了新码的开发,其性能(可以说)比 Gallager LDPCC 有所提高。其中一类代码,不规则 LDPCC(参考文献 [C1.3]),展示了瀑布区域中性能的改进。然而,不规则码的缺点通常包括解码收敛所需的迭代次数的增加以及由不规则结构导致的码位之间的不等差错保护。使用基于有限几何的代数构造开发的另一类 LDPCC(参考文献 [C1.4])已被证明可以提供非常低的误差层和非常快的迭代收敛。这些品质使这些代码非常适合近地应用,这些应用需要非常高的数据速率和高可靠性。基于欧几里得几何 LDPCC(参考文献 [C1.5])的白皮书已在 2002 年秋季休斯敦会议上提交给 CCSDS 通道编码小组 P1B。该论文和后续研究是本实验规范中提供的代码的基础。

TECHNICAL FOUNDATION

线性块码在本实验规范中用(n,k)表示,其中n是码字(或块)的长度,k是信息序列的长度。 LDPC码是线性分组码,其中"1"的总数与奇偶校验矩阵中元素总数的比率<< 0.5。 '1'的分布决定了解码器的结构和性能。 LDPC 码由其奇偶校验矩阵定义。用于编码线性块代码的K×N发电机矩阵可以通过线性操作从奇偶校验检查矩阵派生。 (鼓励读者回顾参考[C1.8]以概述线性块代码)。

本规范中考虑的 LDPC 码是称为准循环码的一类代码的成员。这些代码的构造涉及并置较小的循环(或循环子矩阵)以形成较大的奇偶校验或基本矩阵。循环的示例如图 2-1 所示。请注意,每一行都是前一行的一位右循环移位(其中结束位环绕到开始位)。整个循环由其第一行唯一确定和指定。对于此示例,第一行有四个"1"或行权重为 4。

准循环奇偶校验矩阵的示例如图 2-2 所示。在这种情况下,准循环 10 × 25 矩阵由大小为 5 × 5 的 2 × 5 循环子矩阵的数组形成。为了明确描述该矩阵,仅使用每个循环子矩阵第一行中"1"的位置并且需要每个子矩阵在基本矩阵内的位置。

以这种方式构建奇偶校验检查矩阵有两个积极的特征:

1 使用移位寄存器可以使编码复杂度与代码长度或奇偶校验位成线性关系,并且

2 降低了集成电路互连中的编码器和解码器布线复杂性

BASE (8176,7156) LDPC CODE

本节介绍了基础(8176,7156)LDPC代码。由于下面概述的原因,实施应根据第2.5款所述的格式缩短基本代码。 (8176,7156)LDPC代码的奇偶校验检查矩阵是通过使用511×511正方形循环剂的2×16阵列形成的。这创建了尺寸1022×8176的奇偶校验检查矩阵。奇偶校验检查基础矩阵的结构如图2-3所示。

每个 A 都是 511 i,j × 511 循环。 32个循环体中每个的行重为两个;即,每行有两个" 1"。奇偶校验检查矩阵中每一行的总重量为2×16,或32。即,每列中有两个" 1"。平价检查矩阵中每列的总重量为2×2或四。表2-1定义了每个循环体中" 1的位置"。奇偶校验检查矩阵的散点图如图2-4所示,其中矩阵中的每个" 1"位均以一个点表示。

请注意,第二列中的数字表示每个循环的第一行中"1"的相对列位置。由于只有 511 个可能的位置,因此这些数字的范围只能是 0 到 510。第三列表示奇偶校验矩阵中"1"的绝对位置。总共有 8176 种可能;因此这些数字的范围只能是 0 到 8175。

2.3 编码

编码器可以使用参考文献[C1.6]中给出的方法进行设计。 (8176, 7156)码的生成矩阵由两部分组成。第一部分是系统循环形式的7154×8176子矩阵,如图2-5所示。它由一个 7154 × 7154 单位矩阵和两列 511 × 511 循环 Bi,js 组成,每列由 14 个循环组成。 Is 是 511 × 511 恒等子矩阵,0 是全零 511 × 511 子矩阵。第二部分由两个独立的行组成。第一部分生成(8176, 7156)码的(8176, 7154) LDPC子码。子码中的每个码字由 7154 个信息位和 1022 个奇偶校验位组成。由于 2.4 节中给出的原因,使用子代码实现有一些优点。循环 Bi,js 是根据下面给出的算法构建的:

基于图2-5中的生成矩阵来设计编码器的方法有很多种。这些方案的复杂性与码字或奇偶校验位的长度成正比(参见参考文献[C1.6])。

2.4 SHORTENED (8160, 7136) CODE

使用图 2-5 给出的生成器矩阵,可以使用参考文献 [C1.6] 中描述的电路来实现编码器。该编码器生成(8176, 7156)码的(8176, 7154) LDPC子码。当前的航天器和地面系统以 32 位计算机字大小操纵和处理数据。 (8176, 7154)和(8176, 7156)都不是32的倍数。将码字缩短到(8160, 7136)的维度是有益的。换句话说,通过使用18位虚拟填充将信息序列缩短为7136,可以使用(8176, 7154)子码编码器。这是通过用零对虚拟填充位进行编码但不传输它们来实现的;因此,总码字长度变为 8158。请注意,无需向生成矩阵添加两个独立行来编码完整的 (8176, 7156) 代码,因为无论如何这些位都会被缩短,因此子码足够且不太复杂对于这个应用程序。由于 8158 的代码长度比 8160 少两位,即 32 的精确倍数,因此将实际传输的补零两位附加到代码字的末尾,以实现 (8160, 7136) 位的缩短代码维度,或 ( 1020, 892) 八位字节,或 (255, 223) 32 位字。缩短后的码字如图2-6所示。

接收到的缩短码字需要在解码之前去除两个补零位。然后,解码器将在处理后再现 18 个虚拟填充零,但通常不会将这 18 个零传递到地面设备。

2.5 RANDOMIZATION AND SYNCHRONIZATION

使用缩短的(8160、7136)LDPC码不能保证足够的比特(符号)转换来获取或维持比特(符号)同步。强烈建议在根据参考文献 [1] 第 7 节进行编码后使用伪随机化器。

此外,需要帧(码字)同步,以便接收器可以识别帧(码字)的开头以进行正确解码。需要使用参考文献 [1] 的 6.6 节中指定的附加同步标记 (ASM)。请注意,ASM 不是伪随机的。

针对深空应用优化的低密度奇偶校验码系列

本文档中介绍的低密度奇偶校验 (LDPC) 代码旨在补充 CCSDS 推荐标准、TM 同步和信道编码(参考文献 [1])中的当前代码,并根据一系列要求和要求进行设计。反映航天器应用需求的评估标准(见参考文献[C2.2])。

所选码率是 1/2、2/3 和 4/5,这三个值在二进制输入加性高斯白噪声 (AWGN) 信道的速率相关容量曲线上大约均匀间隔 1 dB(参考[C2.4])。接近速率 1/2 时,带宽效率每提高 1%,功率效率将损失约 0.02 dB;在速率 7/8 附近,带宽效率每提高 1%,功率效率就会降低 0.1 dB。因此,与使用速率远远高于0.8的代码相比,使用更高阶的调制可能是节省带宽的更实用的方法。码率是小整数的精确比率,以简化实现。

所选块长度为k=1024、k=4096和k=16384。三个值 k={1024,4096,∞} 在 WER=10-8 的球填充边界上大约均匀地间隔 0.6 dB,并且将最后一个值从 ∞ 减小到 16384 使得最大块大小以实际成本为代价约0.3分贝。通过选择在家庭成员中保持 k 而不是 n 恒定,航天器的命令和数据处理系统可以在不知道码率的情况下生成数据帧。选择 2 的幂可以简化实现。

实施者应该意识到,LDPC 码已申请了许多专利;特别是,授予 T. Richardson 和 V. Novichkov 的美国专利涵盖了 LDPC 码的并行解码过程。1

所选代码是系统的。描述了两种低复杂度的编码方法(参见参考文献 [C2.3]),并且可以使用任何一种方法,具体取决于所选技术(软件、FPGA、ASIC)的限制。奇偶校验矩阵有足够的结构来促进解码器的实现(参见参考文献[C2.6])。这些代码具有不规则的度分布,因为与规则的 (3,6) 代码相比,这在 1/2 速率下将性能提高了约 0.5 dB(请参阅参考文献 [C2.1])。

代码

https://github.com/cea-wind/LDPCC/blob/master/README.md

M:这是CCSDS文档中指定的一个参数。

RATE:这是LDPC码的信息率,可以是1/2、2/3或4/5中的一个。

  1. 参数定义

    • thetafai 是在函数开头定义的矩阵。它们是CCSDS文档中给定的一些参数。
    • AB 是两个初始的零矩阵和单位矩阵。
  2. 循环

    • 函数通过一个循环遍历了 theta 中的每个元素,并根据其中的值计算了一系列索引,这些索引用于创建部分校验矩阵。
  3. 校验矩阵部分的生成

    • 函数内的循环将生成了多个部分校验矩阵 C{matrixNum}
    • 这些部分校验矩阵的形状和分布是根据CCSDS文档中给定的规则计算出来的,具体涉及到对 thetafai 矩阵的使用。
  4. 校验矩阵的组合

    • 最后,根据给定的信息率 RATE,函数将这些部分校验矩阵组合成一个完整的校验矩阵 H
    • 根据不同的信息率,组合方式不同,具体见 switch 语句。
  5. 校验矩阵的可视化

    • 函数最后绘制了生成的校验矩阵 H,使用 spy 函数绘制矩阵中非零元素的分布。
    • 还在绘制中添加了一些额外的网格以增强可视化效果。

总之,这段代码实现了根据CCSDS文档中的规范生成LDPC码的校验矩阵,并提供了可视化功能以便于用户理解和分析生成的矩阵结构。

这段代码是一个用MATLAB编写的LDPC码编码和解码的仿真程序,它包括了编码、传输、信道模拟、解码等步骤,并进行了误码率(BER)和帧错误率(FER)的仿真实验。

现在让我们来逐行解释代码的功能:

  1. 清除所有变量、命令行和图形界面:

    matlab 复制代码
    clear everything 
    clc;clear all;close all;
  2. 设置仿真参数:

    matlab 复制代码
    EbN0_dB = 1.5:0.2:2.2; % 信噪比范围
    FRAMES_NUM = 100;      % 帧数
    MAX_ITER_NUM = 200;    % 最大迭代次数
    MAX_ERROR_FRAME = 200; % 最大错误帧数
    bitError = zeros(1,length(EbN0_dB)); % 初始化比特错误数
    BER = bitError;         % 初始化比特错误率
    frameError = bitError;  % 初始化帧错误数
    iterNumTotal = zeros(1,length(EbN0_dB)); % 初始化迭代次数
    INFO_LENGTH = 1024;     % 信息长度
    RATE = 1/2;             % 信息率
    SIZE_M = 512;           % M 大小
    NORM_FACTOR = 0.8;      % 归一化因子
  3. 打开文件以保存重要数据:

    matlab 复制代码
    FILE_NAME = ['LDPC_CCSDS_' datestr(now,'yyyymmdd') '.txt']; % 文件名
    fid = fopen(FILE_NAME,'at+'); % 打开文件
    fprintf(fid,'date %s\n',datestr(now,'yyyymmdd')); % 写入当前日期
    fprintf(fid,'%s\n',' LDPCC in CCSDS standard section3(2006)'); % 写入标准信息
    fprintf(fid,'Information Length = %d, ',INFO_LENGTH); % 写入信息长度
    fprintf(fid,'Information Rate = %d, ',RATE); % 写入信息率
  4. 生成 LDPC 码的校验矩阵和生成矩阵:

    matlab 复制代码
    H = ccsdscheckmatrix(SIZE_M,RATE); % 生成校验矩阵
    G = ccsdsgeneratematrix(H,SIZE_M,RATE); % 生成生成矩阵
  5. 对信道进行模拟和误码率的仿真实验:

    matlab 复制代码
    for nEbN0 = 1:length(EbN0_dB) % 遍历不同的信噪比
        for nF=1:FRAMES_NUM % 对每一帧进行仿真
            % 编码
            message = randi([0 1],1,INFO_LENGTH);
            encodeData = mod(message*G,2);
            % 模拟调制
            % ... (省略了一部分代码)
            % 传输
            % ... (省略了一部分代码)
            % 解码
            [iterNum,recoverData] = ldpcdecoderminsum(H,HRowNum,HColNum,receiveSignal,MAX_ITER_NUM,NORM_FACTOR);
            % ... (省略了一部分代码)
        end
    end
  6. 输出仿真结果和画图:

    matlab 复制代码
    semilogy(EbN0_dB,BER,'r'); % 绘制 BER 曲线
    xlabel('Eb/N0(dB)'); ylabel('BER'); % 设置坐标轴标签
    grid on; % 显示网格

这段代码主要用于 LDPC 码的编码和解码仿真实验,通过调整不同的参数(如信息长度、信息率、信噪比等),可以对 LDPC 码的性能进行评估和比较。

相关推荐
lulinhao3 小时前
IP组播基础
笔记·计算机网络·华为
代码欢乐豆3 小时前
计算机网络——期末复习(3)4-6章考试重点
笔记·计算机网络
红色的山茶花3 小时前
YOLOv9-0.1部分代码阅读笔记-loss_tal_dual.py
笔记·深度学习·yolo
一棵开花的树,枝芽无限靠近你4 小时前
【PPTist】表格功能
前端·笔记·学习·编辑器·ppt·pptist
yuwinter5 小时前
鸿蒙HarmonyOS学习笔记(8)
笔记·学习
1101 11016 小时前
STM32-笔记12-实现SysTick模拟多线程流水灯
笔记·stm32·嵌入式硬件
美式小田6 小时前
Cadence学习笔记 12 PCB初始化设置
笔记·嵌入式硬件·学习·cadence
kiritio10245136 小时前
kipotix4靶机实战
笔记·安全
席万里6 小时前
【MySQL学习笔记】关于索引
笔记·学习·mysql
bohu837 小时前
sentinel学习笔记8-系统自适应与黑白名单限流
笔记·sentinel·系统自适应·authorityslot·paramflowslot