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 + -
显示快捷键?