MATLAB做RS码 【RS码学习笔记】
用的是《无线通信的MATLAB和FPGA实现》这本书
里德——索罗蒙码(RS码)是一类具有很强纠错能力的多进制BCH码。
RS码是线性分组码中的一种。相比其他线性分组码而言,在同样的编码效率下,RS码的纠错能力是特别强的,特别在短的中等码长下,其性能接近于理论值。
RS(n,k)码可以由m、n、k3个参数表示,其中m表示码元符号取自域\(GF(2^m)\),n为码字长度,k为信息段长度。
RS码生成多项式一般怎么取?
g(x)只能这么取吗?
书里给出的一个具体的例子
对于\(\mathrm{RS}\left(7,3\right)\)码,利用3个信息符号得到长度为7的编码,码元符号来自域\(\mathrm{GF}\left(2^{3}\right)\),即\(m=3\)。域\(\mathrm{GF}\left(2^{3}\right)\)的本原多项式为\(a^3+a+1\),RS码的生成多项式为\(g(x)=x^4+3x^3+x^2+2x+3\)。假设输入符号为[4 0 6],则信息段多项式\(d(x)=4x^2+6\)。生成码字的过程如下:
- 由于码元符号来自域\(\mathrm{GF}\left(2^{3}\right)\),所以一个符号可以由3个比特表示,\(x^{n-k} d(x) = x^4d(x)\)的二进制比特表示为[100 000 110 000 000 000 000];
- \(g(x)\)的二进制比特表示为[001 011 001 010 011];
- 计算\(x^{n-k} d(x) / g(x)\)得到的余式\(r(x)\)的二进制比特表示为[100 010 010 000],因此校验位为[4 2 2 0];
- 生成的码字即为[4 0 6 4 2 2 0]。
%g(x)不需要指定吗
msgw=gf([4 0 6],3) %3表示3比特
rsenc(msgw,7,3)
%结果是[4 0 6 4 2 2 0] 一致
附注
有些我一开始没看明白,我找到这个帖子才看看懂
首先啥是本原多项式primitive polynomial,
感觉和质数很像,
或者列表在哪查? https://www.cnblogs.com/yhm138/articles/16273575.html
ok
GF(2^m) 我猜2表示比特,m说明一个符号有m比特
\(2t=n-k\)
2t是说,监督位有2t个符号,这里我们一个符号是3比特
\(g(x)\)一般取上面提到的那个形式
然后还要对8取模,这里我们继续按照“翻译表”把阶次降低,降低到最后就是
\(g(x)=x^4+3x^3+x^2+2x+3\)
代码
%本例中输入信息分为km比特一组,每组k个符号
%每个符号由m个比特组成
%快速演示,没有具体的编码解码方法
clear all;
m=4;%每个符号比特数
n=10;%码字长度
k=8;%每组符号数
t=(n-k)/2;%码的纠正能力
nw=1; %处理的码字个数
x=[0,1,2,3,4,5,6,7]; %输入的字符
msgw=gf(x,4);
c=rsenc(msgw,n,k);%RS编码
%—————信道部分———————————
cnoisy=c;
%—————信道部分———————————
%RS译码
[dc,nerrs,corrcode]= rsdec(cnoisy,n,k);
isequal(dc,msgw) & isequal(corrcode,c)
disp(['nerrs=',num2str(nerrs)]);
吐个槽,《无线通信的MATLAB和FPGA实现》这里给的代码太难看了,我给改成了上面这个样子。
感兴趣可以查函数文档进一步学习。