Imported Upstream version 3.2.2
[debian/gnuradio] / gnuradio-core / src / lib / general / qa_gr_firdes.cc
1 /* -*- c++ -*- */
2 /*
3  * Copyright 2002 Free Software Foundation, Inc.
4  * 
5  * This file is part of GNU Radio
6  * 
7  * GNU Radio is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3, or (at your option)
10  * any later version.
11  * 
12  * GNU Radio is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with GNU Radio; see the file COPYING.  If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street,
20  * Boston, MA 02110-1301, USA.
21  */
22
23 #include <qa_gr_firdes.h>
24 #include <gr_firdes.h>
25 #include <cppunit/TestAssert.h>
26 #include <gr_complex.h>
27 #include <string.h>
28 #include <iostream>
29 #include <iomanip>
30 #include <stdio.h>
31
32 #define NELEM(x) (sizeof (x) / sizeof (x[0]))
33
34 using std::vector;
35
36 #if 0
37 static void
38 print_taps (std::ostream &s, vector<float> &v)
39 {
40   
41   for (unsigned int i = 0; i < v.size (); i++){
42     printf ("tap[%2d] = %16.7e\n", i, v[i]);
43   }
44 }
45 #endif
46
47 static void
48 check_symmetry (vector<float> &v)
49 {
50   int   n = v.size ();
51   int   m = n / 2;
52
53   for (int i = 0; i < m; i++)
54     CPPUNIT_ASSERT_DOUBLES_EQUAL (v[i], v[n - i - 1], 1e-9);
55 }
56
57 const static float t1_exp[53] = {
58  -9.0525491e-04,
59   2.0713841e-04,
60   1.2388536e-03,
61   2.9683491e-04,
62  -1.7744775e-03,
63  -1.3599906e-03,
64   2.2031884e-03,
65   3.2744040e-03,
66  -1.8868084e-03,
67  -5.9935520e-03,
68   6.4301129e-18,
69   8.9516686e-03,
70   4.2178580e-03,
71  -1.0998557e-02,
72  -1.1173409e-02,
73   1.0455756e-02,
74   2.0686293e-02,
75  -5.2032238e-03,
76  -3.1896964e-02,
77  -7.4998410e-03,
78   4.3362070e-02,
79   3.2502845e-02,
80  -5.3328082e-02,
81  -8.5621715e-02,
82   6.0117975e-02,
83   3.1128189e-01,
84   4.3769023e-01,
85   3.1128189e-01,
86   6.0117975e-02,
87  -8.5621715e-02,
88  -5.3328082e-02,
89   3.2502845e-02,
90   4.3362070e-02,
91  -7.4998410e-03,
92  -3.1896964e-02,
93  -5.2032238e-03,
94   2.0686293e-02,
95   1.0455756e-02,
96  -1.1173409e-02,
97  -1.0998557e-02,
98   4.2178580e-03,
99   8.9516686e-03,
100   6.4301129e-18,
101  -5.9935520e-03,
102  -1.8868084e-03,
103   3.2744040e-03,
104   2.2031884e-03,
105  -1.3599906e-03,
106  -1.7744775e-03,
107   2.9683491e-04,
108   1.2388536e-03,
109   2.0713841e-04,
110  -9.0525491e-04
111 };
112
113 const static float t2_exp[53] = {
114   9.0380036e-04,
115  -2.0680559e-04,
116  -1.2368630e-03,
117  -2.9635796e-04,
118   1.7716263e-03,
119   1.3578053e-03,
120  -2.1996482e-03,
121  -3.2691427e-03,
122   1.8837767e-03,
123   5.9839217e-03,
124  -6.4197810e-18,
125  -8.9372853e-03,
126  -4.2110807e-03,
127   1.0980885e-02,
128   1.1155456e-02,
129  -1.0438956e-02,
130  -2.0653054e-02,
131   5.1948633e-03,
132   3.1845711e-02,
133   7.4877902e-03,
134  -4.3292396e-02,
135  -3.2450620e-02,
136   5.3242393e-02,
137   8.5484132e-02,
138  -6.0021374e-02,
139  -3.1078172e-01,
140   5.6184036e-01,
141  -3.1078172e-01,
142  -6.0021374e-02,
143   8.5484132e-02,
144   5.3242393e-02,
145  -3.2450620e-02,
146  -4.3292396e-02,
147   7.4877902e-03,
148   3.1845711e-02,
149   5.1948633e-03,
150  -2.0653054e-02,
151  -1.0438956e-02,
152   1.1155456e-02,
153   1.0980885e-02,
154  -4.2110807e-03,
155  -8.9372853e-03,
156  -6.4197810e-18,
157   5.9839217e-03,
158   1.8837767e-03,
159  -3.2691427e-03,
160  -2.1996482e-03,
161   1.3578053e-03,
162   1.7716263e-03,
163  -2.9635796e-04,
164  -1.2368630e-03,
165  -2.0680559e-04,
166   9.0380036e-04
167 };
168
169 const static float t3_exp[107] = {
170   -1.8970841e-06,
171   -7.1057165e-04,
172    5.4005696e-04,
173    4.6233178e-04,
174    2.0572044e-04,
175    3.5209916e-04,
176   -1.4098573e-03,
177    1.1279077e-04,
178   -6.2994129e-04,
179    1.1450432e-03,
180    1.3637283e-03,
181   -6.4360141e-04,
182    3.6509900e-04,
183   -3.2864159e-03,
184    7.0192874e-04,
185    3.7524730e-04,
186    2.0256115e-03,
187    3.0641893e-03,
188   -3.6618244e-03,
189    7.5592739e-05,
190   -5.5586505e-03,
191    2.3849572e-03,
192    4.0114378e-03,
193    1.6636450e-03,
194    4.7835698e-03,
195   -1.0191196e-02,
196   -3.8158931e-04,
197   -5.5551580e-03,
198    5.3901658e-03,
199    1.1366769e-02,
200   -3.0000482e-03,
201    4.9341680e-03,
202   -2.0093076e-02,
203    5.5752542e-17,
204    1.2093617e-03,
205    8.6089745e-03,
206    2.2382140e-02,
207   -1.6854567e-02,
208    1.6913920e-03,
209   -3.1222520e-02,
210    3.2711059e-03,
211    2.2604836e-02,
212    8.1451107e-03,
213    3.7583180e-02,
214   -5.2293688e-02,
215   -8.0551542e-03,
216   -4.0092729e-02,
217    1.5582236e-02,
218    9.7452506e-02,
219   -1.6183170e-02,
220    8.3281815e-02,
221   -2.8196752e-01,
222   -1.0965768e-01,
223    5.2867508e-01,
224   -1.0965768e-01,
225   -2.8196752e-01,
226    8.3281815e-02,
227   -1.6183170e-02,
228    9.7452506e-02,
229    1.5582236e-02,
230   -4.0092729e-02,
231   -8.0551542e-03,
232   -5.2293688e-02,
233    3.7583180e-02,
234    8.1451107e-03,
235    2.2604836e-02,
236    3.2711059e-03,
237   -3.1222520e-02,
238    1.6913920e-03,
239   -1.6854567e-02,
240    2.2382140e-02,
241    8.6089745e-03,
242    1.2093617e-03,
243    5.5752542e-17,
244   -2.0093076e-02,
245    4.9341680e-03,
246   -3.0000482e-03,
247    1.1366769e-02,
248    5.3901658e-03,
249   -5.5551580e-03,
250   -3.8158931e-04,
251   -1.0191196e-02,
252    4.7835698e-03,
253    1.6636450e-03,
254    4.0114378e-03,
255    2.3849572e-03,
256   -5.5586505e-03,
257    7.5592739e-05,
258   -3.6618244e-03,
259    3.0641893e-03,
260    2.0256115e-03,
261    3.7524730e-04,
262    7.0192874e-04,
263   -3.2864159e-03,
264    3.6509900e-04,
265   -6.4360141e-04,
266    1.3637283e-03,
267    1.1450432e-03,
268   -6.2994129e-04,
269    1.1279077e-04,
270   -1.4098573e-03,
271    3.5209916e-04,
272    2.0572044e-04,
273    4.6233178e-04,
274    5.4005696e-04,
275   -7.1057165e-04,
276   -1.8970841e-06
277 };
278
279
280 const static float t4_exp[] = { // low pass
281  0.001059958362,
282 0.0002263929928,
283 -0.001277606934,
284 -0.0009675776237,
285  0.001592264394,
286   0.00243603508,
287 -0.001451682881,
288 -0.004769335967,
289 5.281541594e-18,
290  0.007567512803,
291  0.003658855334,
292 -0.009761494584,
293  -0.01011830103,
294  0.009636915289,
295    0.0193619132,
296 -0.004935568199,
297  -0.03060629964,
298 -0.007267376408,
299   0.04236677289,
300   0.03197422624,
301  -0.05274848267,
302   -0.0850463286,
303   0.05989059806,
304      0.31065014,
305    0.4370569289,
306      0.31065014,
307   0.05989059806,
308   -0.0850463286,
309  -0.05274848267,
310   0.03197422624,
311   0.04236677289,
312 -0.007267376408,
313  -0.03060629964,
314 -0.004935568199,
315    0.0193619132,
316  0.009636915289,
317  -0.01011830103,
318 -0.009761494584,
319  0.003658855334,
320  0.007567512803,
321 5.281541594e-18,
322 -0.004769335967,
323 -0.001451682881,
324   0.00243603508,
325  0.001592264394,
326 -0.0009675776237,
327 -0.001277606934,
328 0.0002263929928,
329  0.001059958362,
330 };
331
332
333 const static float t5_exp[] = { //high pass
334 -0.001062123571,
335 -0.0002268554381,
336  0.001280216733,
337  0.000969554123,
338 -0.001595516922,
339 -0.002441011136,
340  0.001454648213,
341  0.004779078532,
342 -5.292330097e-18,
343 -0.007582970895,
344  -0.00366632943,
345  0.009781434201,
346   0.01013896987,
347 -0.009656600654,
348  -0.01940146461,
349  0.004945650231,
350   0.03066881932,
351   0.00728222169,
352  -0.04245331511,
353  -0.03203954175,
354   0.05285623297,
355   0.08522006124,
356  -0.06001294032,
357   -0.3112847209,
358    0.5630782247,
359   -0.3112847209,
360  -0.06001294032,
361   0.08522006124,
362   0.05285623297,
363  -0.03203954175,
364  -0.04245331511,
365   0.00728222169,
366   0.03066881932,
367  0.004945650231,
368  -0.01940146461,
369 -0.009656600654,
370   0.01013896987,
371  0.009781434201,
372  -0.00366632943,
373 -0.007582970895,
374 -5.292330097e-18,
375  0.004779078532,
376  0.001454648213,
377 -0.002441011136,
378 -0.001595516922,
379  0.000969554123,
380  0.001280216733,
381 -0.0002268554381,
382 -0.001062123571,
383 };
384
385 const static float t6_exp[] = { // bandpass
386 0.0002809273137,
387 -0.001047327649,
388 7.936541806e-05,
389 -0.0004270860809,
390 0.0007595835486,
391 0.0008966081077,
392 -0.0004236323002,
393 0.0002423936094,
394 -0.002212299034,
395 0.0004807534278,
396 0.0002620361629,
397  0.001443728455,
398  0.002229931997,
399 -0.002720607212,
400 5.731141573e-05,
401 -0.004297634587,
402  0.001878833398,
403  0.003217151389,
404  0.001357055153,
405  0.003965090029,
406 -0.008576190099,
407 -0.0003257228818,
408 -0.004805727862,
409  0.004721920472,
410   0.01007549558,
411 -0.002688719891,
412  0.004467967432,
413  -0.01837076992,
414 5.119658377e-17,
415  0.001125075156,
416  0.008071650751,
417   0.02113764361,
418  -0.01602453552,
419  0.001618095324,
420  -0.03004053794,
421  0.003163811285,
422    0.0219683405,
423  0.007950295694,
424   0.03682873398,
425  -0.05142467469,
426  -0.00794606097,
427  -0.03965795785,
428   0.01544955093,
429   0.09681399167,
430  -0.01610304788,
431   0.08297294378,
432   -0.2811714709,
433   -0.1094062924,
434    0.5275565982,
435   -0.1094062924,
436   -0.2811714709,
437   0.08297294378,
438  -0.01610304788,
439   0.09681399167,
440   0.01544955093,
441  -0.03965795785,
442  -0.00794606097,
443  -0.05142467469,
444   0.03682873398,
445  0.007950295694,
446    0.0219683405,
447  0.003163811285,
448  -0.03004053794,
449  0.001618095324,
450  -0.01602453552,
451   0.02113764361,
452  0.008071650751,
453  0.001125075156,
454 5.119658377e-17,
455  -0.01837076992,
456  0.004467967432,
457 -0.002688719891,
458   0.01007549558,
459  0.004721920472,
460 -0.004805727862,
461 -0.0003257228818,
462 -0.008576190099,
463  0.003965090029,
464  0.001357055153,
465  0.003217151389,
466  0.001878833398,
467 -0.004297634587,
468 5.731141573e-05,
469 -0.002720607212,
470  0.002229931997,
471  0.001443728455,
472 0.0002620361629,
473 0.0004807534278,
474 -0.002212299034,
475 0.0002423936094,
476 -0.0004236323002,
477 0.0008966081077,
478 0.0007595835486,
479 -0.0004270860809,
480 7.936541806e-05,
481 -0.001047327649,
482 0.0002809273137,
483 };
484
485 void
486 qa_gr_firdes::t1 ()
487 {
488   vector<float> taps =
489     gr_firdes::low_pass ( 1.0,
490                           8000,
491                           1750,
492                           500,
493                           gr_firdes::WIN_HAMMING);
494
495   // cout << "ntaps: " << taps.size () << endl;
496   // print_taps (cout, taps);
497
498   CPPUNIT_ASSERT_EQUAL (NELEM (t1_exp), taps.size ());
499   for (unsigned int i = 0; i < taps.size (); i++)
500     CPPUNIT_ASSERT_DOUBLES_EQUAL (t1_exp[i], taps[i], 1e-9);
501
502   check_symmetry (taps);
503 }
504
505 void
506 qa_gr_firdes::t2 ()
507 {
508   vector<float> taps =
509     gr_firdes::high_pass ( 1.0,
510                            8000,
511                            1750,
512                            500,
513                            gr_firdes::WIN_HAMMING);
514
515   // cout << "ntaps: " << taps.size () << endl;
516   // print_taps (cout, taps);
517
518   CPPUNIT_ASSERT_EQUAL (NELEM (t2_exp), taps.size ());
519
520   for (unsigned int i = 0; i < taps.size (); i++)
521     CPPUNIT_ASSERT_DOUBLES_EQUAL (t2_exp[i], taps[i], 1e-9);
522
523   check_symmetry (taps);
524 }
525
526 void
527 qa_gr_firdes::t3 ()
528 {
529   vector<float> taps =
530     gr_firdes::band_pass ( 1.0,
531                            20e6,
532                            5.75e6 - (5.28e6/2),
533                            5.75e6 + (5.28e6/2),
534                            0.62e6,
535                            gr_firdes::WIN_HAMMING);
536
537   // cout << "ntaps: " << taps.size () << endl;
538   // print_taps (cout, taps);
539
540   CPPUNIT_ASSERT_EQUAL (NELEM (t3_exp), taps.size ());
541
542   for (unsigned int i = 0; i < taps.size (); i++)
543     CPPUNIT_ASSERT_DOUBLES_EQUAL (t3_exp[i], taps[i], 1e-7);
544
545   check_symmetry (taps);
546 }
547
548 void
549 qa_gr_firdes::t4 ()
550 {
551   vector<float> taps =
552     gr_firdes::low_pass_2 ( 1.0,
553                           8000,
554                           1750,
555                           500,
556                           66,
557                           gr_firdes::WIN_HAMMING);
558
559   //  std::cout << "ntaps: " << taps.size () << std::endl;
560   //  print_taps (std::cout, taps);
561
562   CPPUNIT_ASSERT_EQUAL (NELEM (t4_exp), taps.size ());
563   for (unsigned int i = 0; i < taps.size (); i++)
564     CPPUNIT_ASSERT_DOUBLES_EQUAL (t4_exp[i], taps[i], 1e-9);
565
566
567   check_symmetry (taps);
568 }
569
570 void
571 qa_gr_firdes::t5 ()
572 {
573   vector<float> taps =
574     gr_firdes::high_pass_2 ( 1.0,
575                            8000,
576                            1750,
577                            500,
578                            66,
579                            gr_firdes::WIN_HAMMING);
580
581   //  std::cout << "ntaps: " << taps.size () << std::endl;
582   //  print_taps (std::cout, taps);
583
584   CPPUNIT_ASSERT_EQUAL (NELEM (t5_exp), taps.size ());
585
586   for (unsigned int i = 0; i < taps.size (); i++)
587     CPPUNIT_ASSERT_DOUBLES_EQUAL (t5_exp[i], taps[i], 1e-9);
588
589   check_symmetry (taps);
590 }
591
592 void
593 qa_gr_firdes::t6 ()
594 {
595   vector<float> taps =
596     gr_firdes::band_pass_2 ( 1.0,
597                            20e6,
598                            5.75e6 - (5.28e6/2),
599                            5.75e6 + (5.28e6/2),
600                            0.62e6,
601                            66,
602                            gr_firdes::WIN_HAMMING);
603
604   //  std::cout << "ntaps: " << taps.size () << std::endl;
605   //  print_taps (std::cout, taps);
606
607   CPPUNIT_ASSERT_EQUAL (NELEM (t6_exp), taps.size ());
608
609   for (unsigned int i = 0; i < taps.size (); i++)
610     CPPUNIT_ASSERT_DOUBLES_EQUAL (t6_exp[i], taps[i], 1e-7);
611
612   check_symmetry (taps);
613 }
614
615 void
616 qa_gr_firdes::t7 ()
617 {
618 }