1 //
2 // firdes_length_test.c
3 //
4 
5 #include <stdlib.h>
6 #include <stdio.h>
7 #include <getopt.h>
8 
9 #include "liquid.internal.h"
10 
11 #define OUTPUT_FILENAME "firdes_length_test.m"
12 
13 // print usage/help message
usage()14 void usage()
15 {
16     printf("firdes_length_test:\n");
17     printf("  u/h   : print usage/help\n");
18     printf("  t     : filter transition bandwidth,  0 < t < 0.5, default: 0.1\n");
19     printf("  a     : filter attenuation (minimum) [dB], default: 20\n");
20     printf("  A     : filter attenuation (maximum) [dB], default: 100\n");
21     printf("  n     : number of steps, default: 41\n");
22 }
23 
main(int argc,char * argv[])24 int main(int argc, char*argv[]) {
25     // options
26     float ft=0.1f;          // filter transition
27     float As_min = 20.0f;
28     float As_max = 100.0f;
29     unsigned int num_As = 41;   // number of steps
30 
31     int dopt;
32     while ((dopt = getopt(argc,argv,"uht:a:A:n:")) != EOF) {
33         switch (dopt) {
34         case 'u':
35         case 'h': usage();                  return 0;
36         case 't': ft = atof(optarg);        break;
37         case 'a': As_min = atof(optarg);    break;
38         case 'A': As_max = atof(optarg);    break;
39         case 'n': num_As = atoi(optarg);    break;
40         default:
41             exit(1);
42         }
43     }
44 
45     // validate input
46     if (As_min <= 0.0f || As_max <= 0.0f) {
47         fprintf(stderr,"error: %s, attenuation must be greater than zero\n", argv[0]);
48         exit(1);
49     } else if (As_max <= As_min) {
50         fprintf(stderr,"error: %s, minimum attenuation cannot exceed maximum\n", argv[0]);
51         exit(1);
52     } else if (num_As < 2) {
53         fprintf(stderr,"error: %s, must have at least 2 steps", argv[0]);
54         exit(1);
55     }
56 
57     // derived values
58     float As_step = (As_max - As_min) / (float)(num_As - 1);
59 
60     // output to file
61     FILE*fid = fopen(OUTPUT_FILENAME,"w");
62     fprintf(fid,"%% %s: auto-generated file\n\n", OUTPUT_FILENAME);
63     fprintf(fid,"clear all;\n");
64     fprintf(fid,"close all;\n\n");
65     fprintf(fid,"num_steps = %u;\n", num_As);
66     fprintf(fid,"As=zeros(1,num_steps);\n");
67     fprintf(fid,"n_Kaiser=zeros(1,num_steps);\n");
68     fprintf(fid,"n_Herrmann=zeros(1,num_steps);\n");
69 
70     unsigned int i;
71     for (i=0; i<num_As; i++) {
72         float As = As_min + i*As_step;
73         float n_Kaiser = estimate_req_filter_len_Kaiser(ft,As);
74         float n_Herrmann = estimate_req_filter_len_Herrmann(ft,As);//+8);
75         printf("As = %8.2f, n_Kaiser=%8.2f, n_Herrmann=%8.2f\n",
76                 As, n_Kaiser, n_Herrmann);
77 
78         fprintf(fid,"As(%4u) = %12.8f; n_Kaiser(%4u)=%12.8f; n_Herrmann(%4u)=%12.8f;\n",
79                 i+1, As,
80                 i+1, n_Kaiser,
81                 i+1, n_Herrmann);
82     }
83 
84     fprintf(fid,"figure;\n");
85     fprintf(fid,"plot(As,n_Kaiser, As,n_Herrmann);\n");
86     fprintf(fid,"grid on;\n");
87     fprintf(fid,"xlabel('Stop-band Attenuation [dB]');\n");
88     fprintf(fid,"ylabel('Filter Length');\n");
89     fprintf(fid,"legend('Kaiser','Herrmann',0);\n");
90 
91     fclose(fid);
92     printf("results written to %s\n", OUTPUT_FILENAME);
93 
94     printf("done.\n");
95     return 0;
96 }
97 
98