离线
TA的每日心情 | 慵懒 2021-7-27 09:25 |
---|
签到天数: 57 天 [LV.5]
|
楼主 |
发表于 2020-6-13 21:03:55
|
显示全部楼层
本帖最后由 小飞飞 于 2020-9-29 10:12 编辑
生成的文件上半部分是64的Homer接口函数,下半部分则是伴随式计算的使用代码,待会我们就会看到他们。这个计算方法不是最简单的,但是比较容易理解和实现,因此我也选择了这种算法。最终的伴随式代码如下:
- void bss8(char r[8640], char s[64][14])//伴随式计算,8位并行,输入的0下标表示最高位,输出的伴随式的0下标表示最低位
- {
- int i, j;
- char t[14] = { 0 };//除参数r外,所有数组均为0下标表示最低位
- char c[14] = { 0 };
-
- memset(s, 0, 64 * 14);
- for (j = 0;j < 1080;j++)//每次迭代处理8位数据,分别使用64个不同的伴随式处理模块计算1-64个伴随式的值
- {
- homer1(r + (j << 3), t);
- cheng8(s[0], c);
- for (i = 0;i < 14;i++)
- {
- s[0][i] = t[i] ^ c[i];
- }
- homer2(r + (j << 3), t);
- cheng16(s[1], c);
- for (i = 0;i < 14;i++)
- {
- s[1][i] = t[i] ^ c[i];
- }
- homer3(r + (j << 3), t);
- cheng24(s[2], c);
- for (i = 0;i < 14;i++)
- {
- s[2][i] = t[i] ^ c[i];
- }
- homer4(r + (j << 3), t);
- cheng32(s[3], c);
- for (i = 0;i < 14;i++)
- {
- s[3][i] = t[i] ^ c[i];
- }
- homer5(r + (j << 3), t);
- cheng40(s[4], c);
- for (i = 0;i < 14;i++)
- {
- s[4][i] = t[i] ^ c[i];
- }
- homer6(r + (j << 3), t);
- cheng48(s[5], c);
- for (i = 0;i < 14;i++)
- {
- s[5][i] = t[i] ^ c[i];
- }
- homer7(r + (j << 3), t);
- cheng56(s[6], c);
- for (i = 0;i < 14;i++)
- {
- s[6][i] = t[i] ^ c[i];
- }
- homer8(r + (j << 3), t);
- cheng64(s[7], c);
- for (i = 0;i < 14;i++)
- {
- s[7][i] = t[i] ^ c[i];
- }
- homer9(r + (j << 3), t);
- cheng72(s[8], c);
- for (i = 0;i < 14;i++)
- {
- s[8][i] = t[i] ^ c[i];
- }
- homer10(r + (j << 3), t);
- cheng80(s[9], c);
- for (i = 0;i < 14;i++)
- {
- s[9][i] = t[i] ^ c[i];
- }
- homer11(r + (j << 3), t);
- cheng88(s[10], c);
- for (i = 0;i < 14;i++)
- {
- s[10][i] = t[i] ^ c[i];
- }
- homer12(r + (j << 3), t);
- cheng96(s[11], c);
- for (i = 0;i < 14;i++)
- {
- s[11][i] = t[i] ^ c[i];
- }
- homer13(r + (j << 3), t);
- cheng104(s[12], c);
- for (i = 0;i < 14;i++)
- {
- s[12][i] = t[i] ^ c[i];
- }
- homer14(r + (j << 3), t);
- cheng112(s[13], c);
- for (i = 0;i < 14;i++)
- {
- s[13][i] = t[i] ^ c[i];
- }
- homer15(r + (j << 3), t);
- cheng120(s[14], c);
- for (i = 0;i < 14;i++)
- {
- s[14][i] = t[i] ^ c[i];
- }
- homer16(r + (j << 3), t);
- cheng128(s[15], c);
- for (i = 0;i < 14;i++)
- {
- s[15][i] = t[i] ^ c[i];
- }
- homer17(r + (j << 3), t);
- cheng136(s[16], c);
- for (i = 0;i < 14;i++)
- {
- s[16][i] = t[i] ^ c[i];
- }
- homer18(r + (j << 3), t);
- cheng144(s[17], c);
- for (i = 0;i < 14;i++)
- {
- s[17][i] = t[i] ^ c[i];
- }
- homer19(r + (j << 3), t);
- cheng152(s[18], c);
- for (i = 0;i < 14;i++)
- {
- s[18][i] = t[i] ^ c[i];
- }
- homer20(r + (j << 3), t);
- cheng160(s[19], c);
- for (i = 0;i < 14;i++)
- {
- s[19][i] = t[i] ^ c[i];
- }
- homer21(r + (j << 3), t);
- cheng168(s[20], c);
- for (i = 0;i < 14;i++)
- {
- s[20][i] = t[i] ^ c[i];
- }
- homer22(r + (j << 3), t);
- cheng176(s[21], c);
- for (i = 0;i < 14;i++)
- {
- s[21][i] = t[i] ^ c[i];
- }
- homer23(r + (j << 3), t);
- cheng184(s[22], c);
- for (i = 0;i < 14;i++)
- {
- s[22][i] = t[i] ^ c[i];
- }
- homer24(r + (j << 3), t);
- cheng192(s[23], c);
- for (i = 0;i < 14;i++)
- {
- s[23][i] = t[i] ^ c[i];
- }
- homer25(r + (j << 3), t);
- cheng200(s[24], c);
- for (i = 0;i < 14;i++)
- {
- s[24][i] = t[i] ^ c[i];
- }
- homer26(r + (j << 3), t);
- cheng208(s[25], c);
- for (i = 0;i < 14;i++)
- {
- s[25][i] = t[i] ^ c[i];
- }
- homer27(r + (j << 3), t);
- cheng216(s[26], c);
- for (i = 0;i < 14;i++)
- {
- s[26][i] = t[i] ^ c[i];
- }
- homer28(r + (j << 3), t);
- cheng224(s[27], c);
- for (i = 0;i < 14;i++)
- {
- s[27][i] = t[i] ^ c[i];
- }
- homer29(r + (j << 3), t);
- cheng232(s[28], c);
- for (i = 0;i < 14;i++)
- {
- s[28][i] = t[i] ^ c[i];
- }
- homer30(r + (j << 3), t);
- cheng240(s[29], c);
- for (i = 0;i < 14;i++)
- {
- s[29][i] = t[i] ^ c[i];
- }
- homer31(r + (j << 3), t);
- cheng248(s[30], c);
- for (i = 0;i < 14;i++)
- {
- s[30][i] = t[i] ^ c[i];
- }
- homer32(r + (j << 3), t);
- cheng256(s[31], c);
- for (i = 0;i < 14;i++)
- {
- s[31][i] = t[i] ^ c[i];
- }
- homer33(r + (j << 3), t);
- cheng264(s[32], c);
- for (i = 0;i < 14;i++)
- {
- s[32][i] = t[i] ^ c[i];
- }
- homer34(r + (j << 3), t);
- cheng272(s[33], c);
- for (i = 0;i < 14;i++)
- {
- s[33][i] = t[i] ^ c[i];
- }
- homer35(r + (j << 3), t);
- cheng280(s[34], c);
- for (i = 0;i < 14;i++)
- {
- s[34][i] = t[i] ^ c[i];
- }
- homer36(r + (j << 3), t);
- cheng288(s[35], c);
- for (i = 0;i < 14;i++)
- {
- s[35][i] = t[i] ^ c[i];
- }
- homer37(r + (j << 3), t);
- cheng296(s[36], c);
- for (i = 0;i < 14;i++)
- {
- s[36][i] = t[i] ^ c[i];
- }
- homer38(r + (j << 3), t);
- cheng304(s[37], c);
- for (i = 0;i < 14;i++)
- {
- s[37][i] = t[i] ^ c[i];
- }
- homer39(r + (j << 3), t);
- cheng312(s[38], c);
- for (i = 0;i < 14;i++)
- {
- s[38][i] = t[i] ^ c[i];
- }
- homer40(r + (j << 3), t);
- cheng320(s[39], c);
- for (i = 0;i < 14;i++)
- {
- s[39][i] = t[i] ^ c[i];
- }
- homer41(r + (j << 3), t);
- cheng328(s[40], c);
- for (i = 0;i < 14;i++)
- {
- s[40][i] = t[i] ^ c[i];
- }
- homer42(r + (j << 3), t);
- cheng336(s[41], c);
- for (i = 0;i < 14;i++)
- {
- s[41][i] = t[i] ^ c[i];
- }
- homer43(r + (j << 3), t);
- cheng344(s[42], c);
- for (i = 0;i < 14;i++)
- {
- s[42][i] = t[i] ^ c[i];
- }
- homer44(r + (j << 3), t);
- cheng352(s[43], c);
- for (i = 0;i < 14;i++)
- {
- s[43][i] = t[i] ^ c[i];
- }
- homer45(r + (j << 3), t);
- cheng360(s[44], c);
- for (i = 0;i < 14;i++)
- {
- s[44][i] = t[i] ^ c[i];
- }
- homer46(r + (j << 3), t);
- cheng368(s[45], c);
- for (i = 0;i < 14;i++)
- {
- s[45][i] = t[i] ^ c[i];
- }
- homer47(r + (j << 3), t);
- cheng376(s[46], c);
- for (i = 0;i < 14;i++)
- {
- s[46][i] = t[i] ^ c[i];
- }
- homer48(r + (j << 3), t);
- cheng384(s[47], c);
- for (i = 0;i < 14;i++)
- {
- s[47][i] = t[i] ^ c[i];
- }
- homer49(r + (j << 3), t);
- cheng392(s[48], c);
- for (i = 0;i < 14;i++)
- {
- s[48][i] = t[i] ^ c[i];
- }
- homer50(r + (j << 3), t);
- cheng400(s[49], c);
- for (i = 0;i < 14;i++)
- {
- s[49][i] = t[i] ^ c[i];
- }
- homer51(r + (j << 3), t);
- cheng408(s[50], c);
- for (i = 0;i < 14;i++)
- {
- s[50][i] = t[i] ^ c[i];
- }
- homer52(r + (j << 3), t);
- cheng416(s[51], c);
- for (i = 0;i < 14;i++)
- {
- s[51][i] = t[i] ^ c[i];
- }
- homer53(r + (j << 3), t);
- cheng424(s[52], c);
- for (i = 0;i < 14;i++)
- {
- s[52][i] = t[i] ^ c[i];
- }
- homer54(r + (j << 3), t);
- cheng432(s[53], c);
- for (i = 0;i < 14;i++)
- {
- s[53][i] = t[i] ^ c[i];
- }
- homer55(r + (j << 3), t);
- cheng440(s[54], c);
- for (i = 0;i < 14;i++)
- {
- s[54][i] = t[i] ^ c[i];
- }
- homer56(r + (j << 3), t);
- cheng448(s[55], c);
- for (i = 0;i < 14;i++)
- {
- s[55][i] = t[i] ^ c[i];
- }
- homer57(r + (j << 3), t);
- cheng456(s[56], c);
- for (i = 0;i < 14;i++)
- {
- s[56][i] = t[i] ^ c[i];
- }
- homer58(r + (j << 3), t);
- cheng464(s[57], c);
- for (i = 0;i < 14;i++)
- {
- s[57][i] = t[i] ^ c[i];
- }
- homer59(r + (j << 3), t);
- cheng472(s[58], c);
- for (i = 0;i < 14;i++)
- {
- s[58][i] = t[i] ^ c[i];
- }
- homer60(r + (j << 3), t);
- cheng480(s[59], c);
- for (i = 0;i < 14;i++)
- {
- s[59][i] = t[i] ^ c[i];
- }
- homer61(r + (j << 3), t);
- cheng488(s[60], c);
- for (i = 0;i < 14;i++)
- {
- s[60][i] = t[i] ^ c[i];
- }
- homer62(r + (j << 3), t);
- cheng496(s[61], c);
- for (i = 0;i < 14;i++)
- {
- s[61][i] = t[i] ^ c[i];
- }
- homer63(r + (j << 3), t);
- cheng504(s[62], c);
- for (i = 0;i < 14;i++)
- {
- s[62][i] = t[i] ^ c[i];
- }
- homer64(r + (j << 3), t);
- cheng512(s[63], c);
- for (i = 0;i < 14;i++)
- {
- s[63][i] = t[i] ^ c[i];
- }
- }
- }
复制代码
代码里面能使用常数乘法器的地方均使用了常数乘法器,直接将数据输入进来即可,输出的伴随式一共有64个,后续的错误多项式求取将会用到。
四、解码-错误多项式
计算完了伴随式,我们就可以进入下一步--求取错误多项式了。错误多项式包含了错误的位置信息,可以再进一步求取出错误位置,并完成纠错。
同时,在错误数量小于可纠错位数时,错误多项式的非零项数量也代表了错误的数量。
第一篇文章里面介绍了一种适合硬件实现且比较节约资源的SIBM算法,无须求逆,因此适合在ARM/FPGA上运行,代码如下:
- void cw8(char s[64][14], char e[33][14])//根据伴随式计算错误多项式,使用SIBM算法,只需迭代t次,输入伴随式,输出最高次为t的错误多项式
- {
- int i, j, k;
- char d[14];
- char dq[14] = { 0 };//所有数组均使用0下标表示最低位
- char t[33][14] = { 0 };
- char b[33][14] = { 0 };
- char elp[33][14] = { 0 };
- char st[33][14] = { 0 };
- char c[14] = { 0 };
- char c2[14] = { 0 };
-
- memcpy_s(d, 14, s[0], 14);
- dq[0] = 1;
- b[0][0] = 1;
- elp[0][0] = 1;
- memset(e, 0, 33 * 14);
-
- for (j = 1;j <= 32;j++)
- {
- if (d[0] | d[1] | d[2] | d[3] | d[4] | d[5] | d[6] | d[7] | d[8] | d[9] | d[10] | d[11] | d[12] | d[13])//判断d是否为0
- {
- if (j == 1)
- {
- memcpy_s(elp[1], 14, s[0], 14);//其余不需要修改,都是1
- }
- else
- {
- memcpy_s(t[0], 14, elp[0], 14);
- memcpy_s(t[1], 14, elp[1], 14);
- chengchar(dq, elp[0], c);//0次项和1次项只和e(x)有关
- memcpy_s(elp[0], 14, c, 14);
- chengchar(dq, elp[1], c);
- memcpy_s(elp[1], 14, c, 14);
- for (i = 2;i < 33;i++)//e(x)=dq*e(x)+d*x^2*b(x)
- {
- memcpy_s(t[i], 14, elp[i], 14);
- chengchar(dq, elp[i], c);
- chengchar(d, b[i - 2], c2);
- for (k = 0;k < 14;k++)
- {
- elp[i][k] = c[k] ^ c2[k];
- }
- }
- for (i = 0;i < 33;i++)//B(x)=e(x)
- {
- memcpy_s(b[i], 14, t[i], 14);
- }
- }
- memcpy_s(dq, 14, d, 14);
- }
- else
- {
- for (i = 32;i > 1;i--)//B(x)=x^2*B(x),dq和e(x)不变,无需修改
- {
- memcpy_s(b[i], 14, b[i - 2], 14);
- }
- memset(b[0], 0, 14);
- memset(b[1], 0, 14);
- }
-
- if (j < 32)//最后一次不迭代,没有意义,实际上最后一个伴随式的值没有用到
- {
- memset(d, 0, 14);//为便于硬件实现,这里每次都做32次运算,由于0乘任何数均为0,0异或任何数均不变,因此不影响结果
- for (i = 32;i > 1;i--)
- {
- memcpy_s(st[i], 14, st[i - 2], 14);//全部右移2位
- }
- memcpy_s(st[0], 14, s[(j << 1)], 14);
- memcpy_s(st[1], 14, s[(j << 1) - 1], 14);
- for (i = 0;i < 33;i++)
- {
- chengchar(st[i], elp[i], c);
- for (k = 0;k < 14;k++)
- {
- d[k] ^= c[k];
- }
- }
- }
- }
- memcpy_s(e, 14 * 33, elp, 14 * 33);
- }
复制代码
输入之前计算得到的64个伴随式,输出33个错误多项式,特别说明一下,因为我们的纠错能力是32位,因此错误多项式的最高次项是32次,加上常数项,一共就有33项,这里千万不要漏掉一项,不然会造成纠错能力下降1位的。
获取了错误多项式后,如果最高次项为0,那么错误位数小于32位,错误多项式的最高次项的次数就是错误的总比特数,同时我们可以根据错误多项式查找具体的错误位置。
五、解码-钱搜索
钱搜索是目前BCH最常用的错误位置求取方法,该方法本质上就是穷举所有的出错可能,并根据结果判断是否正确。
虽然原理粗浅,但是目前最实用的一种方法。
前面已经说到,对于8192的数据,我们实际上用的是16383的码,只是前面的数据都视为0或者视为1了,因此,在搜索时,我们需要先跳转到全0或全1搜索到数据开始位置时的搜索状态,也就是对每一个搜索项做一个乘法。具体代码如下:
- void ss8(char r[8640], char e[33][14], char out[8192])//错误搜索,使用钱搜索方法,输入接收到的数据和错误多项式,输出正确的数据
- {
- char elp[32][14];
- int i, j, k;
- char s[14] = { 0 };//除r和out外,所有数组均使用0下标表示最低位
- char c[14] = { 0 };
-
- memcpy_s(elp, 14 * 32, e + 1, 14 * 32);
- cheng7743(elp[0], c);//初始化处理,由于是缩短码,需要将错误多项式全部乘以a的一定幂次,以便从中间开始
- for (i = 0;i < 14;i++)
- {
- elp[0][i] = c[i];
- }
- cheng15486(elp[1], c);
- for (i = 0;i < 14;i++)
- {
- elp[1][i] = c[i];
- }
- cheng6846(elp[2], c);
- for (i = 0;i < 14;i++)
- {
- elp[2][i] = c[i];
- }
- cheng14589(elp[3], c);
- for (i = 0;i < 14;i++)
- {
- elp[3][i] = c[i];
- }
- cheng5949(elp[4], c);
- for (i = 0;i < 14;i++)
- {
- elp[4][i] = c[i];
- }
- cheng13692(elp[5], c);
- for (i = 0;i < 14;i++)
- {
- elp[5][i] = c[i];
- }
- cheng5052(elp[6], c);
- for (i = 0;i < 14;i++)
- {
- elp[6][i] = c[i];
- }
- cheng12795(elp[7], c);
- for (i = 0;i < 14;i++)
- {
- elp[7][i] = c[i];
- }
- cheng4155(elp[8], c);
- for (i = 0;i < 14;i++)
- {
- elp[8][i] = c[i];
- }
- cheng11898(elp[9], c);
- for (i = 0;i < 14;i++)
- {
- elp[9][i] = c[i];
- }
- cheng3258(elp[10], c);
- for (i = 0;i < 14;i++)
- {
- elp[10][i] = c[i];
- }
- cheng11001(elp[11], c);
- for (i = 0;i < 14;i++)
- {
- elp[11][i] = c[i];
- }
- cheng2361(elp[12], c);
- for (i = 0;i < 14;i++)
- {
- elp[12][i] = c[i];
- }
- cheng10104(elp[13], c);
- for (i = 0;i < 14;i++)
- {
- elp[13][i] = c[i];
- }
- cheng1464(elp[14], c);
- for (i = 0;i < 14;i++)
- {
- elp[14][i] = c[i];
- }
- cheng9207(elp[15], c);
- for (i = 0;i < 14;i++)
- {
- elp[15][i] = c[i];
- }
- cheng567(elp[16], c);
- for (i = 0;i < 14;i++)
- {
- elp[16][i] = c[i];
- }
- cheng8310(elp[17], c);
- for (i = 0;i < 14;i++)
- {
- elp[17][i] = c[i];
- }
- cheng16053(elp[18], c);
- for (i = 0;i < 14;i++)
- {
- elp[18][i] = c[i];
- }
- cheng7413(elp[19], c);
- for (i = 0;i < 14;i++)
- {
- elp[19][i] = c[i];
- }
- cheng15156(elp[20], c);
- for (i = 0;i < 14;i++)
- {
- elp[20][i] = c[i];
- }
- cheng6516(elp[21], c);
- for (i = 0;i < 14;i++)
- {
- elp[21][i] = c[i];
- }
- cheng14259(elp[22], c);
- for (i = 0;i < 14;i++)
- {
- elp[22][i] = c[i];
- }
- cheng5619(elp[23], c);
- for (i = 0;i < 14;i++)
- {
- elp[23][i] = c[i];
- }
- cheng13362(elp[24], c);
- for (i = 0;i < 14;i++)
- {
- elp[24][i] = c[i];
- }
- cheng4722(elp[25], c);
- for (i = 0;i < 14;i++)
- {
- elp[25][i] = c[i];
- }
- cheng12465(elp[26], c);
- for (i = 0;i < 14;i++)
- {
- elp[26][i] = c[i];
- }
- cheng3825(elp[27], c);
- for (i = 0;i < 14;i++)
- {
- elp[27][i] = c[i];
- }
- cheng11568(elp[28], c);
- for (i = 0;i < 14;i++)
- {
- elp[28][i] = c[i];
- }
- cheng2928(elp[29], c);
- for (i = 0;i < 14;i++)
- {
- elp[29][i] = c[i];
- }
- cheng10671(elp[30], c);
- for (i = 0;i < 14;i++)
- {
- elp[30][i] = c[i];
- }
- cheng2031(elp[31], c);
- for (i = 0;i < 14;i++)
- {
- elp[31][i] = c[i];
- }
-
- for (j = 0;j < 1024;j++)
- {
- for (k = 0;k < 8;k++)//这里仍然是串行,但在硬件实现时可以将该循环并行化,实现8位并行处理
- {
- cheng1(elp[0], c);//乘以对应幂次
- for (i = 0;i < 14;i++)
- {
- elp[0][i] = c[i];
- }
- cheng2(elp[1], c);
- for (i = 0;i < 14;i++)
- {
- elp[1][i] = c[i];
- }
- cheng3(elp[2], c);
- for (i = 0;i < 14;i++)
- {
- elp[2][i] = c[i];
- }
- cheng4(elp[3], c);
- for (i = 0;i < 14;i++)
- {
- elp[3][i] = c[i];
- }
- cheng5(elp[4], c);
- for (i = 0;i < 14;i++)
- {
- elp[4][i] = c[i];
- }
- cheng6(elp[5], c);
- for (i = 0;i < 14;i++)
- {
- elp[5][i] = c[i];
- }
- cheng7(elp[6], c);
- for (i = 0;i < 14;i++)
- {
- elp[6][i] = c[i];
- }
- cheng8(elp[7], c);
- for (i = 0;i < 14;i++)
- {
- elp[7][i] = c[i];
- }
- cheng9(elp[8], c);
- for (i = 0;i < 14;i++)
- {
- elp[8][i] = c[i];
- }
- cheng10(elp[9], c);
- for (i = 0;i < 14;i++)
- {
- elp[9][i] = c[i];
- }
- cheng11(elp[10], c);
- for (i = 0;i < 14;i++)
- {
- elp[10][i] = c[i];
- }
- cheng12(elp[11], c);
- for (i = 0;i < 14;i++)
- {
- elp[11][i] = c[i];
- }
- cheng13(elp[12], c);
- for (i = 0;i < 14;i++)
- {
- elp[12][i] = c[i];
- }
- cheng14(elp[13], c);
- for (i = 0;i < 14;i++)
- {
- elp[13][i] = c[i];
- }
- cheng15(elp[14], c);
- for (i = 0;i < 14;i++)
- {
- elp[14][i] = c[i];
- }
- cheng16(elp[15], c);
- for (i = 0;i < 14;i++)
- {
- elp[15][i] = c[i];
- }
- cheng17(elp[16], c);
- for (i = 0;i < 14;i++)
- {
- elp[16][i] = c[i];
- }
- cheng18(elp[17], c);
- for (i = 0;i < 14;i++)
- {
- elp[17][i] = c[i];
- }
- cheng19(elp[18], c);
- for (i = 0;i < 14;i++)
- {
- elp[18][i] = c[i];
- }
- cheng20(elp[19], c);
- for (i = 0;i < 14;i++)
- {
- elp[19][i] = c[i];
- }
- cheng21(elp[20], c);
- for (i = 0;i < 14;i++)
- {
- elp[20][i] = c[i];
- }
- cheng22(elp[21], c);
- for (i = 0;i < 14;i++)
- {
- elp[21][i] = c[i];
- }
- cheng23(elp[22], c);
- for (i = 0;i < 14;i++)
- {
- elp[22][i] = c[i];
- }
- cheng24(elp[23], c);
- for (i = 0;i < 14;i++)
- {
- elp[23][i] = c[i];
- }
- cheng25(elp[24], c);
- for (i = 0;i < 14;i++)
- {
- elp[24][i] = c[i];
- }
- cheng26(elp[25], c);
- for (i = 0;i < 14;i++)
- {
- elp[25][i] = c[i];
- }
- cheng27(elp[26], c);
- for (i = 0;i < 14;i++)
- {
- elp[26][i] = c[i];
- }
- cheng28(elp[27], c);
- for (i = 0;i < 14;i++)
- {
- elp[27][i] = c[i];
- }
- cheng29(elp[28], c);
- for (i = 0;i < 14;i++)
- {
- elp[28][i] = c[i];
- }
- cheng30(elp[29], c);
- for (i = 0;i < 14;i++)
- {
- elp[29][i] = c[i];
- }
- cheng31(elp[30], c);
- for (i = 0;i < 14;i++)
- {
- elp[30][i] = c[i];
- }
- cheng32(elp[31], c);
- for (i = 0;i < 14;i++)
- {
- elp[31][i] = c[i];
- }
- memcpy_s(s, 14, e[0], 14);
- for (i = 0;i < 32;i++)
- {
- s[0] ^= elp[i][0];
- s[1] ^= elp[i][1];
- s[2] ^= elp[i][2];
- s[3] ^= elp[i][3];
- s[4] ^= elp[i][4];
- s[5] ^= elp[i][5];
- s[6] ^= elp[i][6];
- s[7] ^= elp[i][7];
- s[8] ^= elp[i][8];
- s[9] ^= elp[i][9];
- s[10] ^= elp[i][10];
- s[11] ^= elp[i][11];
- s[12] ^= elp[i][12];
- s[13] ^= elp[i][13];
- }
- if (s[0] | s[1] | s[2] | s[3] | s[4] | s[5] | s[6] | s[7] | s[8] | s[9] | s[10] | s[11] | s[12] | s[13])
- {
- out[(j << 3) + k] = r[(j << 3) + k];
- }
- else
- {
- out[(j << 3) + k] = r[(j << 3) + k] ^ (char)0x01;
- printf("错误位置:%d\n", (j << 3) + k);
- }
- }
- }
- }
复制代码
由于数据是二进制的,得出了错误位置后,直接将所在位的数据取反就可以得到正确的数据,至此,数据的BCH编码和解码、纠错就全部完成了。
最后,附上一段在网上找到的BCH编码算法,使用传统的BM算法计算错误多项式,供大家参考:
- void decode_bch(char * recd, int length, int t, int n)//国外的BCH解码算法,使用传统的BM算法计算错误多项式
- /*
- * Simon Rockliff's implementation of Berlekamp's algorithm.
- *
- * Assume we have received bits in recd[i], i=0..(n-1).
- *
- * Compute the 2*t syndromes by substituting alpha^i into rec(X) and
- * evaluating, storing the syndromes in s[i], i=1..2t (leave s[0] zero) .
- * Then we use the Berlekamp algorithm to find the error location polynomial
- * elp[i].
- *
- * If the degree of the elp is >t, then we cannot correct all the errors, and
- * we have detected an uncorrectable error pattern. We output the information
- * bits uncorrected.
- *
- * If the degree of elp is <=t, we substitute alpha^i , i=1..n into the elp
- * to get the roots, hence the inverse roots, the error location numbers.
- * This step is usually called "Chien's search".
- *
- * If the number of errors located is not equal the degree of the elp, then
- * the decoder assumes that there are more than t errors and cannot correct
- * them, only detect them. We output the information bits uncorrected.
- */
- {
- register int i, j, u, q, t2, count = 0, syn_error = 0;
- int elp[1026][1024], d[1026], l[1026], u_lu[1026], s[1025];
- int root[200], loc[200], reg[201];
-
- t2 = 2 * t;
-
- /* first form the syndromes */
- printf("S(x) = ");
- for (i = 1; i <= t2; i++) {
- s[i] = 0;
- for (j = 0; j < length; j++)
- if (recd[j] != 0)
- s[i] ^= ys[(i * j) % n];
- if (s[i] != 0)
- syn_error = 1; /* set error flag if non-zero syndrome */
- /*
- * Note: If the code is used only for ERROR DETECTION, then
- * exit program here indicating the presence of errors.
- */
- /* convert syndrome from polynomial form to index form */
- s[i] = ys2[s[i]];
- printf("%3d ", s[i]);
- }
- printf("\n");
-
- if (syn_error) { /* if there are errors, try to correct them */
- /*
- * Compute the error location polynomial via the Berlekamp
- * iterative algorithm. Following the terminology of Lin and
- * Costello's book : d[u] is the 'mu'th discrepancy, where
- * u='mu'+1 and 'mu' (the Greek letter!) is the step number
- * ranging from -1 to 2*t (see L&C), l[u] is the degree of
- * the elp at that step, and u_l[u] is the difference between
- * the step number and the degree of the elp.
- */
- /* initialise table entries */
- d[0] = 0; /* index form */
- d[1] = s[1]; /* index form */
- elp[0][0] = 0; /* index form */
- elp[1][0] = 1; /* polynomial form */
- for (i = 1; i < t2; i++)
- {
- elp[0][i] = -1; /* index form */
- elp[1][i] = 0; /* polynomial form */
- }
- l[0] = 0;
- l[1] = 0;
- u_lu[0] = -1;
- u_lu[1] = 0;
- u = 0;
- do
- {
- u++;
- if (d[u] == -1)
- {
- l[u + 1] = l[u];
- for (i = 0; i <= l[u]; i++)
- {
- elp[u + 1][i] = elp[u][i];
- elp[u][i] = ys2[elp[u][i]];
- }
- }
- else//search for words with greatest u_lu[q] for which d[q]!=0搜索最高次项
- {
- q = u - 1;
- while ((d[q] == -1) && (q > 0))
- q--;// have found first non-zero d[q]找到第一个非0的q
- if (q > 0)
- {
- j = q;
- do
- {
- j--;
- if ((d[j] != -1) && (u_lu[q] < u_lu[j]))
- q = j;
- } while (j > 0);
- }//have now found q such that d[u]!=0 and u_lu[q] is maximum找到符合条件的q
- if (l[u] > l[q] + u - q)//store degree of new elp polynomial存储多项式系数
- l[u + 1] = l[u];
- else
- l[u + 1] = l[q] + u - q;
- for (i = 0; i < t2; i++)//form new elp(x)
- elp[u + 1][i] = 0;
- for (i = 0; i <= l[q]; i++)
- if (elp[q][i] != -1)
- elp[u + 1][i + u - q] = ys[(d[u] + n - d[q] + elp[q][i]) % n];
- for (i = 0; i <= l[u]; i++)
- {
- elp[u + 1][i] ^= elp[u][i];
- elp[u][i] = ys2[elp[u][i]];
- }
- }
- u_lu[u + 1] = u - l[u + 1];
- if (u < t2)//form (u+1)th discrepancy这段代码计算Dn=Sn+1+E(Sn+1-i * Oi)
- {
- if (s[u + 1] != -1)//no discrepancy computed on last iteration上次迭代中没有错误
- d[u + 1] = ys[s[u + 1]];//将伴随式转换为十进制
- else
- d[u + 1] = 0;
- for (i = 1; i <= l[u + 1]; i++)//算Dj
- if ((s[u + 1 - i] != -1) && (elp[u + 1][i] != 0))
- d[u + 1] ^= ys[(s[u + 1 - i] + ys2[elp[u + 1][i]]) % n];
- d[u + 1] = ys2[d[u + 1]];//put d[u+1] into index form转换为幂次
- }
- } while ((u < t2) && (l[u + 1] <= t));
-
- u++;
- if (l[u] <= t) {/* Can correct errors */
- /* put elp into index form */
- for (i = 0; i <= l[u]; i++)
- elp[u][i] = ys2[elp[u][i]];
-
- printf("sigma(x) = ");
- for (i = 0; i <= l[u]; i++)
- printf("%3d ", elp[u][i]);
- printf("\n");
- printf("Roots: ");
-
- /* Chien search: find roots of the error location polynomial */
- for (i = 1; i <= l[u]; i++)
- reg[i] = elp[u][i];
- count = 0;
- for (i = 1; i <= n; i++)
- {
- q = 1;
- for (j = 1; j <= l[u]; j++)
- if (reg[j] != -1)
- {
- reg[j] = (reg[j] + j) % n;
- q ^= ys[reg[j]];
- }
- if (!q)
- { // store root and error location number indices
- root[count] = i;
- loc[count] = n - i;
- count++;
- printf("%3d ", n - i);
- }
- }
- printf("\n");
- if (count == l[u])
- /* no. roots = degree of elp hence <= t errors */
- for (i = 0; i < l[u]; i++)
- recd[loc[i]] ^= 1;
- else /* elp has degree >t hence cannot solve */
- printf("Incomplete decoding: errors detected\n");
- }
- }
- }
复制代码 完
|
|