📄 vittest.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 + -