Imported Upstream version 3.2.2
[debian/gnuradio] / gnuradio-core / src / python / gnuradio / gr / qa_fft_filter.py
1 #!/usr/bin/env python
2 #
3 # Copyright 2004,2005,2007 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 from gnuradio import gr, gr_unittest
24 import sys
25 import random
26
27 def make_random_complex_tuple(L):
28     result = []
29     for x in range(L):
30         result.append(complex(random.uniform(-1000,1000),
31                               random.uniform(-1000,1000)))
32     return tuple(result)
33
34 def make_random_float_tuple(L):
35     result = []
36     for x in range(L):
37         result.append(float(int(random.uniform(-1000,1000))))
38     return tuple(result)
39
40
41 def reference_filter_ccc(dec, taps, input):
42     """
43     compute result using conventional fir filter
44     """
45     tb = gr.top_block()
46     #src = gr.vector_source_c(((0,) * (len(taps) - 1)) + input)
47     src = gr.vector_source_c(input)
48     op = gr.fir_filter_ccc(dec, taps)
49     dst = gr.vector_sink_c()
50     tb.connect(src, op, dst)
51     tb.run()
52     return dst.data()
53
54 def reference_filter_fff(dec, taps, input):
55     """
56     compute result using conventional fir filter
57     """
58     tb = gr.top_block()
59     #src = gr.vector_source_f(((0,) * (len(taps) - 1)) + input)
60     src = gr.vector_source_f(input)
61     op = gr.fir_filter_fff(dec, taps)
62     dst = gr.vector_sink_f()
63     tb.connect(src, op, dst)
64     tb.run()
65     return dst.data()
66
67
68 def print_complex(x):
69     for i in x:
70         i = complex(i)
71         sys.stdout.write("(%6.3f,%6.3fj), " % (i.real, i.imag))
72     sys.stdout.write('\n')
73
74
75 class test_fft_filter(gr_unittest.TestCase):
76
77     def setUp(self):
78         pass
79
80     def tearDown(self):
81         pass
82
83     def assert_fft_ok2(self, expected_result, result_data):
84         expected_result = expected_result[:len(result_data)]
85         self.assertComplexTuplesAlmostEqual2 (expected_result, result_data,
86                                               abs_eps=1e-9, rel_eps=4e-4)
87
88     def assert_fft_float_ok2(self, expected_result, result_data, abs_eps=1e-9, rel_eps=4e-4):
89         expected_result = expected_result[:len(result_data)]
90         self.assertFloatTuplesAlmostEqual2 (expected_result, result_data,
91                                             abs_eps, rel_eps)
92
93     #def test_ccc_000(self):
94     #    self.assertRaises (RuntimeError, gr.fft_filter_ccc, 2, (1,))
95
96     def test_ccc_001(self):
97         tb = gr.top_block()
98         src_data = (0,1,2,3,4,5,6,7)
99         taps = (1,)
100         expected_result = tuple([complex(x) for x in (0,1,2,3,4,5,6,7)])
101         src = gr.vector_source_c(src_data)
102         op = gr.fft_filter_ccc(1, taps)
103         dst = gr.vector_sink_c()
104         tb.connect(src, op, dst)
105         tb.run()
106         result_data = dst.data()
107         #print 'expected:', expected_result
108         #print 'results: ', result_data
109         self.assertComplexTuplesAlmostEqual (expected_result, result_data, 5)
110         
111
112     def test_ccc_002(self):
113         tb = gr.top_block()
114         src_data = (0,1,2,3,4,5,6,7)
115         taps = (2,)
116         expected_result = tuple([2 * complex(x) for x in (0,1,2,3,4,5,6,7)])
117         src = gr.vector_source_c(src_data)
118         op = gr.fft_filter_ccc(1, taps)
119         dst = gr.vector_sink_c()
120         tb.connect(src, op, dst)
121         tb.run()
122         result_data = dst.data()
123         #print 'expected:', expected_result
124         #print 'results: ', result_data
125         self.assertComplexTuplesAlmostEqual (expected_result, result_data, 5)
126         
127     def test_ccc_004(self):
128         random.seed(0)
129         for i in xrange(25):
130             # sys.stderr.write("\n>>> Loop = %d\n" % (i,))
131             src_len = 4*1024
132             src_data = make_random_complex_tuple(src_len)
133             ntaps = int(random.uniform(2, 1000))
134             taps = make_random_complex_tuple(ntaps)
135             expected_result = reference_filter_ccc(1, taps, src_data)
136
137             src = gr.vector_source_c(src_data)
138             op = gr.fft_filter_ccc(1, taps)
139             dst = gr.vector_sink_c()
140             tb = gr.top_block()
141             tb.connect(src, op, dst)
142             tb.run()
143             result_data = dst.data()
144             del tb
145             
146             self.assert_fft_ok2(expected_result, result_data)
147
148     def test_ccc_005(self):
149         random.seed(0)
150         for i in xrange(25):
151             # sys.stderr.write("\n>>> Loop = %d\n" % (i,))
152             dec = i + 1
153             src_len = 4*1024
154             src_data = make_random_complex_tuple(src_len)
155             ntaps = int(random.uniform(2, 100))
156             taps = make_random_complex_tuple(ntaps)
157             expected_result = reference_filter_ccc(dec, taps, src_data)
158
159             src = gr.vector_source_c(src_data)
160             op = gr.fft_filter_ccc(dec, taps)
161             dst = gr.vector_sink_c()
162             tb = gr.top_block()
163             tb.connect(src, op, dst)
164             tb.run()
165             del tb
166             result_data = dst.data()
167
168             self.assert_fft_ok2(expected_result, result_data)
169
170     # ----------------------------------------------------------------
171     # test _fff version
172     # ----------------------------------------------------------------
173
174     def test_fff_001(self):
175         tb = gr.top_block()
176         src_data = (0,1,2,3,4,5,6,7)
177         taps = (1,)
178         expected_result = tuple([float(x) for x in (0,1,2,3,4,5,6,7)])
179         src = gr.vector_source_f(src_data)
180         op = gr.fft_filter_fff(1, taps)
181         dst = gr.vector_sink_f()
182         tb.connect(src, op, dst)
183         tb.run()
184         result_data = dst.data()
185         #print 'expected:', expected_result
186         #print 'results: ', result_data
187         self.assertFloatTuplesAlmostEqual (expected_result, result_data, 5)
188         
189
190     def test_fff_002(self):
191         tb = gr.top_block()
192         src_data = (0,1,2,3,4,5,6,7)
193         taps = (2,)
194         expected_result = tuple([2 * float(x) for x in (0,1,2,3,4,5,6,7)])
195         src = gr.vector_source_f(src_data)
196         op = gr.fft_filter_fff(1, taps)
197         dst = gr.vector_sink_f()
198         tb.connect(src, op, dst)
199         tb.run()
200         result_data = dst.data()
201         #print 'expected:', expected_result
202         #print 'results: ', result_data
203         self.assertFloatTuplesAlmostEqual (expected_result, result_data, 5)
204         
205     def xtest_fff_003(self):
206         random.seed(0)
207         for i in xrange(25):
208             sys.stderr.write("\n>>> Loop = %d\n" % (i,))
209             src_len = 4096
210             src_data = make_random_float_tuple(src_len)
211             ntaps = int(random.uniform(2, 1000))
212             taps = make_random_float_tuple(ntaps)
213             expected_result = reference_filter_fff(1, taps, src_data)
214
215             src = gr.vector_source_f(src_data)
216             op = gr.fft_filter_fff(1, taps)
217             dst = gr.vector_sink_f()
218             tb = gr.top_block()
219             tb.connect(src, op, dst)
220             tb.run()
221             result_data = dst.data()
222
223             #print "src_len =", src_len, " ntaps =", ntaps
224             try:
225                 self.assert_fft_float_ok2(expected_result, result_data, abs_eps=1.0)
226             except:
227                 expected = open('expected', 'w')
228                 for x in expected_result:
229                     expected.write(`x` + '\n')
230                 actual = open('actual', 'w')
231                 for x in result_data:
232                     actual.write(`x` + '\n')
233                 raise
234
235     def xtest_fff_004(self):
236         random.seed(0)
237         for i in xrange(25):
238             sys.stderr.write("\n>>> Loop = %d\n" % (i,))
239             src_len = 4*1024
240             src_data = make_random_float_tuple(src_len)
241             ntaps = int(random.uniform(2, 1000))
242             taps = make_random_float_tuple(ntaps)
243             expected_result = reference_filter_fff(1, taps, src_data)
244
245             src = gr.vector_source_f(src_data)
246             op = gr.fft_filter_fff(1, taps)
247             dst = gr.vector_sink_f()
248             tb = gr.top_block()
249             tb.connect(src, op, dst)
250             tb.run()
251             result_data = dst.data()
252
253             self.assert_fft_float_ok2(expected_result, result_data, abs_eps=2.0)
254
255     def xtest_fff_005(self):
256         random.seed(0)
257         for i in xrange(25):
258             sys.stderr.write("\n>>> Loop = %d\n" % (i,))
259             dec = i + 1
260             src_len = 4*1024
261             src_data = make_random_float_tuple(src_len)
262             ntaps = int(random.uniform(2, 100))
263             taps = make_random_float_tuple(ntaps)
264             expected_result = reference_filter_fff(dec, taps, src_data)
265
266             src = gr.vector_source_f(src_data)
267             op = gr.fft_filter_fff(dec, taps)
268             dst = gr.vector_sink_f()
269             tb = gr.top_block()
270             tb.connect(src, op, dst)
271             tb.run()
272             result_data = dst.data()
273
274             self.assert_fft_float_ok2(expected_result, result_data)
275
276
277 if __name__ == '__main__':
278     gr_unittest.main ()
279