BCH_RS编码

本文详细介绍了BCH码和RS码的编码、译码过程,包括多项式构造、编码算法、迭代译码算法,并通过C++实现了相关功能。实验结果显示,码长相同、纠错能力增大时误码率降低,纠错能力相同、码长增加时误码率降低。此外,BCH码在BSC信道中表现优于RS码,更适合纠正随机错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、内容

1、BCH码编码
2、BCH码译码
3、RS码编码
4、RS码译码
5、手动测试
6、自动测试

二、功能模块

实现了码长可变、纠错能力可变、BSC信道、BCH译码用快速迭代译码、钱搜索算法寻找错误位置、RS译码用迭代译码、钱搜索算法、福尼算法实现。
1、构造多项式到向量及向量到多项式的对照表
2、生成极小多项式
3、求多项式的次数模块
4、多项式加法
5、向量乘法
6、多项式乘法
7、求BCH码生成多项式
8、求RS码生成多项式
9、BCH码、RS码编码
10、求f(x),代表已知多项式求f(x),x为向量
11、BCH迭代译码、钱搜索算法
12、RS迭代译码、钱搜索算法、福尼算法
13、手动测试
14、自动测试
15、BSC信道

三、结果展示

1 手动测试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2 自动测试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、C++实现

本实验是基于Dev C++环境进行的。由于功能模块的数量太多,在实验报告中展示会显得杂乱繁琐,故只在实验报告中简述C语言编程的实现思想,详见提交的实验源码。
用一个int数组来存储本原多项式表,每个本原多项式用int型数表示;用一个int数组表示多项式,如果是BCH里面存储的是0或1,RS码存储的是多进制数的向量形式;生成两个表格分别为向量到方幂以及方幂到向量表;迭代译码的过程中每一步的结果用一个结构体来存储,所有的迭代步骤就构成了一个结构体数组。BSC信道是用一个与编码发送比特流相同的数组实现的,错误设为1,不错设为0,再与发送比特流进行异或运算得到接收比特流。
1、求极小多项式模块
使用共轭根系法求极小多项式,得到一个数组为对每一个GF(2m)的向量存存储着其共轭根系。
2、多项式乘法模块,输入两个表示多项式的数组,输出相乘后的数组,相乘时每个向量依次相乘在根据次数移位。
3、BCH码生成多项式模块,由输入的t确定出一组向量,在找到每个向量的共轭根系,求各个共轭根系的并集,在依次乘以一次多项式得到生成多项式。
4、编码模块,信息多项式同样用一个数组表示作为输入,生成多项式数组也作为输入,根据v(x)=〖x^r m(x) +(x^r m(x))〗_g(x) 得到编码后的多项式数组。具体就是移位和进行异或运算。
5、译码模块,用迭代译码算法,RS和BCH的译码分别写了一个模块,迭代译码的过程中每一步的结果用一个结构体来存储,所有的迭代步骤就构成了一个结构体数组,同时为了提高效率加入了快速译码、钱搜索算法和福尼算法。
6、BSC信道,BSC信道是用一个与编码发送比特流相同的数组实现的,错误设为1,不错设为0,其中1以信道转移概率出现,再与发送比特流进行异或运算得到接收比特流。

五、结果分析

1 对比相同码长不同纠错能力时的误码率。

可以看出,当相同码长时纠错能力增大,误码率减小,原因是冗余位增加,但码率减小。

在这里插入图片描述

2、对比相同纠错能力不同码长的误码率

可以看出,相同纠错能力下,码长越长冗余位越多,误码率越小。
在这里插入图片描述

3、对比RS码和BCH码的误码率

由于RS码是纠突发错误的纠错码,BCH码纠随机错误,而BSC信道是随错误信道,故RS码的误码率比BCH码高。

在这里插入图片描述

六、完整代码

# include<stdio.h>
# include<vector>
# include<iostream>
# include<cmath>
# include<set> 
# include<numeric>
# include<string>
# include<string.h>
# include<algorithm>
# include<stdlib.h> 
# include<time.h>
# include<fstream>
using namespace std;
const int N=10000;//设计的最长码长 
struct die{
   //迭代过程表 
		int u;
		int deta[N];
		int D;
		int u_d;//u-D
		int du;
	};

vector<int> a_v,v_a;
	
void excel(int n, vector<int> &a_v, vector<int> &v_a){
   
	//int n;//码长
	//vector<int> a_v;//多项式到向量
	//vector<int> v_a;//向量到多项式 
	int m=int(log(double(n+1))/log(2.0));
	int benyuan[26]={
   0};
	//============本原多项式表===============// 
	benyuan[ 2]=1 + (1<<1) + (1<<2);
	benyuan[ 3]=1 + (1<<1) + (1<<3);
	benyuan[ 4]=1 + (1<<1) + (1<<4);
	benyuan[ 5]=1 + (1<<2) + (1<<5);
	benyuan[ 6]=1 + (1<<1) + (1<<6);
	benyuan[ 7]=1 + (1<<3) + (1<<7);
	benyuan[ 8]=1 + (1<<2) + (1<<3) + (1<<4) + (1<<8);
	benyuan[ 9]=1 + (1<<4) + (1<<9);
	benyuan[10]=1 + (1<<3) + (1<<10);
	benyuan[11]=1 + (1<<2) + (1<<11);
	benyuan[12]=1 + (1<<1) + (1<<4) + (1<<4) + (1<<6) + (1<<12);
	benyuan[13]=1 + (1<<1) + (1<<3) + (1<<4) + (1<<13);
	benyuan[14]=1 + (1<<1) + (1<<6) + (1<<10) + (1<<14);
	benyuan[15]=1 + (1<<1) + (1<<15);
	benyuan[16]=1 + (1<<1) + (1<<3) + (1<<12) + (1<<16);
	benyuan[17]=1 + (1<<3) + (1<<17);
	benyuan[18]=1 + (1<<7) + (1<<18);
	benyuan[19]=1 + (1<<1) + (1<<2) + (1<<5) + (1<<19);
	benyuan[20]=1 + (1<<3) + (1<<20);
	benyuan[21]=1 + (1<<2) + (1<<21);
	benyuan[22]=1 + (1<<1) + (1<<22);
	benyuan[23]=1 + (1<<5) + (1<<23);
	benyuan[24]=1 + (1<<1) + (1<<2) + (1<<7) + (1<<24);
	benyuan[25]=1 + (1<<3) + (1<<25);
	//=============打表================// 
	int f=benyuan[m];//本原多项式 
	for(int i=0;i<(1<<m);i++) v_a.push_back(-1); 
	int v=1;
	for(int i=0;i<(1<<m)-1;i++){
   
		a_v.push_back(v);
		v_a[v]=i;
		v=v<<1;
		if(v>=(1<<m)) v=v^f;
	}
}


void min_a(int n,vector<vector<int> > &mina){
   
	//==================极小多项式================// 
	//码长 n=2^m-1
	//vector<vector<int> > mina,极小多项式
	vector<int> temp;
	temp.push_back(0);
	for(int i=0;i<n;i++)  mina.push_back(temp);
	bool hash[1<<20]={
   false};
	int first_no=0;//是否迭代完 
	while(first_no<n){
   
		temp.clear();
		temp.push_back(first_no);
		for(int i=1;;i++){
   
			if((first_no*(1<<i))%n==first_no) break;
			temp.push_back((first_no*(1<<i))%n);
		}
		for(int i=0;i<temp.size();i++){
   
			mina[temp[i]]=temp;
			hash[temp[i]]=true;
		}
		for(int i=0;;i++){
   
			if(!hash[i]){
   
				first_no=i;
				break;
			}
		}
		
	} 
}


int alpha(int* g){
   
	//===============求多项式g的次数===========
	int sum=accumulate(g,g+N,0);
	int n=0;
	int temp;
	while(true){
   
		temp=accumulate(g,g+n+1,0);
		if(temp==sum) break;
		n++;
	}
	return n;
}

int max_two(int a,int b){
   
	//===============求两数最大值================ 
	if(a>b) return a;
	else return b;
}

void sum(int* a,int* b,int* out){
   
	//================码多项式加法=================== 
	//a,b输入码字,存储向量表示 
	//out 输出码字
	fill(out,out+N,0);
	for(int i=0;i<=max_two(alpha(a),alpha(b));i++){
   
		out[i]=a[i]^b[i];
	}
}

int amul(int a,int b,int n){
   
	//=========
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值