📄 harq.cpp
字号:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#define RAND_MAX 32767
#include "stdafx.h"
#pragma comment(lib,"crc2.lib")
#pragma comment(lib,"crc1.lib")
#pragma comment(lib,"dongtai_punc1.lib")
#pragma comment(lib,"punctured.lib")
#pragma comment(lib,"xiugaihou8.lib")
//#pragma comment(lib,"punc.lib") //保留被穿孔矩阵穿掉的信息
extern "C" __declspec(dllexport) void crcencoder(int *str,int n,int *str2);
//extern "C" __declspec(dllexport) void crcdecoder(int *str1,int n,int *str5);//crc译码器无反馈信息
extern "C" __declspec(dllexport) int crcdecoder(int *str1,int n,int *str5);
extern "C" __declspec(dllexport) void conv_encoder(int kk,int *g[2],int mesg_length,int *input_mesg,int *output_mesg);
extern "C" __declspec(dllexport) int *deci2bin(int d,int size,int* b);
extern "C" __declspec(dllexport) int bin2deci(int* b,int size);
extern "C" __declspec(dllexport) int nxt_stat(int K,int current_state,int input,int* memory_contents);
extern "C" __declspec(dllexport) float soft_metric(float data,int guess);
extern "C" __declspec(dllexport) void cov_decode(int K,int *g[2],int channel_length,float* channel_output_vector,int* decoder_output_matrix);
extern "C" __declspec(dllexport) float gauss_noise(float sigma);
extern "C" __declspec(dllexport) void add_noise(int* ch_data,float* re_ch_data,float es_n0,int channel_len);
extern "C" __declspec(dllexport) void gen_poly(int kk,int *g[2]);
extern "C" __declspec(dllexport) int bit_err(int* data,int* re_data,int data_len);
extern "C" __declspec(dllexport) int rnd();
extern "C" __declspec(dllexport) void load();
extern "C" __declspec(dllexport) void punctured_table(int MM);
extern "C" __declspec(dllexport) void punctured(int p,int length,int m,int punc[2][5],int *input,int *rcpc_output);
extern "C" __declspec(dllexport) void depunc(int p,int length,int m,int punc[2][5],float *input, float *output);
//variables for selective and arq
int re_num[5]; //retransmitsion number
int done[5]; //retransmit or not
int temp=0; //error number for crcdecoder
time_t Tbegin,Tend,T;
float Per,Throughoutput;
int num_of_packet=0;
int right_packet_num=0;
int packet_err_num=0;
int RENUM;
void trans(int num_of_err1,int n,int counter1,int temp[5],int *data[5])
{
int i,j;
if(counter1!=0)
{
for(i=0;i<num_of_err1;i++)
{
for(j=0;j<n+2;j++)
{
data[i][j]=data[temp[i]][j];
}
done[i]=done[temp[i]];
re_num[i]=re_num[temp[i]];
}
for(i=num_of_err1;i<5;i++)
{
for(j=0;j<n;j++)
{
data[i][j]=rnd();
}
data[i][n]=counter1*5+i;
data[i][n+1]=0;
done[i]=0; //0进行穿孔
re_num[i]=1;
num_of_packet++;
}
}
}
//int check_err(int *input[5],int *output[5],int n,int errnum,int temp[5])
int check_err(int *input[5],int *output[5],int n)
{
int i,j;
int ii=0;
int iii=0;
int sum=0;
int errnum=0;
for(i=0;i<5;i++)
{
ii=0;
for(j=0;j<n;j++)
{
if(input[i][j]!=output[i][j])
{
ii++;
}
}
if(ii!=0)
{
if(input[i][n+1]<=RENUM)
{
errnum++; //计算每一次错误数据包的数目
}
}
}
return errnum;
}
int check_err1(int *input[5],int *output[5],int n,int temp[5])
{
int i,j;
int ii=0;
int iii=0;
int sum=0;
for(i=0;i<5;i++)
{
ii=0;
for(j=0;j<n;j++)
{
if(input[i][j]!=output[i][j])
{
ii++;
}
}
if(ii!=0)
{
input[i][n+1]++;
if(input[i][n+1]<=RENUM)
{
done[i]=0; //0 进行穿孔
re_num[i]++; //降低码率
if(re_num[i]==5)
done[i]=1; //始终以1/2码率传输
temp[iii]=i;
iii++;
}
else
{
sum=sum+ii;
}
}
else
{
//done[i]=0;
right_packet_num++;
if(re_num[i]==1)
re_num[i]=1;
else
re_num[i]--;//提高码率
}
}
return sum;
}
void harddecision(float *input,int n,int *output)
{
int i;
for(i=0;i<n;i++)
{
if(input[i]>0)
output[i]=1;
else
output[i]=0;
}
}
/*int main(int argc, char* argv[])
{
int i,j;
float err_bit_ratio;
int n;
int K;
int counter=0;
int temp2[5];
int crc_err_or_not[5];
int biaozhi=0;
int punc0[2][5],punc1[2][5],punc2[2][5],punc3[2][5];
int channel_len;
int *data[5],*crc_output[5],*deconv_output[5];
int *conv_output[5],*decrc_output[5];
int *punc_output[5];
float *add_noise0[5];
float *depunc_output[5];
float *channel_output[5];
int *g[2];
int mm=0;
float es_n0,eb_n0,begin,end,step;
begin=0.0;
end=8.5;
step=0.5;
int err_num;
printf("please input the message length to n:\n");
scanf("%d",&n);
printf("please input the con_len to K:\n");
scanf("%d",&K);
printf("please input the number of retransmission:\n");
scanf("%d",&RENUM);
int k=n-16;
channel_len=(n+16+K-1)*2;
g[0]=(int *)malloc(sizeof(int)*K);
g[1]=(int *)malloc(sizeof(int)*K);
for(i=0;i<5;i++)
{
data[i]=(int *)malloc(sizeof(int)*(n+2));
crc_output[i]=(int *)malloc(sizeof(int)*(n+16));
deconv_output[i]=(int *)malloc(sizeof(int)*(n+16));
conv_output[i]=(int *)malloc(sizeof(int)*channel_len);
punc_output[i]=(int *)malloc(sizeof(int)*channel_len);
add_noise0[i]=(float *)malloc(sizeof(float)*channel_len);
depunc_output[i]=(float *)malloc(sizeof(float)*channel_len);
channel_output[i]=(float *)malloc(sizeof(float)*channel_len);
decrc_output[i]=(int *)malloc(sizeof(int)*(n+2));
}
load();
punctured_table(K-1);
printf("\n");
printf("请根据提示选择相应的穿孔矩阵:\n");
printf("请输入速率为5/9的穿孔矩阵punc0[2][5]\n");
for(i=0;i<2;i++)
{
for(j=0;j<5;j++)
{
scanf("%d",&punc0[i][j]);
}
}
printf("请输入速率为5/8的穿孔矩阵punc1[2][5]\n");
for(i=0;i<2;i++)
{
for(j=0;j<5;j++)
{
scanf("%d",&punc1[i][j]);
}
}
printf("请输入速率为5/7的穿孔矩阵punc2[2][5]\n");
for(i=0;i<2;i++)
{
for(j=0;j<5;j++)
{
scanf("%d",&punc2[i][j]);
}
}
printf("请输入速率为5/6的穿孔矩阵punc3[2][5]\n");
for(i=0;i<2;i++)
{
for(j=0;j<5;j++)
{
scanf("%d",&punc3[i][j]);
}
}
printf("信噪比 错误比特数 传输桢数 误比特率 误帧率 吞吐量\n");
for(eb_n0=begin;eb_n0<=end;eb_n0+=step)
{
//initialization
Tbegin=time(NULL);
num_of_packet=5;
err_bit_ratio=0.0;
err_num=0;
right_packet_num=0;
packet_err_num=0;
Per=0.0;
Throughoutput=0.0;
for(i=0;i<5;i++)
{
for(j=0;j<n;j++)
data[i][j]=rnd();
data[i][n]=counter*5+i;
data[i][n+1]=0;
}
for(i=0;i<5;i++)
{
done[i]=0;
re_num[i]=1;
}
do
{
es_n0=eb_n0+(float)(10*log10((double)k/channel_len));
gen_poly(K,g);
trans(packet_err_num,n,counter,temp2,data);
for(i=0;i<5;i++)
{
crcencoder(data[i],n,crc_output[i]);
conv_encoder(K,g,n+16,crc_output[i],conv_output[i]);
//arq progress
if(done[i]==0)
{
switch(re_num[i])
{
case 1: punctured(5,channel_len,K-1,punc3,conv_output[i],punc_output[i]);
break;
case 2: punctured(5,channel_len,K-1,punc2,conv_output[i],punc_output[i]);
break;
case 3: punctured(5,channel_len,K-1,punc1,conv_output[i],punc_output[i]);
break;
case 4: punctured(5,channel_len,K-1,punc0,conv_output[i],punc_output[i]);
break;
}
}
if(done[i]==1)
add_noise(conv_output[i],channel_output[i],es_n0,channel_len);
else if (done[i]==0)
add_noise(punc_output[i],add_noise0[i],es_n0,channel_len);
if(done[i]==0)
{
switch(re_num[i])
{
case 1: depunc(5,channel_len,K-1,punc3,add_noise0[i],depunc_output[i]);
break;
case 2: depunc(5,channel_len,K-1,punc2,add_noise0[i],depunc_output[i]);
break;
case 3: depunc(5,channel_len,K-1,punc1,add_noise0[i],depunc_output[i]);
break;
case 4: depunc(5,channel_len,K-1,punc0,add_noise0[i],depunc_output[i]);
break;
}
}
if(done[i]==1)
cov_decode(K,g,channel_len,channel_output[i],deconv_output[i]);
else if(done[i]==0)
cov_decode(K,g,channel_len,depunc_output[i],deconv_output[i]);
crc_err_or_not[i]=crcdecoder(deconv_output[i],n,decrc_output[i]);
//if(crc_err_or_not[i]==1)
//right_packet_num++;
}
temp=check_err1(data,decrc_output,n,temp2);
packet_err_num=check_err(data,decrc_output,n);
counter++;
err_num+=temp;
//err_bit_ratio=(float)err_num/(num_of_packet*n);
}while(err_num<1000);
err_bit_ratio=(float)err_num/(num_of_packet*n);
Tend=time(NULL);
T=Tend-Tbegin;
Per=1-(float)right_packet_num/num_of_packet;
Throughoutput=(1-Per)*n*num_of_packet/T;
printf("%.6f %d %d %f %f %f\n",eb_n0,err_num,num_of_packet,err_bit_ratio,Per,Throughoutput);
}
free(g[0]);
free(g[1]);
for(i=0;i<5;i++)
{
free(data[i]);
free(crc_output[i]);
free(conv_output[i]);
free(channel_output[i]);
free(deconv_output[i]);
free(decrc_output[i]);
}
return 0;
}*/
int main(int argc, char* argv[])
{
int i,j;
float err_bit_ratio;
int n;
int K;
int counter=0;
int temp2[5];
int crc_err_or_not[5];
int biaozhi=0;
int punc0[2][5],punc1[2][5],punc2[2][5],punc3[2][5];
int channel_len;
int *data[5],*crc_output[5],*deconv_output[5];
int *conv_output[5],*decrc_output[5];
int *punc_output[5];
float *add_noise0[5];
float *depunc_output[5];
float *channel_output[5];
int *g[2];
int mm=0;
float es_n0,eb_n0,begin,end,step;
begin=0.0;
end=12.5;
step=0.5;
int err_num;
printf("please input the message length to n:\n");
scanf("%d",&n);
printf("please input the con_len to K:\n");
scanf("%d",&K);
printf("please input the number of retransmission:\n");
scanf("%d",&RENUM);
//int k=n-16;
channel_len=(n+16+K-1)*2;
g[0]=(int *)malloc(sizeof(int)*K);
g[1]=(int *)malloc(sizeof(int)*K);
for(i=0;i<5;i++)
{
data[i]=(int *)malloc(sizeof(int)*(n+2));
crc_output[i]=(int *)malloc(sizeof(int)*(n+16));
deconv_output[i]=(int *)malloc(sizeof(int)*(n+16));
conv_output[i]=(int *)malloc(sizeof(int)*channel_len);
punc_output[i]=(int *)malloc(sizeof(int)*channel_len);
add_noise0[i]=(float *)malloc(sizeof(float)*channel_len);
depunc_output[i]=(float *)malloc(sizeof(float)*channel_len);
channel_output[i]=(float *)malloc(sizeof(float)*channel_len);
decrc_output[i]=(int *)malloc(sizeof(int)*(n+2));
}
load();
punctured_table(K-1);
printf("\n");
printf("请根据提示选择相应的穿孔矩阵:\n");
printf("请输入速率为5/9的穿孔矩阵punc0[2][5]\n");
for(i=0;i<2;i++)
{
for(j=0;j<5;j++)
{
scanf("%d",&punc0[i][j]);
}
}
printf("请输入速率为5/8的穿孔矩阵punc1[2][5]\n");
for(i=0;i<2;i++)
{
for(j=0;j<5;j++)
{
scanf("%d",&punc1[i][j]);
}
}
printf("请输入速率为5/7的穿孔矩阵punc2[2][5]\n");
for(i=0;i<2;i++)
{
for(j=0;j<5;j++)
{
scanf("%d",&punc2[i][j]);
}
}
printf("请输入速率为5/6的穿孔矩阵punc3[2][5]\n");
for(i=0;i<2;i++)
{
for(j=0;j<5;j++)
{
scanf("%d",&punc3[i][j]);
}
}
printf("信噪比 错误比特数 传输桢数 误比特率 误帧率 吞吐量\n");
for(eb_n0=begin;eb_n0<=end;eb_n0+=step)
{
//initialization
Tbegin=time(NULL);
num_of_packet=5;
err_bit_ratio=0.0;
err_num=0;
right_packet_num=0;
packet_err_num=0;
Per=0.0;
Throughoutput=0.0;
for(i=0;i<5;i++)
{
for(j=0;j<n;j++)
data[i][j]=rnd();
data[i][n]=counter*5+i;
data[i][n+1]=0;
}
for(i=0;i<5;i++)
{
done[i]=0;
re_num[i]=1;
crc_err_or_not[i]=1;
}
do
{
es_n0=eb_n0+(float)(10*log10((double)n/channel_len));
gen_poly(K,g);
trans(packet_err_num,n,counter,temp2,data);
for(i=0;i<5;i++)
{
crcencoder(data[i],n,crc_output[i]);
if(i>=packet_err_num)
{
add_noise(crc_output[i],channel_output[i],es_n0,n+16);
harddecision(channel_output[i],n+16,deconv_output[i]);
}
else
{
conv_encoder(K,g,n+16,crc_output[i],conv_output[i]);
//arq progress
if(done[i]==0)
{
switch(re_num[i])
{
case 1: punctured(5,channel_len,K-1,punc3,conv_output[i],punc_output[i]);
break;
case 2: punctured(5,channel_len,K-1,punc2,conv_output[i],punc_output[i]);
break;
case 3: punctured(5,channel_len,K-1,punc1,conv_output[i],punc_output[i]);
break;
case 4: punctured(5,channel_len,K-1,punc0,conv_output[i],punc_output[i]);
break;
}
}
if(done[i]==1)
add_noise(conv_output[i],channel_output[i],es_n0,channel_len);
else if (done[i]==0)
add_noise(punc_output[i],add_noise0[i],es_n0,channel_len);
if(done[i]==0)
{
switch(re_num[i])
{
case 1: depunc(5,channel_len,K-1,punc3,add_noise0[i],depunc_output[i]);
break;
case 2: depunc(5,channel_len,K-1,punc2,add_noise0[i],depunc_output[i]);
break;
case 3: depunc(5,channel_len,K-1,punc1,add_noise0[i],depunc_output[i]);
break;
case 4: depunc(5,channel_len,K-1,punc0,add_noise0[i],depunc_output[i]);
break;
}
}
if(done[i]==1)
cov_decode(K,g,channel_len,channel_output[i],deconv_output[i]);
else if(done[i]==0)
cov_decode(K,g,channel_len,depunc_output[i],deconv_output[i]);
}
crc_err_or_not[i]=crcdecoder(deconv_output[i],n,decrc_output[i]);
//if(crc_err_or_not[i]==1)
//right_packet_num++;
}
temp=check_err1(data,decrc_output,n,temp2);
packet_err_num=check_err(data,decrc_output,n);
counter++;
err_num+=temp;
//err_bit_ratio=(float)err_num/(num_of_packet*n);
}while(err_num<100);
err_bit_ratio=(float)err_num/(num_of_packet*n);
Tend=time(NULL);
T=Tend-Tbegin;
Per=1-(float)right_packet_num/num_of_packet;
Throughoutput=(1-Per)*n*num_of_packet/T;
printf("%.6f %d %d %f %f %f\n",eb_n0,err_num,num_of_packet,err_bit_ratio,Per,Throughoutput);
}
free(g[0]);
free(g[1]);
for(i=0;i<5;i++)
{
free(data[i]);
free(crc_output[i]);
free(conv_output[i]);
free(channel_output[i]);
free(deconv_output[i]);
free(decrc_output[i]);
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -