1 /* Test viterbi decoder speeds */
2 #include <config.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <unistd.h>
6 #include <time.h>
7 #include <sys/times.h>
8 #ifdef HAVE_GETOPT_H
9 #include <getopt.h>
10 #endif
11 #include "viterbi29.h"
12 #include "parity.h"
13 
14 #if HAVE_GETOPT_LONG
15 struct option Options[] = {
16   {"frame-length",1,NULL,'l'},
17   {"frame-count",1,NULL,'n'},
18   {NULL},
19 };
20 #endif
21 
main(int argc,char * argv[])22 int main(int argc,char *argv[]){
23   int i,d,tr;
24   int sr=0,trials = 1000,errcnt=0,framebits=2048;
25   int *bits,*symbols;
26   void *vp;
27   extern char *optarg;
28   unsigned char *data;
29   struct tms start,finish;
30   double extime;
31 
32   printf("%s, polynomials 0x%x 0x%x\n",id_viterbi29,V29POLYA,V29POLYB);
33 #if HAVE_GETOPT_LONG
34   while((d = getopt_long(argc,argv,"l:n:t",Options,NULL)) != EOF){
35 #else
36   while((d = getopt(argc,argv,"l:n:t")) != EOF){
37 #endif
38     switch(d){
39     case 'l':
40       framebits = atoi(optarg);
41       break;
42     case 'n':
43       trials = atoi(optarg);
44       break;
45     }
46   }
47   bits = malloc((framebits+8)*sizeof(int));
48   data = malloc(framebits/8);
49   symbols = malloc(2*(framebits+8)*sizeof(int));
50 
51   if((vp = create_viterbi29(framebits)) == NULL){
52     printf("create_viterbi29 failed\n");
53     exit(1);
54   }
55   /* Encode a frame of random data */
56   for(i=0;i<framebits+8;i++){
57     bits[i] = (i < framebits) ? (random() & 1) : 0;
58     //bits[i] = 1;
59     sr = (sr << 1) | bits[i];
60     symbols[2*i] = parity(sr & V29POLYA) ? 15:0;
61     symbols[2*i+1] = parity(sr & V29POLYB) ? 15:0;
62   }
63 
64   /* Decode it and make sure we get the right answer */
65   /* Initialize Viterbi decoder */
66   init_viterbi29(vp,0);
67 
68   /* Decode block */
69   for(i=0;i<framebits+8;i++){
70     d = update_viterbi29(vp,symbols[2*i],symbols[2*i+1]);
71     if(d){
72       printf("%d: normalize %d\n",i,d);
73     }
74   }
75   /* Do Viterbi chainback */
76   chainback_viterbi29(vp,data,framebits,0);
77   for(i=0;i<framebits;i++){
78     d = data[i/8] & (0x80 >> (i%8)) ? 1 : 0;
79     if(d != bits[i]){
80       printf("bit %d: %d %d\n",i,bits[i],d);
81       errcnt++;
82     }
83   }
84   if(errcnt == 0){
85     printf("No decoder errors\n");
86   }
87   /* Do time trials */
88   times(&start);
89   for(tr=0;tr < trials;tr++){
90     /* Initialize Viterbi decoder */
91     init_viterbi29(vp,0);
92 
93     /* Decode block */
94     for(i=0;i<framebits;i++){
95       update_viterbi29(vp,symbols[2*i],symbols[2*i+1]);
96     }
97     /* Do Viterbi chainback */
98     chainback_viterbi29(vp,data,framebits,0);
99   }
100   times(&finish);
101   emms_viterbi29();
102   extime = ((double)(finish.tms_utime-start.tms_utime))/CLK_TCK;
103   printf("Execution time for %d %d-bit frames: %.2f sec\n",trials,
104 	 framebits,extime);
105   printf("decoder speed: %g bits/s\n",trials*framebits/extime);
106 
107   exit(0);
108 }
109 
110