platform.cpp

来自「主要是针对现在的合作通信中」· C++ 代码 · 共 267 行

CPP
267
字号
// pingtai.cpp : Defines the entry point for the console application.
//
//#include "stdafx.h"
//#include"head_punc.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,"conv.lib")
#pragma comment(lib,"jakes model.lib")
#pragma comment(lib,"add_noise.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,double res);
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) double jake(double v,double wc,double *t,double rate,double P);

//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=1;
	int right_packet_num=0;
	int crc_err_or_not;
    time_t Tbegin,Tend;
	time_t t;
	int large_retrans_num;
	int sum_retrans_num=0;
	float TimeDelay=0.0;
	int jisuan;  //jisuan==0 means reaching the max retransmission number
	int biaozhi;
int selective(int temp)
{
    if(temp==1)
	{
		punc_or_not=2;
		done=1;
		re_num=0;
	    return 0;	
	}
    if(temp==0)
	{
		re_num++;
		if(re_num>=large_retrans_num+1)
		{
			return 0;
		}
		else
		{
			done=1;
		    punc_or_not++;
		    if(punc_or_not>=6)
			    done=0;   //尚未达到最大传输次数. 
			return 1;
		}	
	}	
}

int main(int argc, char* argv[])
{
	int i,j;
	float err_bit_ratio;
	int n;
	int K;
	double res;
	int punc0[2][5],punc1[2][5],punc2[2][5],punc3[2][5];
	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.5;
	int err_num;
	int num_of_packet;
    float per=0.0;
	float through_output=0.0;
	
	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 largest retrans num:\n");
	scanf("%d",&large_retrans_num);
	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+16));
	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=begin1;eb_n0<=end1;eb_n0+=step1)
	{
		Tbegin=time(NULL);
		//initialization
		num_of_packet=0;
		err_bit_ratio=0.0;
		per=0.0;
		through_output=0.0;
		re_num=0;
		err_num=0;
		right_packet_num=0;
		sum_retrans_num=0;
		punc_or_not=2;
		done=1;
		jisuan=1;
		biaozhi=1;
        for(i=0;i<n;i++)
		    data[i]=rnd();
		do
		{
			es_n0=eb_n0+(float)(10*log10((double)n/channel_len));
			if(biaozhi==0)
			{
			    for(i=0;i<n;i++)
		            data[i]=rnd();
				num_of_packet++;
				punc_or_not=2;
				done=1;
				re_num=0;
			}
			gen_poly(K,g);
			crcencoder(data,n,crc_output);
			conv_encoder(K,g,n+16,crc_output,conv_output);
			//arq progress
			if(done==1)
			{
				switch(punc_or_not)
				{
				case 2: punctured(5,channel_len,K-1,punc3,conv_output,punc_output);
					break;
		        case 3: punctured(5,channel_len,K-1,punc2,conv_output,punc_output);
					break;
		        case 4: punctured(5,channel_len,K-1,punc1,conv_output,punc_output);
					break;
		        case 5: punctured(5,channel_len,K-1,punc0,conv_output,punc_output);
					break;
                }
			}
			res=jake(100,2,0,20,1);
            if(done==0)
				add_noise(conv_output,channel_output,es_n0,channel_len,res);
			else if(done==1)
				add_noise(punc_output,add_noise0,es_n0,channel_len,res);
			if(done==1)
			{
				switch(punc_or_not)
				{
				case 2: depunc(5,channel_len,K-1,punc3,add_noise0,depunc_output);
					break;
				case 3: depunc(5,channel_len,K-1,punc2,add_noise0,depunc_output);
					break;
				case 4: depunc(5,channel_len,K-1,punc1,add_noise0,depunc_output);
					break;
				case 5: depunc(5,channel_len,K-1,punc0,add_noise0,depunc_output);
					break;
				}
			}
			if(done==0)
				cov_decode(K,g,channel_len,channel_output,deconv_output);
			else if(done==1)
                cov_decode(K,g,channel_len,depunc_output,deconv_output);
			crc_err_or_not=crcdecoder(deconv_output,n,decrc_output);
			if(crc_err_or_not==1)
				right_packet_num++;
			biaozhi=selective(crc_err_or_not);
			if(biaozhi==0)
			{
			    temp=bit_err(data,decrc_output,n);
			    err_num+=temp;		
			}			
		}while(err_num<1000);
		err_bit_ratio=(float)err_num/(num_of_packet*n);
		Tend=time(NULL);
		t=Tend-Tbegin;
		printf("right_packet_num:%d \n",right_packet_num);
		per=1-(float)right_packet_num/num_of_packet;
		TimeDelay=(float)(((int)num_of_packet-(int)right_packet_num)*large_retrans_num+sum_retrans_num)/num_of_packet;
		through_output=(float)((1-per)*n*num_of_packet)/(float)t;
		printf("TimeDelay:%f \n",TimeDelay);
		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 + -
显示快捷键?