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