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

📄 uwb.c

📁 在高斯白噪声信道中的UWB编码解码程序设计
💻 C
📖 第 1 页 / 共 2 页
字号:
#define NRS 239
#define MRS 255//RS(255,239)
#define RRS 8 //GF(2^8)
#define L 1
//cc
#define NCC 60
#define MCC 180//180个码字截断
#define RCC 3 //码率为1/RCC
#define t 6//编码寄存器个数
#define T_num 2*2*2*2*2*2 //2的t次方个状态
#include<stdio.h>
#include"AWGN.h"  //此头文件产生0均值,方差为1的高斯白噪声function
#include<math.h>
    int alpha[MRS][RRS]={0};
	int ialpha[MRS]={0};
	int g[MRS-NRS][RRS]={0};
void main(){
	FILE *fp;
	FILE *op;
	int i,j,k;
	long idum=1;//产生噪声函数的初始化值
	int p[RRS]={1,0,1,1,1,0,0,0};
    void gen_rs_table(int alpha[][RRS],int ialpha[],int p[]);
    void gen_unwrap(int g[][RRS]);
	void encoder_rs(int org_data_rs[][RRS],int encoded_data_rs[][RRS]);
	void BM(int received_data_rs[][RRS],int decoded_data_rs[][RRS]);
	void encoder_cc(int array1[],int array2[],int n);
	void modem(int encoded_data_cc[],int received_data_cc[]);
    void viterbi(int array1[],int array2[],int n);
	int org_data_rs[NRS][RRS]={0};
	int encoded_data_rs[MRS][RRS]={0};
	int org_data_cc[NCC]={0};
	int encoded_data_cc[MCC]={0};
	int received_data_rs[MRS][RRS]={0};
	int received_data_cc[MCC]={0};
	//float received_sig[MRS][RRS]={0.0};
	float SNR=7.5;
	float BER_cc=0;
	float BER_rs=0;
	int error_cc=0;
	int error_rs=0;
	int decoded_data_cc[NCC]={0};
	int decoded_data_rs[MRS][RRS]={0};
	int error=0;
	gen_rs_table(alpha,ialpha,p);
	gen_unwrap(g);
	op=fopen("randdata","rb");//read random data from file "randdata"//注意要在结尾关闭
	if((fp=fopen("encoded_data","ab"))==NULL){
			printf("cannot open file\n");
		    return;
		}
    for(k=0;k<L;k++){
    for(i=NRS-1;i>=0;i--){
		for(j=RRS-1;j>=0;j--){
		fread(&org_data_rs[i][j],sizeof(i),1,op);
		}
	}
    encoder_rs(org_data_rs,encoded_data_rs);//编码
	for(i=0;i<(MRS*RRS/NCC);i++){
		for(j=0;j<NCC;j++){
			org_data_cc[j]=*(encoded_data_rs+j+i*NCC);
		}
		encoder_cc(org_data_cc,encoded_data_cc,NCC);
		//卷积码码字写入文件
		for(j=0;j<MCC;j++){
			if(fwrite(&encoded_data_cc[j],sizeof(j),1,fp)!=1){
			printf("file write error\n");
			}
		}
		modem(encoded_data_cc,received_data_cc);
		viterbi(received_data_cc,decoded_data_cc,MCC);
		for(j=0;j<NCC;j++){if(decoded_data_cc[j]!=org_data_cc[j]){error_cc++;}}//统计误比特个数
		for(j=0;j<NCC;j++){
	}

	}
	fclose(fp);
	fclose(op);

	/*
	for(i=0;i<MRS;i++){
		for(j=0;j<RRS;j++){
			if(encoded_data_rs[i][j]==0)encoded_data_rs[i][j]=-1;//BPSK调制
			received_sig[i][j]=encoded_data_rs[i][j]+sqrt(1/SNR)*gasdev(&idum);}//加噪声
	}
    for(i=0;i<MRS;i++){
		for(j=0;j<RRS;j++){
			if(received_sig[i][j]>0)received_data_rs[i][j]=1;//解调
			else received_data_rs[i][j]=0;
		}
	}
	
	BM(received_data_rs,decoded_data_rs);//BM译码
	for(i=0;i<NRS;i++){
		for(j=0;j<RRS;j++){
			if(decoded_data_rs[i][j]!=org_data_rs[i][j])error++;
		}
	}
	}
	BER=(float)error/(float)(NRS*RRS*L);
	printf("error=%d,BER=%e\n",error,BER);
	*/
}
//*********************************************************************************************************
void encoder_rs(int org_data_rs[][RRS],int encoded_data_rs[][RRS]){
	void product_GF(int a[],int b[],int c[]);
	int i,j,k;
	int r[MRS-NRS][RRS]={0};//除法所得余式,即校验位
	int temp[MRS-NRS+1][RRS]={0};
	for(i=MRS-1;i>MRS-NRS-1;i--){//system coding
		for(j=0;j<RRS;j++){encoded_data_rs[i][j]=org_data_rs[i-(MRS-NRS)][j];//信息位
		                 temp[MRS-NRS][j]=org_data_rs[i-MRS+NRS][j]^r[MRS-NRS-1][j];//反馈字
		}
		for(j=0;j<MRS-NRS;j++){product_GF(g[j],temp[MRS-NRS],temp[j]);}//反馈字与生成多项式
		for(j=MRS-NRS-1;j>0;j--){
			for(k=0;k<RRS;k++){r[j][k]=r[j-1][k]^temp[j][k];}//更新余式
		}
		for(j=0;j<RRS;j++){r[0][j]=temp[0][j];}
	}
	for(i=MRS-NRS-1;i>=0;i--){
		for(k=0;k<RRS;k++){encoded_data_rs[i][k]=r[i][k];}//校验位
	}
}
//***********************************************************************************************************
void product_GF(int a[],int b[],int c[]){//galois field 乘法
	int i,j,k;
	int dec_a=0;
	int dec_b=0;
	for(i=0;i<RRS;i++){dec_a=dec_a+a[i]*pow(2,i);}
	for(i=0;i<RRS;i++){dec_b=dec_b+b[i]*pow(2,i);}
	if(dec_a==0||dec_b==0){
		for(i=0;i<RRS;i++){c[i]=0;}
	}
	else{
		i=ialpha[dec_a-1];
		j=ialpha[dec_b-1];
		for(k=0;k<RRS;k++){
			c[k]=alpha[(i+j)%MRS][k];
		}
	}
}
//***********************************************************************************************************
void add_GF(int a[],int b[],int c[]){//加法器
	int i;
	for(i=0;i<RRS;i++){c[i]=a[i]^b[i];}
}
//***********************************************************************************************************
void gen_rs_table(int alpha[][RRS],int ialpha[],int p[]){//生成正反码表,p为本原多项式
	int i,j,k;
	for(i=RRS-1;i>0;i--){alpha[0][i]=0;}
	alpha[0][0]=1;
	for(i=1;i<MRS;i++){
		for(j=1;j<RRS;j++){
		    alpha[i][j]=alpha[i-1][j-1];
		}
		for(j=0;j<RRS;j++){
			alpha[i][j]=alpha[i][j]^((alpha[i-1][RRS-1]>0)*p[j]);
		}
		k=0;
		for(j=0;j<RRS;j++){
	        k=k+alpha[i][j]*pow(2,j);
		}
		ialpha[k-1]=i;
	}
}
//************************************************************************************************************
void gen_unwrap(int g[][RRS]){
	void product_GF(int a[],int b[],int c[]);
        void add_GF(int a[],int b[],int c[]);
	int i,j,k;
	int temp[MRS-NRS][RRS]={0};
	int reg[MRS-NRS][RRS]={0};
	g[0][1]=1;
	g[1][0]=1;
	for(i=2;i<(MRS-NRS+1);i++){
		for(j=0;j<(MRS-NRS);j++){
			product_GF(alpha[i],g[j],temp[j]);
		}
		for(j=0;j<(MRS-NRS-1);j++){
			for(k=0;k<RRS;k++){
				reg[j+1][k]=g[j][k];
			}
		}
		for(j=0;j<(MRS-NRS);j++){
			add_GF(reg[j],temp[j],g[j]);
		}
	}
}
//************************************************************************************************************
void BM(int received_data_rs[][RRS],int decoded_data_rs[][RRS]){//
	void product_GF(int a[],int b[],int c[]);
    void add_GF(int a[],int b[],int c[]);
	int i,j,k,x,y,z,max,m,n,ii,gamma;
	int s[MRS-NRS+1][RRS]={{1,0,0,0,0,0,0,0}};//校正子s0=1;
	int temp[MRS][RRS]={0};
	int sigma[MRS-NRS+2][(MRS-NRS)/2+1][RRS]={0};//错误多项式
	int T_sigma[(MRS-NRS)/2+1][RRS]={0};
	int D[MRS-NRS+2]={0};//sigma[i]的阶
	int H[MRS-NRS+2]={0};//j-D[j]
	int d[MRS-NRS+2][RRS]={{1,0,0,0,0,0,0,0}};//迭代反馈变量
	int td[RRS]={0};//一般寄存器
	int beta[RRS]={0};//错误值Y=beta/theta
	int theta[RRS]={0};
	int dj_1,dx,di;
	int err_p[(MRS-NRS)/2]={0};//错误位置
	int Y[(MRS-NRS)/2][RRS]={0};

	//gen(alpha,ialpha,p);//
	
	//计算校正子
	ii=0;
    for(i=1;i<MRS-NRS+1;i++){
		for(j=0;j<MRS;j++){product_GF(received_data_rs[j],alpha[(i*j)%MRS],temp[j]);}//s=r(alpha^i)
		for(j=0;j<MRS;j++){
			for(k=0;k<RRS;k++){s[i][k]=s[i][k]^temp[j][k];
			}
		}
	}
	ii=0;
	for(i=1;i<MRS-NRS+1;i++){
		for(j=0;j<RRS;j++){
			if(s[i][j]>0){ii=1;break;}
		}
		if(ii==1)break;
	}
	
    if(ii==0){//校正子为0,无错,直接输出信息位
		for(i=0;i<NRS;i++){
			for(j=0;j<RRS;j++){decoded_data_rs[i][j]=received_data_rs[i+MRS-NRS][j];}
		}
	}
 else{//校正子不为0,进行BM迭代译码

⌨️ 快捷键说明

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