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

📄 harq.cpp

📁 主要是针对现在的合作通信中
💻 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 + -