Imported Upstream version 3.0
[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 2, 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 static void
37 print_taps (std::ostream &s, vector<float> &v)
38 {
39   
40   for (unsigned int i = 0; i < v.size (); i++){
41     printf ("tap[%2d] = %16.7e\n", i, v[i]);
42   }
43 }
44
45 static void
46 check_symmetry (vector<float> &v)
47 {
48   int   n = v.size ();
49   int   m = n / 2;
50
51   for (int i = 0; i < m; i++)
52     CPPUNIT_ASSERT_DOUBLES_EQUAL (v[i], v[n - i - 1], 1e-9);
53 }
54
55 const static float t1_exp[53] = {
56  -9.0525491e-04,
57   2.0713841e-04,
58   1.2388536e-03,
59   2.9683491e-04,
60  -1.7744775e-03,
61  -1.3599906e-03,
62   2.2031884e-03,
63   3.2744040e-03,
64  -1.8868084e-03,
65  -5.9935520e-03,
66   6.4301129e-18,
67   8.9516686e-03,
68   4.2178580e-03,
69  -1.0998557e-02,
70  -1.1173409e-02,
71   1.0455756e-02,
72   2.0686293e-02,
73  -5.2032238e-03,
74  -3.1896964e-02,
75  -7.4998410e-03,
76   4.3362070e-02,
77   3.2502845e-02,
78  -5.3328082e-02,
79  -8.5621715e-02,
80   6.0117975e-02,
81   3.1128189e-01,
82   4.3769023e-01,
83   3.1128189e-01,
84   6.0117975e-02,
85  -8.5621715e-02,
86  -5.3328082e-02,
87   3.2502845e-02,
88   4.3362070e-02,
89  -7.4998410e-03,
90  -3.1896964e-02,
91  -5.2032238e-03,
92   2.0686293e-02,
93   1.0455756e-02,
94  -1.1173409e-02,
95  -1.0998557e-02,
96   4.2178580e-03,
97   8.9516686e-03,
98   6.4301129e-18,
99  -5.9935520e-03,
100  -1.8868084e-03,
101   3.2744040e-03,
102   2.2031884e-03,
103  -1.3599906e-03,
104  -1.7744775e-03,
105   2.9683491e-04,
106   1.2388536e-03,
107   2.0713841e-04,
108  -9.0525491e-04
109 };
110
111 const static float t2_exp[53] = {
112   9.0380036e-04,
113  -2.0680559e-04,
114  -1.2368630e-03,
115  -2.9635796e-04,
116   1.7716263e-03,
117   1.3578053e-03,
118  -2.1996482e-03,
119  -3.2691427e-03,
120   1.8837767e-03,
121   5.9839217e-03,
122  -6.4197810e-18,
123  -8.9372853e-03,
124  -4.2110807e-03,
125   1.0980885e-02,
126   1.1155456e-02,
127  -1.0438956e-02,
128  -2.0653054e-02,
129   5.1948633e-03,
130   3.1845711e-02,
131   7.4877902e-03,
132  -4.3292396e-02,
133  -3.2450620e-02,
134   5.3242393e-02,
135   8.5484132e-02,
136  -6.0021374e-02,
137  -3.1078172e-01,
138   5.6184036e-01,
139  -3.1078172e-01,
140  -6.0021374e-02,
141   8.5484132e-02,
142   5.3242393e-02,
143  -3.2450620e-02,
144  -4.3292396e-02,
145   7.4877902e-03,
146   3.1845711e-02,
147   5.1948633e-03,
148  -2.0653054e-02,
149  -1.0438956e-02,
150   1.1155456e-02,
151   1.0980885e-02,
152  -4.2110807e-03,
153  -8.9372853e-03,
154  -6.4197810e-18,
155   5.9839217e-03,
156   1.8837767e-03,
157  -3.2691427e-03,
158  -2.1996482e-03,
159   1.3578053e-03,
160   1.7716263e-03,
161  -2.9635796e-04,
162  -1.2368630e-03,
163  -2.0680559e-04,
164   9.0380036e-04
165 };
166
167 const static float t3_exp[107] = {
168   -1.8970841e-06,
169   -7.1057165e-04,
170    5.4005696e-04,
171    4.6233178e-04,
172    2.0572044e-04,
173    3.5209916e-04,
174   -1.4098573e-03,
175    1.1279077e-04,
176   -6.2994129e-04,
177    1.1450432e-03,
178    1.3637283e-03,
179   -6.4360141e-04,
180    3.6509900e-04,
181   -3.2864159e-03,
182    7.0192874e-04,
183    3.7524730e-04,
184    2.0256115e-03,
185    3.0641893e-03,
186   -3.6618244e-03,
187    7.5592739e-05,
188   -5.5586505e-03,
189    2.3849572e-03,
190    4.0114378e-03,
191    1.6636450e-03,
192    4.7835698e-03,
193   -1.0191196e-02,
194   -3.8158931e-04,
195   -5.5551580e-03,
196    5.3901658e-03,
197    1.1366769e-02,
198   -3.0000482e-03,
199    4.9341680e-03,
200   -2.0093076e-02,
201    5.5752542e-17,
202    1.2093617e-03,
203    8.6089745e-03,
204    2.2382140e-02,
205   -1.6854567e-02,
206    1.6913920e-03,
207   -3.1222520e-02,
208    3.2711059e-03,
209    2.2604836e-02,
210    8.1451107e-03,
211    3.7583180e-02,
212   -5.2293688e-02,
213   -8.0551542e-03,
214   -4.0092729e-02,
215    1.5582236e-02,
216    9.7452506e-02,
217   -1.6183170e-02,
218    8.3281815e-02,
219   -2.8196752e-01,
220   -1.0965768e-01,
221    5.2867508e-01,
222   -1.0965768e-01,
223   -2.8196752e-01,
224    8.3281815e-02,
225   -1.6183170e-02,
226    9.7452506e-02,
227    1.5582236e-02,
228   -4.0092729e-02,
229   -8.0551542e-03,
230   -5.2293688e-02,
231    3.7583180e-02,
232    8.1451107e-03,
233    2.2604836e-02,
234    3.2711059e-03,
235   -3.1222520e-02,
236    1.6913920e-03,
237   -1.6854567e-02,
238    2.2382140e-02,
239    8.6089745e-03,
240    1.2093617e-03,
241    5.5752542e-17,
242   -2.0093076e-02,
243    4.9341680e-03,
244   -3.0000482e-03,
245    1.1366769e-02,
246    5.3901658e-03,
247   -5.5551580e-03,
248   -3.8158931e-04,
249   -1.0191196e-02,
250    4.7835698e-03,
251    1.6636450e-03,
252    4.0114378e-03,
253    2.3849572e-03,
254   -5.5586505e-03,
255    7.5592739e-05,
256   -3.6618244e-03,
257    3.0641893e-03,
258    2.0256115e-03,
259    3.7524730e-04,
260    7.0192874e-04,
261   -3.2864159e-03,
262    3.6509900e-04,
263   -6.4360141e-04,
264    1.3637283e-03,
265    1.1450432e-03,
266   -6.2994129e-04,
267    1.1279077e-04,
268   -1.4098573e-03,
269    3.5209916e-04,
270    2.0572044e-04,
271    4.6233178e-04,
272    5.4005696e-04,
273   -7.1057165e-04,
274   -1.8970841e-06
275 };
276
277
278 void
279 qa_gr_firdes::t1 ()
280 {
281   vector<float> taps =
282     gr_firdes::low_pass ( 1.0,
283                           8000,
284                           1750,
285                           500,
286                           gr_firdes::WIN_HAMMING);
287
288   // cout << "ntaps: " << taps.size () << endl;
289   // print_taps (cout, taps);
290
291   CPPUNIT_ASSERT_EQUAL (NELEM (t1_exp), taps.size ());
292   for (unsigned int i = 0; i < taps.size (); i++)
293     CPPUNIT_ASSERT_DOUBLES_EQUAL (t1_exp[i], taps[i], 1e-9);
294
295   check_symmetry (taps);
296 }
297
298 void
299 qa_gr_firdes::t2 ()
300 {
301   vector<float> taps =
302     gr_firdes::high_pass ( 1.0,
303                            8000,
304                            1750,
305                            500,
306                            gr_firdes::WIN_HAMMING);
307
308   // cout << "ntaps: " << taps.size () << endl;
309   // print_taps (cout, taps);
310
311   CPPUNIT_ASSERT_EQUAL (NELEM (t2_exp), taps.size ());
312
313   for (unsigned int i = 0; i < taps.size (); i++)
314     CPPUNIT_ASSERT_DOUBLES_EQUAL (t2_exp[i], taps[i], 1e-9);
315
316   check_symmetry (taps);
317 }
318
319 void
320 qa_gr_firdes::t3 ()
321 {
322   vector<float> taps =
323     gr_firdes::band_pass ( 1.0,
324                            20e6,
325                            5.75e6 - (5.28e6/2),
326                            5.75e6 + (5.28e6/2),
327                            0.62e6,
328                            gr_firdes::WIN_HAMMING);
329
330   // cout << "ntaps: " << taps.size () << endl;
331   // print_taps (cout, taps);
332
333   CPPUNIT_ASSERT_EQUAL (NELEM (t3_exp), taps.size ());
334
335   for (unsigned int i = 0; i < taps.size (); i++)
336     CPPUNIT_ASSERT_DOUBLES_EQUAL (t3_exp[i], taps[i], 1e-7);
337
338   check_symmetry (taps);
339 }
340
341 void
342 qa_gr_firdes::t4 ()
343 {
344 }