二维码的纠错码原理及细节

参考文档:

https://www.thonky.com/qr-code-tutorial/error-correction-coding

1. 消息多项式

    消息多项式的系数组成:数字码字。如“hello world” ,利用二维码的编码原理,转换成十进制数字为“32, 91, 11, 120, 209, 114, 220, 77, 67, 64, 236, 17, 236, 17, 236, 17”,因此,这个语句的消息多项式为:

2. 生成多项式

生成多项式可以用下面这个式子概括:

n是生成的纠错码字的数量,α一般默认为2。为了方便进行多项式的出发,我们需要对生成多项式进行展开。

拿最简单的n=2举个例子(以下大部分步骤都是废话):

=

=

=

=

因为α默认为2,而且在GF(256)中,加法用异或操作,所以

=

=

这样就得到生成多项式了。

注意,在这里的指数大于255也是不行的,一旦超过255,就要通过对255取模的方式来降一降。

从下面这个网址可以轻松得到n≥7的时候的生成多项式

https://www.thonky.com/qr-code-tutorial/generator-polynomial-tool?degree=7

注:GF(256)是啥?QR Code标准表示使用逐位模2算术和逐字节模100011101算法,也就是使用伽罗瓦域2^8,或者伽罗瓦域256,有时写为GF(256)。GF(256)的范围是0~255。简而言之,在这个神奇的领域里面,超过255是不允许的,一旦超过就要通过异或的方式来降一降。比如说2^8=256,因此需要和100011101进行异或操作来得到最终的值,所以2^8=256^285=58。2^9=58*2=116。2^10=116*2=232。……

3.进行除法

将生成多项式除以消息多项式来得到最后的结果。普通的多项式除法一般大家以前都接触过,但在这里不是在乘法步骤之后减去,而是执行XOR(在GF(256)中,其实就是一样的)。
就不多介绍。

步骤可以分为以下三步:

   1. 找到适当的项乘生成多项式,使得乘法的结果与消息多项式具有相同的第一项。

   2. 使用消息多项式(在第一个乘法步骤中)或余数(在所有后续乘法步骤中)对结果进行异或。

   3. 执行这些步骤n次,其中n是消息多项式中的系数。

在进行两个多项式的除法之后,将有一个余数。 该余数的系数是纠错码字。

拿完整的消息多项式和生成多项式做一个例子。

完整的消息多项式如下(Hello world的例子):

为了确保在除法期间引导项的指数不会变得太小,将消息多项式乘以x^n,n是所需的纠错码字的数量。如当纠错码字的数量是10时,上式应该变成:

生成多项式的前导项也应该具有相同的指数,因此生成多项式也乘x^15得到下式(这里的原始生成多项式可以从上面给的链接里面轻松得到)

具体开始步骤:

    1. 将生成多项式乘以消息多项式的前导项。消息多项式的前导项是32,也就是α^5,乘上生成多项式后,生成多项式变成

=

=

注意,指数的值不能超过255,一旦超过就要进行对255取模的操作。

可以明显看出经过上面这些步骤(保持指数相同,将消息多项式的前导码乘到生成多项式上),生成多项式和信息多项式拥有了完全相同的第一项。

    2. 使用消息多项式对结果进行异或;从下面这个式子也可以看出来,就是消息多项式和生成多项式中相同次数的项的系数进行了异或操作,经过这个操作之后,消息多项式中最高次数的项已经没有了(因为生成多项式和消息多项式拥有完全相同的第一项,一异或就没了)。

=

=

3. 将生成多项式乘上一步的XOR结果的前导项。注意,这里的生成多项式已经经过了和现在的信息多项式等指数的过程,所以最高次是24。

    在这个例子中,前导项是89x^24,做乘法的时候,把数字用α表示比较简单,89又等于α^210(这个可以查表得),所以

=

=

4.将上一步得到的式子继续重复类似步骤2的异或操作,这个操作之后,最前面那项(次数为24次的那项)又成功没有了。

=

=

接下来这一步就可以想象啦,就是把61乘到原始的生成多项式上,把指数对好了的生成多项式和上一步得到的式子进行异或操作。

那么重复到什么时候好呢?从上面可以看出来,循环一次,就有一个消息多项式中的一项被消除,所以消息多项式有多少项,就进行多少次循环(这就好像除法进行到了最后一位)。上述例子循环16次后,就得到了下面这个式子(从这个式子中我们就可以看出来,刚开始的时候乘x^10有多明智,为什么是10而不是9或者8也从这里可以看出,因为生成多项式的最高次数是纠错码字的数目,一项项异或之后,最后的余数的位数和生成多项式的位数是相关的)

现在我们就得到纠错码字了:196  35   39  119  235  215  231  226  93  23

得到纠错码字之后就是按照规范给填到二维码的格子里面。

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

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

相关文章

Android 二维码扫码功能实现(Zxing集成,避坑启示)

这两天想要实现一个能扫码的app,找了一下,发现zxing用的比较多,就在网上找了找怎么用zxing。我主要是按照宇宝守护神的博文“Android 二维码的扫码功能实现(一)”的步骤完成的,博文链接在此:htt…

23种设计模式之桥梁模式

桥梁模式的定义 定义: 将抽象和实现解耦, 使得两者可以独立的变化 通俗的说, 就是一个类调用另一个类中的方法, 需要一个桥梁, 通过聚合的关系调用 其类图如下: 其中角色说明如下: Abstraction 抽象化角色: 它的主要职责是定义出该角色的行为, 同时保存一个对实现化角色的引…

23种设计模式之享元模式

享元模式的定义 定义: 使用共享对象可有效的支持大量的细粒度的对象 通俗的说, 就是将类的通用属性抽出来,建立对象池,以达到限制对象数量的效果 上面定义中要求细粒度对象, 那么不可避免的使得对象数量多且性质相近, 我们将这些对象的信息分为两个部分: 内部状态和外部状态…

射频(RF)基本理论:定义、特性、调制、扩频

参考: INTRO TO SDR AND RF SIGNAL ANALYSIS 一文让你读懂调幅、调相、调频、 与 I/Q 调制?它们的区别详解 无线网络技术教程(第二版) 金光、江先亮编 数字调制系列:IQ调制基本理论 1. 什么是射频? …

设计模式之规格模式

规格模式 规格模式 使用了策略模式,组合模式. 只不过将模式具体化了 规格模式将 与或非 操作进行了封装, 实现了类似 SQL查询语句的操作. 类图如下: 其中的角色如下: ISpecification 抽象规格书: 对规格书的抽象定义CompositeSpecification 组合规格书: 抽象类, 对规格书进…

设计模式之雇工模式

雇工模式 雇工模式也叫仆人模式, 其意图为: 雇工模式是行为模式的一种, 它为一组类提供通用的功能,而不需要类实现这些功能,它是命令模式的一种扩展. 其类图如下: 其中角色如下: IServiced : 用于定义服务内容的接口Serviced1 : 具体的服务提供者Servant : 执行者,即雇工类,…

设计模式之对象池模式

对象池模式 对象池模式, 或者称为对象池服务, 其意图为: 通过循环使用对象, 减少资源在初始化和释放时的昂贵损耗(这里的"昂贵"可能是时间效益(如性能), 也可能是空间效益(如并行处理), 在大多情况下, 指性能) 简单的说, 在需要时,从池中提取,不用时,放回池中,等待…

WiFi的基本调制过程

参考:Parallel Inclusive Communication for Connecting Heterogeneous IoT Devices at the Edge 基本的WiFi调制分为以下三个步骤: 1. 将信号调制到正弦波上。 WiFi采用QAM(正交振幅调制),用I/Q信号表示的话&#…

设计模式之黑板模式

黑板模式的意图 黑板模式是观察者模式的一个扩展,知名度并不高,但使用的范围却非常广. 其意图为: 允许消息的读写同时进行, 广泛的交互消息. 简单的说, 黑板模式允许多个消息读写者同时存在, 消息的生产者和消费者完全分开. 这就像一个黑板, 任何一个老师(消息的生产者)都可以…

蓝牙调制

参考:Parallel Inclusive Communication for Connecting Heterogeneous IoT Devices at the Edge 《从创意到原型:物联网应用快速开发》 董玮,高艺编著 详解蓝牙标准中的GFSK调制:https://blog.csdn.net/lovehua365/article/detai…

设计模式之空对象模式

空对象模式 空对象模式是通过实现一个默认的无意义对象来避免null值出现, 简单地说,就是为了避免在程序中出现null值判断而诞生的一种常用设计方法. 举个简单的例子, 一个听动物叫声的模拟程序: 动物代码: 听叫声的人: 现在我们想, 能不能把 animal 的空值判断去掉呢?我们增…

UML类图基础说明

UML类图主要由类和关系组成. 类: 什么具有相同特征的对象的抽象, 具体我也记不住, 反正有官方定义 关系: 指各个类之间的关系 类图 类就使用一个方框来表示, 把方框分成几层, 来表示不同的信息,如下图所示: 当然, 类图也不一定每一次都长这样, 比如你只分析各个类之间的关系…

J-flash 烧写cc2538教程

1. 打开J-falsh,所示如下界面 2. 配置相关参数。 菜单栏 Options → Project settings。按照如下框图选择。 3. 打开要烧写的文件。File → Open data file,选择要烧写的文件(一般为hex或bin文件) 4. 连接板子。Target → Connec…

跳表

概述 线性表中的链表是我们都很熟悉的结构了, 链表的增删优于数组, 但是不支持随机访问, 链表在查找时, 只能从头节点向后遍历, 那么针对链表, 能不能解决其访问效率的问题呢? 跳表来了, 顾名思义, 跳表就是可以跳跃的表, 我简单画了张图: 在原来链表的基础上, 建立一个新的…

论文写作——用excel和ppt做好看的论文图

论文写作——用excel和ppt做好看的论文图Excel 作图PPT保存前言:用matlab或者python作图,门槛较高,熟悉比较难。用excel和ppt就比较容易上手了。最近的论文全用ppt和excel作图,看着也不赖,在此记录一下一般的方法。 co…

Arduino Uno + Lora shield rf95_server 提示错误“Init failed!”

错误描述 在使用原始的Arduino提供的示例rf95_server和rf95_client的时候,烧了rf96_server的板子会出现“init failed!”的错误,如下。 问题解决 经过排查,初始化失败由Led相干代码引起,因此将它们注释掉就好了&…

眼见为实

我们从小就一直再说 耳听为虚眼见为实, 但是眼见的就一定是真实的么? 我们都知道眼睛的构造, 首先是一个凸透镜, 而凸透镜接收到的图像是倒立的, 那么为什么我们看到的图像是正立的呢?当然是大脑负责将倒立的图像反转过来. 其次, 我们是左右两只眼睛, 而两只眼睛接收到的图…

用树莓派+lora shield搭建一个LoRaWAN网关

文章目录1. 创建单信道LoRaWAN网关1.1 准备工作配置树莓派上网开启树莓派SPI接口安装必需库文件1.2 正式开始把LoRa shield连接到树莓派上下载单信道LoRa网关代码到树莓派2. TTN网站相关操作2.1 注册并登录TTN2.2 注册Gateway2.3 注册Application2.4 注册device3. Client端操作…

基于linux的MsQUIC编译及样例运行

参考链接: https://github.com/microsoft/msquic/blob/main/docs/BUILD.md 软件相关版本 Ubuntu 20.04 编译/构建 1. 下载源代码 $ git clone --recursive https://github.com/microsoft/msquic.git 2. Powershell安装: 安装链接(根据…

转载:tcpdump抓包和Wireshark解包

转自:https://www.cnblogs.com/domestique/p/8028405.html 简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包的“头…