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