xiugai_selective_platform.cpp
来自「主要是针对现在的合作通信中」· C++ 代码 · 共 457 行
CPP
457 行
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define RAND_MAX 32767
#include "stdafx.h"
#pragma comment(lib,"crc.lib")
#pragma comment(lib,"dongtai_punc1.lib")
#pragma comment(lib,"punctured.lib")
#pragma comment(lib,"xiugaihou8.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);
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; //retransmitsion number
int done; //retransmit or not
int temp=0; //error number for crcdecoder
int selective(int temp)
{
int bk=0;
int vc;
vc=0;
if (temp!=0)
{
//check if the snydrome is '0'
done=0; //retransmission requested if the snydrome is not '0'
re_num++; //increment the order of a frame for parity bits
vc=vc+1; //count the number of frames transmitted
if(re_num==5)
{
re_num=1; //back to source information after the parent code rate is used
// break;
return 1;
}
}
else if(temp==0)
bk=bk+1; //check 16 bits in the snydrome
//the number of retransmission is limited to 5
if(bk==16||vc>4)
done=1; //do not request retransmission if the snydrome is zero
if(vc>4)
vc=4;
return 0;
}
int rnd()
{
double temp;
temp=1.0/(RAND_MAX+1)*(rand()+0.5);
if(temp<0.5)
return 0;
else
return 1;
}
/*int transmission(int num_of_err,int sum_of_err,int temp[5],int counter)
{
//printf("!!!!!!!!!! %d %d !!!!!!!!!!!!\n",num_of_err,sum_of_err);
int i,j,ii;
int iii;
if(counter==0)
{
for(i=0;i<5;i++)
{
trans_buffer[i].number=packet[i].number;
for(j=0;j<384;j++)
{
trans_buffer[i].data[j]=packet[i].data[j];
}
}
//counter++;
//printf("本次传输为第%d次\n",counter+1);
return 5*(counter+1);
}
else
{
if(num_of_err==0)
{
jishuqi++;
iii=0;
// printf("为发送端重新分配新数据包!\n");
for(i=0;i<5;i++)
{
trans_buffer[i].number=packet[jishuqi*5+iii].number;
trans_buffer[i].retrans_num=0;
iii++;
for(j=0;j<384;j++)
{
trans_buffer[i].data[j]=packet[jishuqi*5+iii].data[j];
}
}
return (jishuqi+1)*5;
}
else
{
for(i=0;i<num_of_err;i++)
{
//printf("该次将错误数据包编号为%d的那个数据包重传\n",temp[i]);
trans_buffer[i].number=packet[temp[i]].number;
for(j=0;j<384;j++)
{
trans_buffer[i].data[j]=packet[temp[i]].data[j];
}
}
ii=0;
for(i=num_of_err;i<5;i++)
{
trans_buffer[i].number=packet[5*counter-sum_of_err+num_of_err+ii].number;
while(5*counter-sum_of_err+num_of_err+ii>19)
break;
for(j=0;j<384;j++)
{
trans_buffer[i].data[j]=packet[5*counter-sum_of_err+num_of_err+ii].data[j];
}
ii++;
}
//counter++;
//printf("本次传输为第%d次\n",counter+1);
return (5*(counter+1)-sum_of_err-1-4+num_of_err+ii);
}
}
//printf("%d \n",counter);
}*/
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+1;j++)
{
data[i][j]=data[temp[i]][j];
}
data[i][n+1]=data[temp[i]][n+1];
}
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;
}
}
}
int check_err(int *input[5],int *output[5],int n,int errnum,int temp[5])
{
int i,j;
int ii=0;
int iii=0;
for(i=0;i<5;i++)
{
done=1;
for(j=0;j<n;j++)
{
if(input[i][j]!=output[i][j])
{
ii++;
}
}
if(ii!=0)
{
done=0;
input[i][n+1]++;
re_num=input[i][n+1];
if(input[i][n+1]<=5)
{
errnum++;
temp[iii]=i;
iii++;
}
}
}
return ii;
}
/*int sele_retrans(int *input[5],int *output[5],int temp[5])
{
int i,j;
int ii=0;
int bit_err_num;
int num=0;
int packet_err_num=0;
for(i=0;i<5;i++)
{
bit_err_num=0;
for(j=0;j<384;j++)
{
if(input[i][j]!=output[i]a[j])
{
bit_err_num++;
}
}
if(bit_err_num!=0)
{
packet_err_num++;
temp[num]=i;
num++;
}
else
{
output[ii].number=i;
for(j=0;j<384;j++)
output[ii].data[j]=input[i][j];
}
}
return packet_err_num;
}*/
/*void main()
{
int i,j;
int *input[5],*output[5];
int temp[5];
int packet_err_num;
for(i=0;i<5;i++)
{
input[i]=(int *)malloc(sizeof(int)*384);
output[i]=(int *)malloc(sizeof(int)*384);
}
for(i=0;i<5;i++)
{
for(j=0;j<384;j++)
{
//input[i][j]=output[i][j]=rnd();
input[i][j]=rnd();
}
}
for(i=0;i<5;i++)
{
for(j=0;j<384;j++)
{
output[i][j]=RAND_MAX;
}
}
packet_err_num=sele_retrans(input,output,temp);
printf("%d\n",packet_err_num);
for(i=0;i<packet_err_num;i++)
printf("%d ",temp[i]);
printf("\n");
}*/
int main(int argc, char* argv[])
{
int i,j;
float err_bit_ratio;
int n;
int K;
int counter=0;
int temp2[5];
int packet_err_num=0;
int packet_num=0,right_packet_num=0;
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;
int num_of_packet;
printf("please input the message length to n:\n");
scanf("%d",&n);
printf("please input the con_len to K:\n");
scanf("%d",&K);
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]);
}
}
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;
}
printf("信噪比 错误比特数 传输桢数 误比特率 误帧率 吞吐量\n");
for(eb_n0=begin;eb_n0<=end;eb_n0+=step)
{
//initialization
num_of_packet=1;
err_bit_ratio=0.0;
re_num=0;
err_num=0;
right_packet_num=0;
packet_num=0;
packet_err_num=0;
do
{
right_packet_num+=5;
packet_num++;
es_n0=eb_n0+(float)(10*log10((double)k/channel_len));
done=1;
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
while(!done)
{
packet_num+=5;
switch(re_num)
{
case 1: punctured(6,channel_len,K-1,punc0,conv_output[i],punc_output[i]);
break;
case 2: punctured(6,channel_len,K-1,punc1,conv_output[i],punc_output[i]);
break;
case 3: punctured(6,channel_len,K-1,punc2,conv_output[i],punc_output[i]);
break;
case 4: punctured(6,channel_len,K-1,punc3,conv_output[i],punc_output[i]);
break;
}
}
if(done==1)
add_noise(conv_output[i],channel_output[i],es_n0,channel_len);
else if (done==0)
add_noise(punc_output[i],add_noise0[i],es_n0,channel_len);
while(!done)
{
switch(re_num)
{
case 1: depunc(5,channel_len,K-1,punc0,add_noise0[i],depunc_output[i]);
break;
case 2: depunc(5,channel_len,K-1,punc1,add_noise0[i],depunc_output[i]);
break;
case 3: depunc(5,channel_len,K-1,punc2,add_noise0[i],depunc_output[i]);
break;
case 4: depunc(5,channel_len,K-1,punc3,add_noise0[i],depunc_output[i]);
break;
}
}
if(done==1)
cov_decode(K,g,channel_len,channel_output[i],deconv_output[i]);
else if(done==0)
cov_decode(K,g,channel_len,depunc_output[i],deconv_output[i]);
crcdecoder(deconv_output[i],n,decrc_output[i]);
decrc_output[i][n]=data[i][n];
decrc_output[i][n+1]=data[i][n+1];
}
temp=check_err(data,decrc_output,n,packet_err_num,temp2);
counter++;
//temp=bit_err(data[i],decrc_output[i],n);
err_num+=temp;
err_bit_ratio=(float)err_num/(num_of_packet*n);
num_of_packet+=5;
//biaozhi=selective(temp);
right_packet_num-=packet_err_num;
}while(err_num<1000);
printf("%.6f %d %d %f %f %f\n",eb_n0,err_num,num_of_packet,err_bit_ratio,1-(float)right_packet_num/num_of_packet,(float)right_packet_num/num_of_packet);
}
free(g[0]);
free(g[1]);
free(data);
free(crc_output);
free(conv_output);
free(channel_output);
free(deconv_output);
free(decrc_output);
return 0;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?