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

📄 vittest.c

📁 经典的维特比译码程序
💻 C
字号:
/* Test a rate 1/2 soft decision viterbi decoder */#include <stdio.h>#include <stdlib.h>#include <math.h>#define	RATE	0.5void modnoise(unsigned char *,unsigned int,double,double);/* Lookup table giving count of 1 bits for integers 0-255 */unsigned char Bitcnt[] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8,};main(argc,argv)int argc;char *argv[];{	double ebn0,esn0,noise;	int mettab[2][256];	int amp,nbits,i;	unsigned char *symbols;	unsigned char *data,*decdata;	unsigned long metric;	long t,ntrials;	long seed;	extern char *optarg;	unsigned long biterrs = 0;	unsigned long framerrs = 0;	int timetrial;	amp = 100;	ebn0 = 5.0;	nbits = 1152;	ntrials = 10;	timetrial = 0;	time(&seed);	while((i = getopt(argc,argv,"a:e:n:N:qs:t")) != EOF){		switch(i){		case 'a':			amp = atoi(optarg);	/* Signal amplitude in units */			break;		case 'e':			ebn0 = atof(optarg);	/* Eb/N0 in dB */			break;		case 'n':			nbits = atoi(optarg);	/* Number of data bits */			break;		case 'N':			ntrials = atoi(optarg);			break;		case 's':			seed = atoi(optarg);			break;		case 't':	/* Generate noise once, for decoder timing */			timetrial = 1;			break;		case '?':			usage();			exit(1);		}	}	srandom(seed);	esn0 = RATE * pow(10.,ebn0/10);	/* Es/N0 as power ratio */		noise = 0.5/esn0;	/* only half the noise for BPSK */	noise = sqrt(noise);	/* noise/signal Voltage ratio */		data = malloc(nbits/8);	decdata = malloc(nbits/8);	symbols = malloc(nbits*2);	/* Generate metrics analytically, with gaussian pdf */		gen_met(mettab,amp,esn0,0.,4);	/* Generate data */	memset(data,0,nbits/8);	/* All 0's */	data[nbits/8 - 1] = 0;	/* Tail of 0's*/	i = 0;	if(timetrial){		encode(symbols,data,nbits/8);		modnoise(symbols,nbits*2,amp,noise);		for(t = 1;t <= ntrials;t++)			viterbi(&metric,decdata,symbols,nbits,mettab);		printf("bits decoded = %ld\n",nbits*ntrials);		exit(0);	}	for(t = 1;t <= ntrials;t++){		/* Modulate and add noise */		encode(symbols,data,nbits/8);		modnoise(symbols,nbits*2,amp,noise);		viterbi(&metric,decdata,symbols,nbits,mettab);		if(memcmp(data,decdata,nbits/8) != 0){			printf("decoded data:\n");			for(i=0;i<nbits/8;i++)				printf("%02x",decdata[i]);			printf("\n");			framerrs++;			for(i=0;i<nbits/8;i++){				biterrs += Bitcnt[data[i]^decdata[i]];			}		}	}	printf("Seed %ld Amplitude %d units, Eb/N0 = %lg dB\n",seed,amp,ebn0);	printf("Amplitude %d units, Eb/N0 = %lg dB\n",amp,ebn0);	printf("Frame length = %d bits, #frames = %ld, bits decoded = %ld\n",	 nbits,ntrials,nbits*ntrials);	printf("frame errors: %ld (%g)\n",framerrs,(double)framerrs/ntrials);	printf("bit errors: %ld (%g)\n",biterrs,(double)biterrs/(nbits*ntrials));}usage(){	printf("Usage: vittest [options]\n");	printf("Option&default	meaning\n");	printf("-a 100		amplitude\n");	printf("-e 5.0		Eb/N0 in dB\n");	printf("-n 1152		trial frame size, bits\n");	printf("-N 10		number of trials\n");	printf("-s [cur time]	seed for random number generator\n\n");	printf("-t		select timetest mode (default off)\n");}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -