QR code 二维码基础入门教程(二)


承接上文,让我们继续下面的步骤

纠错码编码

先说说纠错容量

  • 纠错码可以纠正两种错误:

    1. 拒读错误(错误码位置已知),是一个没有扫到或者无法译码的符号字符,需要一个纠错码
    2. 替代错误(错误码位置未知),是一个错误译码的符号字符,需要两个
    3. 数量公式:e+2t≤d−pe+2t≤d−pe+2t \le d - p,其中
      • eee为拒读错误数
      • t" role="presentation">ttt为替代作物数
      • ddd为纠错码字数
      • p" role="presentation">ppp为错误检测码字数(1-L时p=3,1-M和2-L时p=2,1-H、1-Q、和3-L时,p=1,其余p=0)
  • 举个例子:版本6-H,有112个纠错码(查表 error correction table,定位6-H,28*4=112),数据容量为60个码字,共172个码字。那么112个纠错码可以纠正56个替代错误或者112个拒读错误,纠错容量为 56/172 = 32.6%

Step 1 将数据码字进行分组

  • 根据 error correction table 将数据进行分块,下面举个例子

    1. 一个数据经过以5-Q形式进行数据编码后如下,共62个码字

      (codeword #1) 01000011
      (codeword #2) 01010101
      (codeword #3) 01000110
      (codeword #4) 10000110
      (codeword #5) 01010111
      (codeword #6) 00100110
      (codeword #7) 01010101
      (codeword #8) 11000010
      (codeword #9) 01110111
      (codeword #10) 00110010
      (codeword #11) 00000110
      (codeword #12) 00010010
      (codeword #13) 00000110
      (codeword #14) 01100111
      (codeword #15) 00100110
      (codeword #16) 11110110
      (codeword #17) 11110110
      (codeword #18) 01000010
      (codeword #19) 00000111
      (codeword #20) 01110110
      (codeword #21) 10000110
      (codeword #22) 11110010
      (codeword #23) 00000111
      (codeword #24) 00100110
      (codeword #25) 01010110
      (codeword #26) 00010110
      (codeword #27) 11000110
      (codeword #28) 11000111
      (codeword #29) 10010010
      (codeword #30) 00000110
      (codeword #31) 10110110
      (codeword #32) 11100110
      (codeword #33) 11110111
      (codeword #34) 01110111
      (codeword #35) 00110010
      (codeword #36) 00000111
      (codeword #37) 01110110
      (codeword #38) 10000110
      (codeword #39) 01010111
      (codeword #40) 00100110
      (codeword #41) 01010010
      (codeword #42) 00000110
      (codeword #43) 10000110
      (codeword #44) 10010111
      (codeword #45) 00110010
      (codeword #46) 00000111
      (codeword #47) 01000110
      (codeword #48) 11110111
      (codeword #49) 01110110
      (codeword #50) 01010110
      (codeword #51) 11000010
      (codeword #52) 00000110
      (codeword #53) 10010111
      (codeword #54) 00110010
      (codeword #55) 11100000
      (codeword #56) 11101100
      (codeword #57) 00010001
      (codeword #58) 11101100
      (codeword #59) 00010001
      (codeword #60) 11101100
      (codeword #61) 00010001
      (codeword #62) 11101100

    2. 查表得,5-Q需要将数据分为2个Group,第一个Group有2个Block(15个码字),第二个Group有2个Block(16个码字)
    3. 进行分组,得到如下表
Group Number Block Number Data Codewords in the Group
Group 1 Block 1 (codeword #1) 01000011
(codeword #2) 01010101
(codeword #3) 01000110
(codeword #4) 10000110
(codeword #5) 01010111
(codeword #6) 00100110
(codeword #7) 01010101
(codeword #8) 11000010
(codeword #9) 01110111
(codeword #10) 00110010
(codeword #11) 00000110
(codeword #12) 00010010
(codeword #13) 00000110
(codeword #14) 01100111
(codeword #15) 00100110
Block 2 (codeword #16) 11110110
(codeword #17) 11110110
(codeword #18) 01000010
(codeword #19) 00000111
(codeword #20) 01110110
(codeword #21) 10000110
(codeword #22) 11110010
(codeword #23) 00000111
(codeword #24) 00100110
(codeword #25) 01010110
(codeword #26) 00010110
(codeword #27) 11000110
(codeword #28) 11000111
(codeword #29) 10010010
(codeword #30) 00000110
Group 2 Block 1 (codeword #31) 10110110
(codeword #32) 11100110
(codeword #33) 11110111
(codeword #34) 01110111
(codeword #35) 00110010
(codeword #36) 00000111
(codeword #37) 01110110
(codeword #38) 10000110
(codeword #39) 01010111
(codeword #40) 00100110
(codeword #41) 01010010
(codeword #42) 00000110
(codeword #43) 10000110
(codeword #44) 10010111
(codeword #45) 00110010
(codeword #46) 00000111
Block 2 (codeword #47) 01000110
(codeword #48) 11110111
(codeword #49) 01110110
(codeword #50) 01010110
(codeword #51) 11000010
(codeword #52) 00000110
(codeword #53) 10010111
(codeword #54) 00110010
(codeword #55) 11100000
(codeword #56) 11101100
(codeword #57) 00010001
(codeword #58) 11101100
(codeword #59) 00010001
(codeword #60) 11101100
(codeword #61) 00010001
(codeword #62) 11101100
  • 查表可知5-Q中每个块有18个纠错码,因此一共是18*4=72个纠错码

Step 2 理解多项式长除法

  • 这个比较简单,以 (x+1)√(3x2+x−1)(x+1)√(3x2+x−1)(x+1)\surd(3x^2+x-1) $为例

最终结果是 3x+23x+23x+2,余数为1(特别的,就是 1x^0)

Step 3 理解Galois Field

  • 说实话,我看了一些博客还是不理解这个。暂时认为,任意的两个数在这个域中,那么它们的数学运算结果也在这个域中。
  • QR 标准中使用位的模2算法和字节模100011101,这种情况下我们称使用了Galois Field 28282^8,或者GF(256)
  • GF(256)包括256个数字 0….255,所有在GF(256)的数学操作的结果都会落在0…255中

Step 4 理解Galois Field算术

  • 运算结果如果大于255,那么需要做取模操作,这样使得结果人在GF中
  • 在GF中,−n=n−n=n-n = n,因此加法和减法是一样的
  • 位模2,其实就是XOR,举例:
    • (1 + 1)%2 == (1 XOR 1) == 0
    • (1 + 0)%2 == (1 XOR 0) == 1
    • (0 + 0)%2 == (0 XOR 0) == 0

Step 5 利用逐字节100011101取模,生成2的乘幂

  • 我们想做这样一件事情,用2n2n2^n表示[0,255]中的所有数,例如用20=120=12^0=1,22=422=42^2=4。那么我们有2的0次方到8次方为:

    • 20=120=12^0 = 1
    • 21=221=22^1 = 2
    • 22=422=42^2 = 4
    • 23=823=82^3 = 8
    • 24=1624=162^4 = 16
    • 25=3225=322^5 = 32
    • 26=6426=642^6 = 64
    • 27=12827=1282^7 = 128
    • 28=25628=2562^8 = 256
  • 当 n≥8n≥8n \ge 8 时,2n>2552n>2552^n > 255,超出了 [0,255][0,255][0,255] 的范围,因此当 2n>2552n>2552^n > 255 时,我们要对 2n2n2^n 用 100011101 取模。100011101 也就是十进制 285。换句话说,28=256mod285=2928=256mod285=292^8= 256 \mod 285 = 29 。
  • 注意,当我们计算 29292^9 时,并不是用 512 去 XOR 285,而是用 29=28∗2=29∗2=5829=28∗2=29∗2=582^9 = 2^8 *2 = 29*2 = 58 得到结果。
    我们继续举一些例子来说明计算方式:
    210=29∗2=58∗2=116210=29∗2=58∗2=1162^10 = 2^9*2 = 58*2 = 116
    211=210∗2=116∗2=232211=210∗2=116∗2=2322^{11} = 2^{10}*2 = 116*2 = 232
    212=211∗2=232∗2=464mod285=205212=211∗2=232∗2=464mod285=2052^{12} = 2^{11}*2 = 232 * 2 = 464 \mod 285 = 205
    只要超过了 255,那么就做 100011101 的 XOR(即取模于 285)

Step 6 利用逐字节100011101取模,生成2的乘幂

  • Step 5 让 [0,255][0,255][0,255] 所有的数都被表示成 2n2n2^n,这可以用 logs 和 antilogs 来简化 GF(256) 中的乘法操作。
  • 基本知识:2n∗2m=2m+n2n∗2m=2m+n2^n * 2^m = 2^{m+n}。举例 22∗28=210,2170∗2164=2334=2334mod255=27922∗28=210,2170∗2164=2334=2334mod255=2792^2*2^8 = 2^{10},2^{170}*2^{164}=2^{334} = 2^{334 \mod 255} = 2^{79}

Step 7: 理解生成器多项式

  • 首先要确定纠错码码字的个数。例如 5-Q 有 72 个,1-L 有 7 个。
  • 接下来有点复杂,请看 原文,耐心一点看例子,不难的。
  • 生成器多项式只与纠错码码字的个数有关,因此是可以预先生成的。这里有个神奇的 链接 可以生成生成器多项式

Step 8: 生成纠错码码字

  • 我们利用多项式除法来生成纠错码码字。我们需要两个多项式:消息多项式和生成器多项式。用消息多项式除以生成器多项式,得到的余数结果即为纠错码码字。
  • 进行多项式除法之前,消息多项式先乘上 xnxnx^n,其中 nnn 是纠错码的个数,这样保证消息多项式足够大进行除法。

Step 9: 消息多项式除以生成器多项式

  • 第一步:生成器多项式乘上消息多项式的头一项。
  • 第二步:将生成器多项式中的 2n" role="presentation">2n2n2^n 转为 [0,255][0,255][0,255]的数字。
  • 第三步:进行多项式除法。
  • 重复 1~3 步,共进行 m 次,其中 m 为数据码字的个数。
  • 最终得到余数,即纠错码码字。具体过程参看 Show polynomial division steps

QR code 二维码基础入门教程(二)相关推荐

  1. QR code 二维码基础入门教程

    QR code 二维码基础入门教程 本文为 QR Code Tutorial: Introduction 的总结,详细内容请查看原文 Introduction History and Informat ...

  2. QR code 二维码基础入门教程(三)

    QR code 入门教程(三) 承接上文,我们已经说过了数据编码和纠错码的生成,接下来我们继续下面的步骤 结构化最终的数据 所谓的结构化(Structure),说白了就是如何把之前生成的数据排成一个比 ...

  3. 如何把视频文件转换为视频二维码的完整教程

    如何把视频文件转换为视频二维码的完整教程 二维码已经不经意间快速地融入了我们的生活,我们可以通过扫描二维码来添加好友.付款等等, 那么,如何让视频生成二维码直接免费观看和实现分享呢? 「 视频二维码 ...

  4. QR Code生成二维码快速入门

    1.QR Code的介绍 QR Code,是由Denso公司于1994年9月研制的一种矩阵二维码符号,它具有一维条码及其它二维条码所具有的信息容量大.可靠性高.可表示汉字及图象多种文字信息.保密防伪性 ...

  5. 使用说明二维码怎么做?二维码制作教程分享

    我们购买的很多商品包装带上都会有二维码,扫一扫就能看到商品的使用教程视频和相关的文字说明.非常的方便.那么,如何将视频文字做成二维码图片呢?有没有什么简单好操作的工具呢? 一.使用什么工具能够制作二维 ...

  6. 二维码简介_二维码基本概念_二维码基本原理

    一.二维码简介_二维码基本概念_二维码基本原理 1.二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Ba ...

  7. 用python生成个性二维码_Python 生成个性二维码

    1.1 实验内容 本课程通过调用MyQR接口来实现生成个人所需二维码,并可以设置二维码的大小.是否在现有图片的基础上生成.是否生成动态二维码. 本课程主要面向Python3初学者. 1.2 知识点 P ...

  8. C++/QT生成二维码和扫瞄二维码

    C++生成二维码和扫瞄二维码 一. 创建工程项目 二 .QRCODE库 三. 添加生成二维码库 四. 生成二维码和复制二维码实现 五. 添加扫码二维码库 六. 扫码二维码代码实现 七. 测试 八. 打 ...

  9. python可以做二维码吗_Python制作二维码真的这么简单?

    今天在最大的交友社区GitHub上发现了一个比较有意思的项目,无论你是什么操作系统,只需要一行代码就可以很方便的生成二维码.包括普通二维码.艺术二维码(黑白/彩色).动态gif二维码都可以制作,用法比 ...

最新文章

  1. LeetCode 850. Rectangle Area II
  2. Java除法结果带小数、进一法的实现 Java问题通用解决代码
  3. 菜菜sklearn——XGBoost(2)
  4. 腾讯推出百万现金漏洞悬赏计划!
  5. php左侧菜单栏递归代码,js实现左侧菜单栏递归循环遍历
  6. 安装一直初始化_3D max 软件安装问题大全
  7. 荷兰商业银行使用精益领导力推行改进
  8. 自学it18大数据笔记-第一阶段Java-day16-day17-day18-day19--day20-day21-day22——会持续更新...
  9. 改变变压器联接方式可消除某些特定次数的谐波_电工牛人10年经验,总结的4电工常用接线方法41例,电机、变压器、接触器..都有...
  10. 武汉三首,记录备忘,写的不好,以后再改
  11. 为什么我写了一万小时的代码,却仍然成不了架构师?
  12. SqlServer修改sa的密码
  13. Interface Project
  14. java解压zip压缩文件
  15. ⚓写写5G网速及页面提速中的延迟加载Lazyloading
  16. 35、StylizedNeRF Consistent 3D Scene Stylization as Stylized NeRF via 2D-3D Mutual Learning
  17. stm8L051低功耗采集电池电量ADC例程
  18. 【如何学习CAN总线测试】——OSEK网络管理测试
  19. 浅谈集合List,Set以及Map集合的特点及区别
  20. linux内核-进程与进程调度

热门文章

  1. python提取高频词_seo与python大数据结合给文本分词并提取高频词
  2. python3x_Python3x 基本知识点
  3. oracle11g scn 补丁,Oracle11g中SCN与TimeStamp的相互转换
  4. ROS入门笔记(十):编写与测试简单的消息发布器和订阅器(C++)
  5. mysql yog中文版下载_SQLyog 12
  6. 红黑树在java中的作用_带你真正理解Java数据结构中的红黑树
  7. php mysql encode_PHP json_encode mysql结果
  8. 三位数的茎叶图怎么看_人参怎么判断年份,这些点你要了解
  9. kind富文本编辑器_在项目中集成富文本编辑器
  10. 重启用reboot后起不来_2021年中国“天眼”开放,美媒记者探访后感叹了……