📄 uwb.c
字号:
#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 + -