arq.cpp
来自「主要是针对现在的合作通信中」· C++ 代码 · 共 202 行
CPP
202 行
// pingtai.cpp : Defines the entry point for the console application.
//
//#include "stdafx.h"
//#include"head_punc.h"
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#include "stdafx.h"
#pragma comment(lib,"crc1.lib")
#pragma comment(lib,"dongtai_punc1.lib")
#pragma comment(lib,"punctured.lib")
#pragma comment(lib,"xiugaihou8.lib")
//#pragma comment(lib,"selective2.lib")
//#pragma comment(lib,"punc.lib") //保留被穿孔矩阵穿掉的信息
extern "C" __declspec(dllexport) void crcencoder(int *str,int n,int *str2);
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);
//extern "C" __declspec(dllexport) int selective(int temp,int done,int re_num);
//variables for selective and arq
int re_num; //retransmitsion number
int done; //retransmit or not
int temp=0; //error number for crcdecoder
int punc_or_not=0;
int crc_err_or_not;
int RENUM=5;
time_t Tbegin,Tend;
time_t t;
int selective(int temp)
{
if (temp==0)//crc译码错误
{
re_num++;
if(re_num>RENUM)
return 0; //传输出错,但已达到最大传输次数
else
{
done=0; //穿孔标志 0--穿孔,1--不穿孔
punc_or_not++;
if(punc_or_not==5)
done=1; //不穿孔,以1/2码率传输
return 1; //传输出错,但未达到最大重传次数
}
}
else if(temp==1)
{
done=0;
re_num=0;
punc_or_not=1;
return 0; //传输正确
}
}
int main(int argc, char* argv[])
{
int i,j;
float err_bit_ratio;
int n=384;
int K=3;
int right_packet_num=0;
int num_retrans;
float ave_num;
float R;
int biaozhi=2;
int punc0[2][5]={1,1,0,1,1,1,1,1,1,1};
int punc1[2][5]={1,1,0,0,1,1,1,1,1,1};
int punc2[2][5]={0,1,0,0,1,1,1,1,1,1};
int punc3[2][5]={0,0,0,0,1,1,1,1,1,1};
int channel_len;
int *data,*crc_output,*deconv_output;
int *conv_output,*decrc_output;
int *punc_output;
float *add_noise0;
float *depunc_output;
float *channel_output;
int *g[2];
int mm=0;
float es_n0,eb_n0,begin1,end1,step1;
begin1=0.0;
end1=8.5;
step1=0.25;
int err_num;
int num_of_packet;
float per=0.0;
float through_output=0.0;
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);
data=(int *)malloc(sizeof(int)*n);
crc_output=(int *)malloc(sizeof(int)*(n+16));
deconv_output=(int *)malloc(sizeof(int)*(n+16));
conv_output=(int *)malloc(sizeof(int)*channel_len);
punc_output=(int *)malloc(sizeof(int)*channel_len);
add_noise0=(float *)malloc(sizeof(float)*channel_len);
depunc_output=(float *)malloc(sizeof(float)*channel_len);
channel_output=(float *)malloc(sizeof(float)*channel_len);
decrc_output=(int *)malloc(sizeof(int)*n);
load();
punctured_table(K-1);
printf("\n");
printf("请根据提示选择相应的穿孔矩阵:\n");
printf("请输入速率为5/9的穿孔矩阵punc0[2][5]\n");
printf("信噪比 错误比特数 传输桢数 误比特率 误帧率 吞吐量\n");
for(eb_n0=begin1;eb_n0<=end1;eb_n0+=step1)
{
num_retrans=0;
Tbegin=time(NULL);
//initialization
num_of_packet=1;
err_bit_ratio=0.0;
per=0.0;
through_output=0.0;
re_num=0;
err_num=0;
right_packet_num=0;
punc_or_not=1;
biaozhi=2;
for(i=0;i<n;i++)
data[i]=rnd();
done=0;
do
{
num_retrans++;
es_n0=eb_n0+(float)(10*log10((double)k/channel_len));
if(biaozhi==0)
{
for(i=0;i<n;i++)
data[i]=rnd();
num_of_packet++;
done=0;
re_num=0;
punc_or_not=1;
}
gen_poly(K,g);
crcencoder(data,n,crc_output);
conv_encoder(K,g,n+16,crc_output,conv_output);
punctured(5,channel_len,K-1,punc2,conv_output,punc_output);
add_noise(punc_output,add_noise0,es_n0,channel_len);
depunc(5,channel_len,K-1,punc2,add_noise0,depunc_output);
cov_decode(K,g,channel_len,depunc_output,deconv_output);
crc_err_or_not=crcdecoder(deconv_output,n,decrc_output);
biaozhi=selective(crc_err_or_not);
if(biaozhi==0)
{
temp=bit_err(data,decrc_output,n);
err_num+=temp;
}
if(crc_err_or_not==1)
right_packet_num++;
}while(err_num<500);
ave_num=float(num_of_packet)/(num_retrans);
err_bit_ratio=(float)err_num/(num_of_packet*n);
Tend=time(NULL);
R=(float)5/7;
t=Tend-Tbegin;
per=1-(float)right_packet_num/num_of_packet;
through_output=(float)5/(float)7*(1-per)*ave_num;
printf("%.6f %d %d %f %f %f\n",eb_n0,err_num,num_of_packet,err_bit_ratio,per,through_output);
}
free(g[0]);
free(g[1]);
free(data);
free(crc_output);
free(conv_output);
free(channel_output);
free(deconv_output);
free(decrc_output);
free(add_noise0);
free(punc_output);
free(depunc_output);
return 0;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?