3 # Copyright 2004,2005 Free Software Foundation, Inc.
5 # This file is part of GNU Radio
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)
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.
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.
23 from gnuradio import gr, gr_unittest
27 def make_random_complex_tuple(L):
30 result.append(complex(random.uniform(-1000,1000),
31 random.uniform(-1000,1000)))
34 def make_random_float_tuple(L):
37 result.append(float(int(random.uniform(-1000,1000))))
41 def reference_filter_ccc(dec, taps, input):
43 compute result using conventional fir filter
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 fg.connect(src, op, dst)
54 def reference_filter_fff(dec, taps, input):
56 compute result using conventional fir filter
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 fg.connect(src, op, dst)
71 sys.stdout.write("(%6.3f,%6.3fj), " % (i.real, i.imag))
72 sys.stdout.write('\n')
75 class test_fft_filter(gr_unittest.TestCase):
78 self.fg = gr.flow_graph ()
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)
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,
93 #def test_ccc_000(self):
94 # self.assertRaises (RuntimeError, gr.fft_filter_ccc, 2, (1,))
96 def test_ccc_001(self):
97 src_data = (0,1,2,3,4,5,6,7)
99 expected_result = tuple([complex(x) for x in (0,1,2,3,4,5,6,7)])
100 src = gr.vector_source_c(src_data)
101 op = gr.fft_filter_ccc(1, taps)
102 dst = gr.vector_sink_c()
103 self.fg.connect(src, op, dst)
105 result_data = dst.data()
106 #print 'expected:', expected_result
107 #print 'results: ', result_data
108 self.assertComplexTuplesAlmostEqual (expected_result, result_data, 5)
111 def test_ccc_002(self):
112 src_data = (0,1,2,3,4,5,6,7)
114 expected_result = tuple([2 * complex(x) for x in (0,1,2,3,4,5,6,7)])
115 src = gr.vector_source_c(src_data)
116 op = gr.fft_filter_ccc(1, taps)
117 dst = gr.vector_sink_c()
118 self.fg.connect(src, op, dst)
120 result_data = dst.data()
121 #print 'expected:', expected_result
122 #print 'results: ', result_data
123 self.assertComplexTuplesAlmostEqual (expected_result, result_data, 5)
125 def test_ccc_004(self):
128 # sys.stderr.write("\n>>> Loop = %d\n" % (i,))
130 src_data = make_random_complex_tuple(src_len)
131 ntaps = int(random.uniform(2, 1000))
132 taps = make_random_complex_tuple(ntaps)
133 expected_result = reference_filter_ccc(1, taps, src_data)
135 src = gr.vector_source_c(src_data)
136 op = gr.fft_filter_ccc(1, taps)
137 dst = gr.vector_sink_c()
138 self.fg.connect(src, op, dst)
140 result_data = dst.data()
142 self.assert_fft_ok2(expected_result, result_data)
144 def test_ccc_005(self):
147 # sys.stderr.write("\n>>> Loop = %d\n" % (i,))
150 src_data = make_random_complex_tuple(src_len)
151 ntaps = int(random.uniform(2, 100))
152 taps = make_random_complex_tuple(ntaps)
153 expected_result = reference_filter_ccc(dec, taps, src_data)
155 src = gr.vector_source_c(src_data)
156 op = gr.fft_filter_ccc(dec, taps)
157 dst = gr.vector_sink_c()
158 self.fg.connect(src, op, dst)
160 result_data = dst.data()
162 self.assert_fft_ok2(expected_result, result_data)
164 # ----------------------------------------------------------------
166 # ----------------------------------------------------------------
168 def test_fff_001(self):
169 src_data = (0,1,2,3,4,5,6,7)
171 expected_result = tuple([float(x) for x in (0,1,2,3,4,5,6,7)])
172 src = gr.vector_source_f(src_data)
173 op = gr.fft_filter_fff(1, taps)
174 dst = gr.vector_sink_f()
175 self.fg.connect(src, op, dst)
177 result_data = dst.data()
178 #print 'expected:', expected_result
179 #print 'results: ', result_data
180 self.assertFloatTuplesAlmostEqual (expected_result, result_data, 5)
183 def test_fff_002(self):
184 src_data = (0,1,2,3,4,5,6,7)
186 expected_result = tuple([2 * float(x) for x in (0,1,2,3,4,5,6,7)])
187 src = gr.vector_source_f(src_data)
188 op = gr.fft_filter_fff(1, taps)
189 dst = gr.vector_sink_f()
190 self.fg.connect(src, op, dst)
192 result_data = dst.data()
193 #print 'expected:', expected_result
194 #print 'results: ', result_data
195 self.assertFloatTuplesAlmostEqual (expected_result, result_data, 5)
197 def xtest_fff_003(self):
200 sys.stderr.write("\n>>> Loop = %d\n" % (i,))
202 src_data = make_random_float_tuple(src_len)
203 ntaps = int(random.uniform(2, 1000))
204 taps = make_random_float_tuple(ntaps)
205 expected_result = reference_filter_fff(1, taps, src_data)
207 src = gr.vector_source_f(src_data)
208 op = gr.fft_filter_fff(1, taps)
209 dst = gr.vector_sink_f()
210 self.fg.connect(src, op, dst)
212 result_data = dst.data()
214 #print "src_len =", src_len, " ntaps =", ntaps
216 self.assert_fft_float_ok2(expected_result, result_data, abs_eps=1.0)
218 expected = open('expected', 'w')
219 for x in expected_result:
220 expected.write(`x` + '\n')
221 actual = open('actual', 'w')
222 for x in result_data:
223 actual.write(`x` + '\n')
226 def xtest_fff_004(self):
229 sys.stderr.write("\n>>> Loop = %d\n" % (i,))
231 src_data = make_random_float_tuple(src_len)
232 ntaps = int(random.uniform(2, 1000))
233 taps = make_random_float_tuple(ntaps)
234 expected_result = reference_filter_fff(1, taps, src_data)
236 src = gr.vector_source_f(src_data)
237 op = gr.fft_filter_fff(1, taps)
238 dst = gr.vector_sink_f()
239 self.fg.connect(src, op, dst)
241 result_data = dst.data()
243 self.assert_fft_float_ok2(expected_result, result_data, abs_eps=2.0)
245 def xtest_fff_005(self):
248 sys.stderr.write("\n>>> Loop = %d\n" % (i,))
251 src_data = make_random_float_tuple(src_len)
252 ntaps = int(random.uniform(2, 100))
253 taps = make_random_float_tuple(ntaps)
254 expected_result = reference_filter_fff(dec, taps, src_data)
256 src = gr.vector_source_f(src_data)
257 op = gr.fft_filter_fff(dec, taps)
258 dst = gr.vector_sink_f()
259 self.fg.connect(src, op, dst)
261 result_data = dst.data()
263 self.assert_fft_float_ok2(expected_result, result_data)
266 if __name__ == '__main__':