vue生成二维码 qrcode_QR Code快速响应矩阵 二维码编码全过程详解(三)(纠错码的生成)...

3bccc3b4abfffd42086151d15e8f7fc8.png

承接上文,在了解了一些背景知识后,我们现在来讲具体的纠错码如何生成。

3.纠错编码:

1.将数据码字分块:

在我们第一篇文章里已经将数据码字全部编好了。共80个码字,我们选的版本和纠错等级为Version4,L;查阅QR码的各版本等级的纠错特性可知,我们这个纠错码只有一个块,无需分块,但笔者举例说一下分块的情况:

d12d34658c037ac877a44f0655b1c673.png

首先根据这个纠错特性表(完整表格请到文章末尾查阅),确定自己选的版本和纠错等级所对应的块数和每块里面的数据码字数是多少,比如Version5H的块数有4块,前两块的数据码字数是各11个,后两个块的数据码字数是各12个,纠错码字数是每个块都是11个;然后我们就分好块了,对每个块求出它的纠错码字。

2.生成多项式:

生成多项式只与纠错码字的数量有关;假如待编码的一个块的纠错码字的数量为n;

那么它的生成多项式就是:

(x-α^0)*(x-α^1)*(x-α^2)*…*(x-α^(n-1));

注意:α是Galois域中的基元,一般取值为2;而这个乘法运算*也是对应Galois有限域里的乘法运算,在进行这个多项式展开的时候你要确定已经明白了笔者上篇文章讲的Galois域。

这里,笔者就取n=3进行一个简单的展开运算,(但是注意了,生成多项式的n最小是7,因为纠错码字数最小为7,不过多项式的生成原理还是一样的);

当纠错码字数n=3时:

生成多项式=(x-α^0)* (x-α^1)*(x-α^2)

=x³-(α^0+α^1+α^2)x²+(α^0*α^1+α^0*α^2+α^1*α^2)x-α^(0+1+2) (然后我们用域值来代替指数次方)

=x³+(-1-2-4) x²+(1*2+1*4+2*4)x-8 (然后把域值进行相应运算,注意当域值的运算结果超出255时,我们依然要将其与285作XOR运算)

= x³+7x²+14x-8 (然后这就是生成多项式了,你可能注意到-7变成了,这是因为在Galois域里加法和减法是同一种运算)

= x³+(α^198)x²+(α^199)x-α^3 (通常生成多项式都用α^指数来表示,所以把域值换作指数)

好了,到现在,你已经可以求出对应纠错码字数量的生成多项式了。

【Generator Polynomial Tool - QR Code Tutorial】https://www.thonky.com/qr-code-tutorial/generator-polynomial-tool?degree=7

这个链接可以生成生成多项式,大家可以验证自己有没有算对。

3.数据多项式:

这个很简单,假如这块的数据码字有11个的话,且转化为十进制分别是:

10,78,89,15,65,213,54,69,43,26,90;

那么对应的数据多项式就是:

10x^10+78x^9+89x^8+15x^7+65x^6+213x^5+54x^4+69x^3+43x^2+26x^1+90x^0;

同样的,我们将域值换成相应的指数来表示;

(α^51)x^10+(α^34)x^9+(α^210)x^8+(α^75)x^7+(α^191)x^6+(α^157)x^5+(α^249)x^4+(α^221)x^3+(α^218)x^2+(α^105)x^1+(α^19)x^0;

4.求出最终纠错码字:(分两种角度讲解,便于理解)

角度一:真实码字讲解

由于笔者自己在前面文章对数据编码求得有80个数据码字,且选择的版本是Version4L,分块也只有一块,纠错码字数是20个,于是乎笔者的例子中,生成多项式是个20项的多项式,数据多项式是个80项的多项式,对于两个这么大的式子,运算量太大,本身应该是机器去算的,现在笔者就另举例来讲明纠错码字的计算方法。

假如现在我们的数据多项式是:(19项)

(α^4)x^18+(α^3)x^17+(α^72)x^16+(α^5)x^15+(α^62)x^14+(α^43)x^13+(α^17)x^12+(α^123)x^11+(α^51)x^10+(α^34)x^9+(α^210)x^8+(α^75)x^7+(α^191)x^6+(α^157)x^5+(α^249)x^4+(α^221)x^3+(α^218)x^2+(α^105)x^1+(α^19)x^0;

而生成多项式是:(纠错码字数为7的生成多项式)

x^7+(α^87)x^6+(α^229)x^5+(α^146)x^4+(α^149)x^3+(α^238)x^2+(α^102)x+α^21

然后我们要做什么?

先我们把两个多项式化成同等长度(x在这里完全只是起到一个标齐的作用,关键是对它的系数进行处理):

数据多项式:

(α^4)x^18+(α^3)x^17+(α^72)x^16+(α^5)x^15+(α^62)x^14+(α^43)x^13+(α^17)x^12+(α^123)x^11+(α^51)x^10+(α^34)x^9+(α^210)x^8+(α^75)x^7+(α^191)x^6+(α^157)x^5+(α^249)x^4+(α^221)x^3+(α^218)x^2+(α^105)x^1+(α^19)x^0;

生成多项式;

x^11(x^7+(α^87)x^6+(α^229)x^5+(α^146)x^4+(α^149)x^3+(α^238)x^2+(α^102)x+α^21+0+0+0+0+0+0+0+0+0+0+0) (x^11乘进去就省了)

这样两个多项式就是一样长了,然后我们要干嘛?

我们看到两个式子的第一项:

分别为:(α^4)x^18和(α^0) x^18;

我们要做的就是整个生成多项式乘以一个域值m=16=α^4,使得它的的首项与数据多项式的首项相同。那么生成多项式变为:

(α^4)x^18+(α^91)x^17+(α^233)x^16+…+(α^25)x^11+0+0+0+0+0+0+0+0+0+0+0;

现在我们再将数据多项式进行处理,将数据多项式的每一项的系数与生成多项式的系数对应作XOR运算,假设XOR的运算符为~,那么新的数据多项式为:

(α^4~α^4) x^18+(α^3~α^91) x^17+(α^72~α^233)x^16+…+(α^51)x^10+(α^34)x^9+

(α^210)x^8+(α^75)x^7+(α^191)x^6+(α^157)x^5+(α^249)x^4+(α^221)x^3+(α^218)x^2+(α^105)x^1+(α^19)x^0;

(注意作XOR运算的是域值)

然后我们就发现,第一项被消掉了,那么数据多项式的长度就从19变成了18,然后我们把新得到的这个数据多项式再与最原始的生成多项式重复从化为等长度到现在的所有步骤,直到数据多项式的长度减小到0,那时生成多项式是正好乘过一次域值的,所得的多项式就是最终的结果,取每一项的系数依次作为最终的纠错码字。

角度二:模拟码字图片讲解

f6e658a485089850f53acdc94b05b7ab.png

7ff7629d3ddb13250817072ef17b961a.png

d519188a43f5e18d945cc8248921a60b.png

好了,讲到这里,你已经可以自己求出纠错码字了。

下篇文章我们再讲构造最终的码字序列和布置矩阵以及掩码的选择算法,还有格式和版本信息等也在后续之中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值