Reed-Solomon纠错码——RS(255,251)学习及实现

news2024/9/30 0:28:55

1、基础知识

1.1 有限域

有限域_百度百科​​​​​​

伽罗华域(Galois Field)上的四则运算_模2的伽罗华域乘法-CSDN博客

1.2 RS(255,251)

里德-所罗门码(一种前向错误更正的信道编码)_百度百科

本原多项式: p(x) = x^8 + x^4 + x^3+ x^2 + 1

生成多项式: g(x) = x^4 + 15* x^3 + 54*x^2 + 120*x+64

根据对1.1的理解,GF(256) 为GF(2^8)

RS_m = 8

RS_n = 255

RS_k = 251 

RS_t = (RS_n - RS_k)/2 = 2

根据四则运算,该域中的每个元素的数值为:

a(0) = x^0 =>0b

a(1) = x^1 =>1b

a(2) = x^2    =>10b

a(3) = x^3 =>11b

...

a(8) = x^8 =  x^4 + x^3+ x^2 + 1 =>11101b(由 P(x)推导)

a(9) = x^9 = x^8* x= (x^4 + x^3+ x^2 + 1)*x = x^5+x^4+x^3+x =>111010b

a(10) = x^10 = x^8*x^2 = (x^4 + x^3+ x^2 + 1)*x^2 =x^6+x^5+x^4+x^2 =>1110100b

a(11) = x^11 = x^8*x^3 =  (x^4 + x^3+ x^2 + 1)*x^3 = x^7+x^6+x^5+ x^3 => 11101000b

a(12) = x^12 = x^8*x^4 = (x^4 + x^3+ x^2 + 1)*x^4 = x^8 + x^7+ x^6+ x^4 = (x^4 + x^3+ x^2 + 1)+ x^7+ x^6+ x^4 (modp(x))=  x^7+ x^6 +  x^3+ x^2 + 1  => 11001101b

...

只要a(n)中的n大于8或者推导出来的指数大于8就可以modp(x)推导出来指数小于8

2、python实现(基础版)

# parameter
rs_n = 255
rs_k = 251
rs_m = 8
# rs_t = 2
p_x = int('100011101', 2)  # primitive polynomial GF(256)
# x_0_7 = [1, 2, 4, 8, 16, 32, 64, 128]
x8 = p_x ^ (2 ** rs_m)


# GF function
# GF_xn(n) : element a(n); GF_add(a,b): add; GF_mult(a,b): multiply

def gf_xn(n):
    if n < rs_m:
        return 2 ** n
    elif n == rs_m:
        return x8
    else:
        tmp_xn = gf_xn(n - 1) << 1
        while tmp_xn > 2 ** rs_m:
            tmp_xn_low = tmp_xn & rs_n
            tmp_xn = tmp_xn_low ^ x8
        return tmp_xn


def gf_add(a, b):
    r = a ^ b
    return r


def gf_mult(a, b):
    if a == 0 or b == 0:
        r = 0
    else:
        r_mul = 0
        r_mul_high = 0
        for i in range(rs_m):
            if a & 2 ** i:
                b_i = b << i
                r_mul = r_mul ^ b_i
        for j in range(rs_n):
            if j >= rs_m:
                if r_mul & 2 ** j:
                    r_mul_high = r_mul_high ^ gf_xn(j)
        r_mul_low = r_mul & rs_n
        r = r_mul_low ^ r_mul_high
    return r


def rs_encoder(mx):
    rx_pre = [0, 0, 0, 0]
    rx = [0, 0, 0, 0]
    for mx_i in mx:
        fec_i = gf_add(rx_pre[3], mx_i)
        rx[0] = gf_mult(64, mx_i)
        rx[1] = gf_add(gf_mult(120, fec_i), rx_pre[0])
        rx[2] = gf_add(gf_mult(54, fec_i), rx_pre[1])
        rx[3] = gf_add(gf_mult(15, fec_i), rx_pre[2])
    return rx


if __name__ == '__main__':
    mx = [0 for i in range(rs_k)]
    with open('mx.txt', 'rb') as mx_f:
        mx_all = mx_f.read()
        mx_list = mx_all.split("\n")
        for i in range(rs_k):
            mx[i] = int(mx_list[i])
        print(mx)
        rx = rs_encoder(mx)
        print(rx)

其中px是本原多项式,xn就是GF(256)中的各个元素

mx 是 RS(255,251) 生成多项式 对应的 移位寄存器的输入B0-B250

rx 是mx 编码后得到的4 位 RS0-RS3

gf_xn 以及gf_mult 都是根据推导一步步写的,比较笨拙的写法(数学不好,算法不好没办法)

3、其他

输入法也不知道怎么了,shift也调不回来了,懒得管了,看起来可能有点费眼睛(我输入也挺费眼的。。。)

之前的文章为啥变成vip免费了?我什么也没干,又去一篇一篇重新编辑成全部可见了。。。。。费人

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1979825.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring面试篇章——IOC

IOC概念和原理 IOC概念 IOC就是控制反射&#xff0c;把对象创建和对象之间的调用过程&#xff0c;交给Spring进行管理使用IOC的目的&#xff1a;降低耦合度 IOC底层原理 xml解析、工厂模式、反射 图解&#xff1a; 原始模式 耦合度太高了&#xff0c;即当dao改了&#xf…

UWB实操:使用 litepoint 收发UWB信号

使用 litepoint 收发UWB信号 把信号线接到 litepoint 的RF1 和RF2。 注意&#xff1a; RF1 支持 VSG(TX) 和VSA(RX)RF2 只支持 VSG(TX)同一时间只能一个 VSG(TX) 双击 LED STATUS&#xff0c;改变RF1和RF2的模式。 RF1&#xff1a;VSA(RX) RF2&#xff1a;VSG(TX) Techno…

学习笔记--算法(双指针)3

快乐数 . - 力扣&#xff08;LeetCode&#xff09; 题目 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无…

8.怎么配嵌套子路由,以及它的作用

作用 配嵌套子路由,就是可以通过同一个页面,让不同的位置发生变化,其他的位置不会发生变化,而做到一个局部刷新 例子 红线框住的部分,头部和导航栏是不会发生变化的,变化的只有中间的内容 子路由的操作步骤 将这个页面的头部和导航栏部分的样式和风格,移到主路由上(<tem…

111页PPT某大型制造业ERP转型规划方案

德勤为大型制造业ERP转型规划方案提供了一系列的策略和步骤&#xff0c;这些策略和步骤旨在帮助企业实现数字化转型&#xff0c;提升业务效率和竞争力。 以下是德勤提出的关键点 &#xff1a;资料下载方式&#xff0c;请看每张图片右下角信息 1. 流程规划&#xff1a;德勤首先…

企业级业务架构设计:指南解析

引言 在数字化转型的浪潮中&#xff0c;企业业务架构的设计成为了连接企业战略与技术实现的桥梁&#xff0c;其重要性日益凸显。本文将深入探讨企业级业务架构的设计原则、流程、工具和技术实现&#xff0c;并结合具体案例&#xff0c;为读者提供详尽的实战指导。通过结合《企…

GAZEBO之MyRobot建立

GAZEBO之MyRobot建立 1. 源由2. 示例Step 1: 新建一个简单世界Step 2: 新建一个模型(model)Step 3: 机器人组成链接(Links)Step 3.1: 新增底盘(Links/Chassis)Step 3.1.1: 惯性属性(Inertial properties)Step 3.1.2: 视觉(Visual)Step 3.1.3: 碰撞(Collision) Step 3.2: 新增左…

PointNet和PointNet++论文解读

目录 一、导言 二、PointNet介绍 三、PointNet网络结构 1、损失函数 2、正则化 四、PointNet 1、分层次的点集抽象层 一、导言 PointNet来自CVPR2017&#xff0c;是最早直接处理点云数据用于计算机视觉的模型&#xff0c;并运用于分割、检测、场景理解任务&#xff0c;P…

celery简单使用

1. 框架介绍 Celery是一个强大的异步任务队列/作业队列框架, 它主要用于处理大量消息, 同时为操作提供稳定可靠的消息传输机制. Celery的分布式特性允许任务分散到多个计算节点上并行处理, 从而提高系统的可扩展性, 可靠性和性能. Celery使用消息代理(如: RabbitMQ, Redis)来实…

【Linux】win 环境下进行 linux开发

文章目录 IDE 安装Python开发创建一个新项目安装 Python、pip 和 venv创建虚拟环境&#xff08;建议&#xff09;运行Python 参考文章 想要win 环境下进行 linux开发&#xff0c;需要依赖于wsl。wsl安装可参考上篇文章 【Linux】wsl win安装Linux环境 这里主要介绍在 linux下…

【pkill pgrep】Centos/Linux pkill命令详细介绍

简介 系统版本&#xff1a;Centos7.6 pkill命令用于杀死一个进程&#xff0c;会根据进程名称和其他属性杀死进程&#xff08;默认会向进程发送SIGTERM信号&#xff0c;详细请看Linux信号的行为说明&#xff09;&#xff0c;与之相似的命令有killall&#xff0c;与kill命令相比&…

C++学习之路(1)— 第一个HelloWorld程序

C学习之路&#xff08;1&#xff09;— 第一个HelloWorld程序 一、前言 C在C语言的基础上添加了对面向对象编程和泛型编程的支持&#xff0c;在 20世纪90年代便是最重要的编程语言之一&#xff0c;并在21世纪仍保持强劲势头。C继承了C语言高效、简洁、快速和可移植性的传统。 …

鸿蒙HarmonyOS开发:常用布局及实用技巧

文章目录 一、概述二、盒子模型三、线性布局&#xff08;Column/Row&#xff09;1、space属性2、justifyContent属性3、alignItems属性 四、实用技巧1、Blank组件的使用2、layoutWeight属性的使用 一、概述 布局是指对页面组件进行排列和定位的过程&#xff0c;其目的是有效地…

【STM32】“stm32f10x.h” 头文件的作用

目录 1. 文件结构与头文件保护1.1 头文件保护1.2 包含的头文件 2. 宏定义和常量2.1 系统时钟相关2.2 外设时钟使能2.3 中断优先级 3. 外设寄存器结构体3.1 GPIO 寄存器结构体3.2 RCC 寄存器结构体3.3 USART 寄存器结构体 4. 外设头文件的引入4.1 GPIO 外设头文件4.2 RCC 外设头…

CMU15445 (Fall 2023) Project 3 - Query Execution 思路分享

文章目录 写在前面Task 0 - Read the Source Code算子(executor)如何获取数据&#xff0c;BusTub如何描述算子&#xff1f;ButTub如何存储表的数据&#xff0c;描述表的结构&#xff1f; Task 1 - Access Method ExecutorsSeqScanInsertUpdateDeleteIndexScanOptimizing SeqSca…

Tensorflow训练视觉模型(CPU)

目录 零、模型下载 一、清理C盘 二、 配置环境 三、运行项目前提操作 &#xff08;1&#xff09;根据自己的项目设置路径。每次激活虚拟环境&#xff08;tensorflow115&#xff09;都得重设一次 &#xff08;2&#xff09;执行setup 这个项目的路径移动了位置也需要重设一…

7.17题目练习

目录 1.二叉树的最近公共祖先 2.从前序与中序遍历序列构造二叉树 3.最小k个数 1.二叉树的最近公共祖先 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val x; }* }*/ class Solution …

余承东再次否认“遥遥领先”禁令:没有罚款一说,被喊烂了

7月29日&#xff0c;问界第四十万台新车在赛力斯超级工厂正式下线。在下线仪式上&#xff0c;华为常务董事、终端BG董事长、智能汽车解决方案BU董事长余承东再次否认了外界关于其被禁提“遥遥领先”一次的传闻&#xff0c;在谈及问界M9时&#xff0c;他表示&#xff0c;问界M9不…

java基础 之 equals和==的区别

文章目录 浅谈“”特点比较基本类型比较引用类型 浅谈“equals”背景和使用重写equals自定义类为什么需要重写equals方法 总结附录代码及文章推荐 前言&#xff1a; 1、8大基本数据类型&#xff0c;它们的值直接代表了某种数据&#xff0c;不是对象的实例&#xff0c;不能使用n…

DeepSpeed基础及内存优化特性

DeepSpeed 1.基础概念 DeepSpeed是一个由Microsoft 公司开发的开源深度学习优化库&#xff0c;旨在提高大规模模型训练的效率和可扩展性&#xff0c;使研究人员和工程师能够更快地迭代和探索新的深度学习模型和算法。它采用了多种技术手段来加速训练&#xff0c;包括模型并行…