⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xunhuanma.cpp

📁 循环码的编码和译码算法。有两种编码器:K级和n-K级。配有译法算法。输入生成多项式或校验多项式
💻 CPP
字号:
//****************************************************************
//该程序实现循环码的两种编码方式,K级和N-K级编码器的仿真程序
//同时实现能纠正一位错误的循环码的译码;
//****************************************************************
//通信与信息系统专业    詹锐鑫   07212439	2008年1月24日
//****************************************************************

#include <iostream.h>

const int n=7,k=4,r=n-k;				//循环码的n,k值
										//可以改变这两个值,实现对不同的循环码进行仿真;

void encodeh(int m[],int h[],int c[]);
void encodeg(int m[],int g[],int c[]);
void decode_1err(int r[],int g[],int c[]); 
void main()
{
	int g[r+1]={1,0,1,1};			//循环码的生成多项式,高次方在左边位元上;
	int h[k+1]={1,0,1,1,1};			//循环码的校验多项式,高次方在左边位元上;

	int m[k]={1,0,0,1};				//循环码的编码器输入;
	int c[n]={0};					//编码器的输出;
	int i=0;
	
	cout<<"(n,k)="<<n<<' '<<k<<endl;
	cout<<"g:";
	for(i=0;i<=n-k;i++)
		cout<<g[i];
	cout<<endl;
	cout<<"h:";
	for(i=0;i<=k;i++)
		cout<<h[i];
	cout<<endl;

	encodeh(m,h,c);
	for(i=0;i<=n-1;i++)
		cout<<c[i];
	cout<<" (k级编码器结果)"<<endl;		//K级编码器的输出结果;
	int c1[n]={0};
	encodeg(m,g,c1);
	for(i=0;i<=n-1;i++)
		cout<<c1[i];
	cout<<" (n-k级编码器结果)"<<endl;	//n-k级编码器的输出结果;

	int r[n]={1,0,0,1,1,1,1};			//译码器的输入;
										//可以随机的发生一位传输错误,即改变一位正确的编码码字;
	int c2[n]={0};						//译码器的输出;
	decode_1err(r,g,c2);
	for(i=0;i<=n-1;i++)
		cout<<r[i];
	cout<<" (解码输入)"<<endl;
	
	for(i=0;i<=n-1;i++)
		cout<<c2[i];
	cout<<" (解码输出)"<<endl;
	return;
}

void encodeh(int m[],int h[],int c[])
{
	int w[k]={0};
	
	for(int i=0;i<=k-1;i++)
	{
		w[i]=m[k-1-i];
		c[i]=m[i];
	}

	for(i=0;i<=n-k-1;i++)
	{
		int s=0;
		for(int j=0;j<=k-1;j++)
		{
			s=s+w[k-1-j]*(h[k-j]);
		}
		s=s%2;
		c[k+i]=s;
		for(int l=k-1;l>=1;l--)
		{
			w[l]=w[l-1];
		}
		w[0]=s;
	}

}

void encodeg(int m[],int g[],int c[])
{
	int w[r+1]={0};				//registers clear to 0;
	int i=0;
	int m_temp=0;
	for(i=0;i<=k-1;i++)
	{
		c[i]=m[i];
		m_temp=(w[n-k-1]+m[i])%2;
		for(int j=0;j<=n-k-1;j++)
		{
			if(j==n-k-1)
			{
				w[0]=m_temp;
			}
			else{
			w[n-k-1-j]=(m_temp*g[1+j]+w[n-k-1-j-1])%2;						
			}
		}
	}
	
   	for(i=0;i<=n-k-1;i++)
	{
		c[k+i]=w[n-k-1-i];		
	}
}


void decode_1err(int r[],int g[],int c[])
{
	int m[k]={0};
	m[0]=1;
	int c1[n]={0};
	encodeg(m,g,c1);

	int s[n-k]={0};
	for(int index=0;index<n-k;index++)
		s[index]=c1[k+index];
	
	int w[n-k]={0};
	int w_temp=w[0];

	for(int i=0;i<=n-1;i++)
	{
		w_temp=w[0];
		for(index=0;index<=n-k-2;index++)
		{
			w[index]=(w_temp*g[index+1]+w[index+1])%2;
		}
		w[n-k-1]=(w_temp*g[n-k]+r[i])%2;
	}
/*
	for(index=0;index<=n-k-1;index++)
	cout<<s[index];
	cout<<endl;
	for(index=0;index<n-k;index++)
		cout<<w[index];
	cout<<endl;
*/
//***********************************
	
	bool e=1;
	for(index=0;index<=n-k-1;index++)
	{
		e=(w[index]==0)&&e;
	}
	if(e==1)
	{
		for(index=0;index<n;index++)
		{
			c[index]=r[index];
		}
		return;
	}
//***************************************
	e=1;
	int shift=0;
	for(index=0;index<=n-k-1;index++)
	{
		e=(w[index]==s[index])&e;
	}

	while(e==0)
	{
		w_temp=w[0];
		for(index=0;index<=n-k-2;index++)
		{
			w[index]=(w_temp*g[index+1]+w[index+1])%2;
		}
		w[n-k-1]=(w_temp*g[n-k]+e)%2;

		e=1;
		for(index=0;index<=n-k-1;index++)
		{
			e=(w[index]==s[index])&e;
		}
		shift++;
	}
	w_temp=w[0];
		for(index=0;index<=n-k-2;index++)
		{
			w[index]=(w_temp*g[index+1]+w[index+1])%2;
		}
		w[n-k-1]=(w_temp*g[n-k]+e)%2;

		e=1;
		for(index=0;index<=n-k-1;index++)
		{
			e=(w[index]==s[index])&e;
		}

	for(index=0;index<n;index++)
	{
		c[index]=(r[index]+(index==shift))%2;
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -