该出版物将线性组代码视为系统校正代码的代表之一,并提出了其在C ++中的实现。
什么是纠正码? 纠正代码是旨在检测和纠正错误的代码。 系统代码-这些代码是将控制位和信息位放在特定系统上的代码。 一个这样的例子是汉明码或实际的线性组码。
线性组代码由信息位和控制位组成。 例如,对于初始的4个字符的组合,线性分组的代码如下所示:
|1100|110|
前四个字符是我们的原始组合,后三个字符是控制位。
线性组代码的总长度为7个字符。 如果我们知道原始组合的位数,那么要计算校验位数,您需要使用以下公式:
其中n是信息位数,即原始组合的长度,log为2。代码的总长度N将由以下公式计算:
假设原始组合为10位。
d总是四舍五入,并且d = 4。
完整的代码长度将为
14位。
确定了代码的长度后,我们需要组成一个生产和验证矩阵。
生成矩阵,尺寸为N x n,其中N是线性组代码的长度,n是线性组代码的信息部分的长度。 实际上,产生矩阵由两个矩阵组成:单位维度为m×m,以及控制比特为d×n的矩阵。 如果通过将单位布置在主对角线上来编译单位矩阵,则编译矩阵的“控制”部分具有一些规则。 通过示例更容易解释。 我们采用已知的10个信息位的组合,但在代码中添加了冗余,并在代码中添加了第5个控制位。 矩阵的尺寸为15 x 10。
1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1
“控制”部分是根据用于减少二进制数并遵守行之间最小代码距离的方案编译的:在我们的情况下为11111、11110、11101 ...
组合的最小代码距离将通过以下公式计算:
Wp=r+s
其中r是要检测的错误的等级,而s是要纠正的错误的等级。
在我们的案例中,可纠正和可检测错误的等级为1。
还必须草拟一个验证矩阵。 通过转置“控制”部分进行编译,然后添加尺寸为d x d的单位矩阵。
1 1 1 1 1 0 1 1 1 0 1 0 0 0 0 1 1 1 1 0 1 1 1 0 1 0 1 0 0 0 1 1 1 0 1 1 1 0 0 0 0 0 1 0 0 1 1 0 1 1 1 0 0 1 1 0 0 0 1 0 1 0 1 1 1 1 0 1 1 1 0 0 0 0 1
编译矩阵后,我们可以通过将原始消息的非零位数下的生成矩阵的行相加来编写线性组代码。
考虑此步骤作为原始消息1001101010的示例。
线性组代码:100110101011100
我们立即注意到,LGK中的控制位是根据相应索引之和的奇偶性规则确定的,在我们的情况下,这些数量为:5、3、3、4、4。 因此,代码的控制部分看起来是:11100。
结果,我们编译了线性组代码。 但是,如前所述,线性组代码具有纠正能力,在我们的情况下,它能够检测和纠正单个错误。
假设我们发送的代码在第6类中有错误。 为了确定代码中的错误,使用了预先编译的验证矩阵。
为了确定错误发生在哪个特定类别中,我们需要知道“错误综合症”。 通过校验奇偶校验矩阵的非零位置的方法来计算错误校验子。 在我们的例子中,有五种检查,并且我们通过所有这些检查发布了收到的消息。
收到二进制数后,我们将其与验证矩阵的列进行比较。 一旦找到相应的“综合症”,就确定其索引,并根据获得的索引进行位的逆运算。
在我们的案例中,校正子为:01111,它对应于LGA中的第六类。 我们将该位取反并获得正确的线性组代码。
校正后的LGK的解码仅通过删除控制位即可完成。 删除LGK的控制位后,我们得到原始组合,该组合被发送进行编码。
总而言之,我们可以说诸如线性群码,汉明码之类的校正码已经相当过时了,并且在其有效性方面,它们肯定会替代其现代替代品。 但是,它们非常应付熟悉二进制编码的过程以及由于干扰对通信信道的影响而纠正错误的方法。
在C ++中使用LGK的工作的实现:
#include <iostream> #include <vector> #include <string> #include <cstdlib> #include <ctime> #include <algorithm> #include <iterator> #include <cctype> #include <cmath> using namespace std; int main() { setlocale(LC_ALL, "Russian"); cout<<" :"<<endl; int matr [10][15]={{1,0,0,0,0,0,0,0,0,0,1,1,1,1,1},{0,1,0,0,0,0,0,0,0,0,1,1,1,1,0},{0,0,1,0,0,0,0,0,0,0,1,1,1,0,1},{0,0,0,1,0,0,0,0,0,0,1,1,0,1,1},{0,0,0,0,1,0,0,0,0,0,1,0,1,1,1}, {0,0,0,0,0,1,0,0,0,0,0,1,1,1,1},{0,0,0,0,0,0,1,0,0,0,1,1,1,0,0},{0,0,0,0,0,0,0,1,0,0,1,1,0,0,1},{0,0,0,0,0,0,0,0,1,0,1,0,0,1,1},{0,0,0,0,0,0,0,0,0,1,0,1,0,1,1}}; for(int i=0;i<10;i++) { for(int j=0;j<15;j++) { cout<<matr[i][j]<<' '; } cout<<endl; } cout<<" :"<<endl; int matr_2 [5][15]={{1,1,1,1,1,0,1,1,1,0,1,0,0,0,0},{1,1,1,1,0,1,1,1,0,1,0,1,0,0,0},{1,1,1,0,1,1,1,0,0,0,0,0,1,0,0},{1,1,0,1,1,1,0,0,1,1,0,0,0,1,0},{1,0,1,1,1,1,0,1,1,1,0,0,0,0,1}}; for(int i=0;i<5;i++) { for(int j=0;j<15;j++) { cout<<matr_2[i][j]<<' '; } cout<<endl; } cout<<" : "<<endl; string str; bool flag=false; while(flag!=true) { cin>>str; if(str.size()!=10) { cout<<" !"<<endl; flag=false; } else flag=true; } vector <int> arr; for(int i=0;i<str.size();i++) { if(str[i]=='1') arr.push_back(1); else if(str[i]=='0') arr.push_back(0); } cout<<" : "; for(int i=0;i<arr.size();i++) cout<<arr[i]; cout<<endl; vector <int> S; vector <vector<int>> R; for(int i=0;i<10;i++) { if(arr[i]==1) { vector <int> T; for(int j=0;j<15;j++) { T.push_back(matr[i][j]); } R.push_back(T); } } cout<<endl; cout<<" : "<<endl; for(vector <vector<int>>::iterator it=R.begin();it!=R.end();it++) { copy((*it).begin(),(*it).end(),ostream_iterator<int>(cout,"\t")); cout<<"\n"; } cout<<endl; vector <int> P; for(int i=0; i<15;i++) { int PT=0; for(int j=0; j<R.size();j++) { PT+=R[j][i]; } P.push_back(PT); } for(int i=10; i<15;i++) { if(P[i]%2==0) P[i]=0; else if(P[i]%2!=0) P[i]=1; } cout<<endl<<" : "<<endl; for(int i=0; i<P.size();i++) { cout<<P[i]<<' '; } int rand_i; rand_i=5; cout<<endl<<" : "; if(P[rand_i]==0) P[rand_i]=1; else if(P[rand_i]==1) P[rand_i]=0; for(int i=0; i<P.size();i++) { cout<<P[i]<<' '; } int S1, S2, S3, S4, S5; // S1=P[0]+P[1]+P[2]+P[3]+P[4]+P[6]+P[7]+P[8]+P[10]; S2=P[0]+P[1]+P[2]+P[3]+P[5]+P[6]+P[7]+P[9]+P[11]; S3=P[0]+P[1]+P[2]+P[4]+P[5]+P[6]+P[12]; S4=P[0]+P[1]+P[3]+P[4]+P[5]+P[8]+P[9]+P[13]; S5=P[0]+P[2]+P[3]+P[4]+P[5]+P[7]+P[8]+P[9]+P[14]; // if(S1%2==0) { S1=0; } else if(S1%2!=0) { S1=1; } if(S2%2==0) { S2=0; } else if(S2%2!=0) { S2=1; } if(S3%2==0) { S3=0; } else if(S3%2!=0) { S3=1; } if(S4%2==0) { S4=0; } else if(S4%2!=0) { S4=1; } if(S5%2==0) { S5=0; } else if(S5%2!=0) { S5=1; } cout<<endl<<" : "<<S1<<S2<<S3<<S4<<S5<<endl; int mas_s[5]={S1,S2,S3,S4,S5}; int index_j=0; bool flag_s=false; for(int i=0;i<15;i++) { if((matr_2[0][i]==mas_s[0])&&(matr_2[1][i]==mas_s[1])&&(matr_2[2][i]==mas_s[2])&&(matr_2[3][i]==mas_s[3])&&(matr_2[4][i]==mas_s[4])) { index_j=i; } } cout<<endl<<" : "<<index_j+1<<endl; if(P[index_j]==0) P[index_j]=1; else if(P[index_j]==1) P[index_j]=0; cout<<" : "; for(int i=0; i<P.size();i++) { cout<<P[i]<<' '; } cout<<endl; P.erase(P.begin()+14); P.erase(P.begin()+13); P.erase(P.begin()+12); P.erase(P.begin()+11); P.erase(P.begin()+10); cout<<" : "; for(int i=0; i<P.size();i++) { cout<<P[i]<<' '; } cout<<endl; return 0; }
资料来源:
1. StudFiles-学生的文件存档[电子资源]
studfiles.net/preview/4514583/page:2 /。
2. Zadachnik谈信息论与编码[文字] / V.P. s鼓 -Ed 团结的 1976年,“维斯卡学校”。-276页。
3.特尼尼科夫 信息技术的理论基础 特尼科夫。 -M .:能源(Energy),1971年。-424页。