GPON中FEC算法介绍及示例

算法介绍

        常见的FEC实现包括M+1系列的异或算法、M+N系列的RS矩阵算法。

        M+1的异或算法实现相对简单,将M个数据包逐字节进行异或计算,计算得到的结果即为冗余包。这种算法只需要进行异常运算,复杂度低。但是抗丢包能力弱,例如 4+1算法,5个包里面最多只能丢1个包,否则就无法恢复。

        M+N系列的RS矩阵算法中采用RS编码,是一种应对擦除的编码,也就是应对数据块丢失的场景,并且知道哪一块丢失的,然后可以通过冗余信息把丢失的数据块找回来。

GPON协议中采用RS(255,239)算法作为FEC。RS码的生成多项式为:           

        由生成多项式可得,编码电路的主要部分是一组线性反馈位移寄存器、有限域乘法器、有限域加法器、开关和选择器,如图所示。

 其编码流程如下:

(1)寄存器清零,开关SW闭合,K置位置1,输入信息一方面直接输出至信道,另一方面送入编码电路进行运算,直到239个信息为输入完毕。一旦239个信息位全部进入寄存器电路,在各寄存器中的内容就是余式的系数。

(2)开关SW断开,K打到位置2,将寄存器中的内容输出到信道。这时输出端接到移位寄存器输出端,将移位寄存器中存储的余项依次输出。这样就完成了编码,编码输出239个信息为加16个监督位组成。

RS码的译码方法可分为时域译码和频域译码两种。频域译码将码字看作一个时域数字序列,对其进行有限域的离散傅里叶变化,然后利用其频域点译码。时域译码将码字看做时间轴上的信号序列,利用码的代数结构进行译码。食欲译码算法大致分为四步:

(1)由接收多项式R(x)计算伴随式S(x)

(2)求错误位置多项式

(3)利用钱氏搜索法求错误位置

(4)计算错误值并完成纠错

        GPON协议中采用Reed-Solomon(255, 239)作为前向纠错码实现。RS码是BCH码的一个子类。在q进制BCH码中,每个码元的取值在GF(q)上,而g(x)的根在GF(q)的扩域GF(qm)上。如果码元取值的域和g(x)的根所在域相同,则这类BCH码称为RS码。

一个纠t个符号错误的RS码有如下参数:

码长:n = 2^m – 1或m(2^m - 1)比特

信息字段:k符号或mk比特

监督字段:n – k = 2t符号或m(n-k)比特

最小码距:d = 2t + 1符号或m(2t + 1)比特

        RS码具有k个信息符号和r个监督符号,总码长n=k+r个符号,并满足n=2^m-1符号。当m=8(bit)时,一个码字就有n = 2^m-1 = 255个符号,编码后一个码字就是255*8 = 2040(bit)。实现中可以根据需要选择RS码参数。

        RS(255, 239)即在有限域GF(2^8)上纠正t = 8个符号错误的RS译码。其参数指标如下:

        m = 8, n = 255, t = 8, d = 2t + 1 = 17, k = 239

Matlab参考实现

m = 8;

n = 2^m - 1;

k = 239;

%%% 长度为239字节的数据构造

%{

msg = [0x00  0x65  0xf2  0x50  0x51  0x52  0x53  0x54  0x55  0x56 ...

0x57  0x58  0x59  0x5a  0x5b  0x5c  0xa2  0xec  0x40  0x21 ...

0xf7  0x00  0x01  0x02  0x03  0x04  0x05  0x06  0x07  0x08 ...

0x09  0x0a  0x0b  0x0c  0x0d  0x0e  0x0f  0x10  0x11  0x12 ...

0x13  0x14  0x15  0x16  0x17  0x18  0x19  0x1a  0x1b  0x1c ...

0x1d  0x1e  0x1f  0x20  0x21  0x22  0x23  0x24  0x25  0x26 ...

0x27  0x28  0x29  0x2a  0x2b  0x2c  0x2d  0x2e  0x2f  0x30 ...

0x31  0x32  0x33  0x34  0x35  0x36  0x37  0x38  0x39  0x3a ...

0x3b  0x3c  0x3d  0x3e  0x3f  0x40  0x41  0x42  0x43  0x44 ...

0x45  0x46  0x47  0x48  0x49  0x4a  0x4b  0x4c  0x4d  0x4e ...

0x4f  0x50  0x51  0x52  0x53  0x54  0x55  0x56  0x57  0x58 ...

0x59  0x5a  0x5b  0x5c  0x5d  0x5e  0x5f  0x60  0x61  0x62 ... 

0x63  0x64  0x65  0x66  0x67  0x68  0x69  0x6a  0x6b  0x6c ...

0x6d  0x6e  0x6f  0x70  0x71  0x72  0x73  0x74  0x75  0x76 ...

0x77  0x78  0x79  0x7a  0x7b  0x7c  0x7d  0x7e  0x7f  0x80 ...

0x81  0x82  0x83  0x84  0x85  0x86  0x87  0x88  0x89  0x8a ...

0x8b  0x8c  0x8d  0x8e  0x8f  0x90  0x91  0x92  0x93  0x94 ...

0x95  0x96  0x97  0x98  0x99  0x9a  0x9b  0x9c  0x9d  0x9e ...

0x9f  0xa0  0xa1  0xa2  0xa3  0xa4  0xa5  0xa6  0xa7  0xa8 ...

0xa9  0xaa  0xab  0xac  0xad  0xae  0xaf  0xb0  0xb1  0xb2 ...

0xb3  0xb4  0xb5  0xb6  0xb7  0xb8  0xb9  0xba  0xbb  0xbc ...

0xbd  0xbe  0xbf  0xc0  0xc1  0xc2  0xc3  0xc4  0xc5  0xc6 ...

0xc7  0xc8  0xc9  0xca  0xcb  0xcc  0xcd  0xce  0xcf  0xd0 ...

0xd1  0xd2  0xd3  0xd4  0xd5  0xd6  0xd7  0xd8  0xd9];

%}
 

%%% 长度不足239字节的数据构造

msg = [0xda  0xdb  0xdc  0xdd  0xde  0xdf  0xe0  0xe1  0xe2  0xe3 ...

0xe4  0xe5  0xe6  0xe7  0xe8  0xe9  0xea  0xeb  0xec  0xed  0xee ...

0xef  0xf0  0xf1  0xf2  0xf3  0xf4  0xf5  0xf6  0xf7  0xf8  0xf9 ...

0xfa  0xfb  0xfc  0xfd  0xfe  0x00  0x01  0x02  0x03  0x04  0x05 ...

0x06  0x07  0x08  0x09  0x0a  0x0b  0x0c  0x0d  0x0e  0x0f  0x10 ...

0x11  0x12  0x13  0x14  0x15  0x16  0x17  0x18  0x19  0x1a  0x1b  ...

0x1c  0x1d  0x1e  0x1f  0x20  0x21  0x22  0x23  0x24  0x25  0x26 ...

0x27  0x28  0x29  0x2a  0x2b  0x2c  0x2d  0x2e  0x2f  0x30  0x31 ...

0x32  0x33  0x34  0x35  0x36  0x37  0x38  0x39  0x3a 0x3b  0x3c  ...

0x3d  0x3e  0x3f  0x40  0x41  0x42  0x43  0x44];
 

padding_length = 239 - length(msg); %计算填充0字节的长度

blank = [];

while length(blank) < padding_length

    blank(end + 1) = 0x00;

end


msg = [blank, msg];

msg = msg';


%%%RS(255, 239)编码

hEnc = comm.RSEncoder(n, k);

hEnc.GeneratorPolynomialSource = 'Property';

hEnc.GeneratorPolynomial = rsgenpoly(n, k, 285, 0);

ret = step(hEnc, msg);


%%%去除填充0字节

if padding_length ~= 0

    ret = ret(length(blank) + 1 : end);

end

retHex = dec2hex(ret);

样例

样例1(数据流够239字节,这239字节作为有效信息字节数,做FEC编码,得到后16字节编码信息)

00 65 f2 50 51 52 53 54 55 56 57 58 59 5a 5b 5c a2 ec 40 21 f7 00 01 02 03 04 05 06 07 08 09 0a

0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a

2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a

4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a

6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a

8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa

ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca

cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d1 ee 8b 7e 8e 33 b7 89 cb e4 c4 64 cb 12 d4 d9

样例2(数据流为106字节,首先将有效信息字节前填充零字节至239字节,再进行FEC编码,编码完成后删除刚才填充的0字节,将编码内容追加至有效字节后, 编码后122字节)

da db dc dd de df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9

fa fb fc fd fe 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a

1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a

3b 3c 3d 3e 3f 40 41 42 43 44 72 d1 ba 17 30 b5 03 71 70 49 54 35 1c 40 1e 59

样例3(数据流为239字节)

ff 65 f2 50 51 52 53 54 55 56 57 58 59 5a 5b 5c a2 ec 40 21 f7 00 01 02 03 04 05 06 07 08 09 0a

0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a

2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a

4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a

6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a

8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa

ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca

cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 ff d8 82 14 56 a5 05 d7 f8 96 2d b4 81 54 3b ce 73

样例4(数据流为103字节,编码后119字节)

da db dc dd de df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fe 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 78 90 25 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 46 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 68 de 5e 34 44 1c 8a e7 5e b0 e4 51 cc 75 ff 1b

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巨石阵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值