⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qa_rational_resampler.py

📁 这是用python语言写的一个数字广播的信号处理工具包。利用它
💻 PY
字号:
#!/usr/bin/env python## Copyright 2005,2006 Free Software Foundation, Inc.# # This file is part of GNU Radio# # GNU Radio is free software; you can redistribute it and/or modify# it under the terms of the GNU General Public License as published by# the Free Software Foundation; either version 3, or (at your option)# any later version.# # GNU Radio is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the# GNU General Public License for more details.# # You should have received a copy of the GNU General Public License# along with GNU Radio; see the file COPYING.  If not, write to# the Free Software Foundation, Inc., 51 Franklin Street,# Boston, MA 02110-1301, USA.# from gnuradio import gr, gr_unittestfrom gnuradio import blksimport mathimport randomimport sys#import os#print os.getpid()#raw_input('Attach with gdb, then press Enter: ')def random_floats(n):    r = []    for x in xrange(n):        r.append(float(random.randint(-32768, 32768)))    return tuple(r)def reference_dec_filter(src_data, decim, taps):    fg = gr.flow_graph()    src = gr.vector_source_f(src_data)    op = gr.fir_filter_fff(decim, taps)    dst = gr.vector_sink_f()    fg.connect(src, op, dst)    fg.run()    result_data = dst.data()    fg = None    return result_datadef reference_interp_filter(src_data, interp, taps):    fg = gr.flow_graph()    src = gr.vector_source_f(src_data)    op = gr.interp_fir_filter_fff(interp, taps)    dst = gr.vector_sink_f()    fg.connect(src, op, dst)    fg.run()    result_data = dst.data()    fg = None    return result_datadef reference_interp_dec_filter(src_data, interp, decim, taps):    fg = gr.flow_graph()    src = gr.vector_source_f(src_data)    up = gr.interp_fir_filter_fff(interp, (1,))    dn = gr.fir_filter_fff(decim, taps)    dst = gr.vector_sink_f()    fg.connect(src, up, dn, dst)    fg.run()    result_data = dst.data()    fg = None    return result_data    class test_rational_resampler (gr_unittest.TestCase):    def setUp(self):        self.fg = gr.flow_graph()    def tearDown(self):        self.fg = None    #    # test the gr.rational_resampler_base primitives...    #        def test_000_1_to_1(self):        taps = (-4, 5)        src_data = (234,  -4,  23,  -56,  45,    98,  -23,  -7)        xr = (-936, 1186, -112, 339, -460, -167, 582)        expected_result = tuple([float(x) for x in xr])        src = gr.vector_source_f(src_data)        op = gr.rational_resampler_base_fff(1, 1, taps)        dst = gr.vector_sink_f()        self.fg.connect(src, op)        self.fg.connect(op, dst)        self.fg.run()        result_data = dst.data()        self.assertEqual(expected_result, result_data)            def test_001_interp(self):        taps = [1, 10, 100, 1000, 10000]        src_data = (0, 2, 3, 5, 7, 11, 13, 17)        interpolation = 3        xr = (0,0,0,0,2,20,200,2003,20030,300,3005,30050,500,5007,50070,700,7011,70110,1100,11013,110130,1300,13017,130170,1700.0,17000.0,170000.0)        expected_result = tuple([float(x) for x in xr])        src = gr.vector_source_f(src_data)        op = gr.rational_resampler_base_fff(interpolation, 1, taps)        dst = gr.vector_sink_f()        self.fg.connect(src, op)        self.fg.connect(op, dst)        self.fg.run()        result_data = dst.data()        self.assertEqual(expected_result, result_data)    def test_002_interp(self):                  taps = random_floats(31)        #src_data = random_floats(10000)  # FIXME the 10k case fails!        src_data = random_floats(1000)        interpolation = 3        expected_result = reference_interp_filter(src_data, interpolation, taps)        src = gr.vector_source_f(src_data)        op = gr.rational_resampler_base_fff(interpolation, 1, taps)        dst = gr.vector_sink_f()        self.fg.connect(src, op)        self.fg.connect(op, dst)        self.fg.run()        result_data = dst.data()        L1 = len(result_data)        L2 = len(expected_result)        L = min(L1, L2)        if False:            sys.stderr.write('delta = %2d: ntaps = %d interp = %d ilen = %d\n' %                             (L2 - L1, len(taps), interpolation, len(src_data)))            sys.stderr.write('  len(result_data) = %d  len(expected_result) = %d\n' %                             (len(result_data), len(expected_result)))        #self.assertEqual(expected_result[0:L], result_data[0:L])        # FIXME check first 3 answers        self.assertEqual(expected_result[3:L], result_data[3:L])    def test_003_interp(self):        taps = random_floats(31)        src_data = random_floats(10000)        decimation = 3        expected_result = reference_dec_filter(src_data, decimation, taps)        src = gr.vector_source_f(src_data)        op = gr.rational_resampler_base_fff(1, decimation, taps)        dst = gr.vector_sink_f()        self.fg.connect(src, op)        self.fg.connect(op, dst)        self.fg.run()        result_data = dst.data()        L1 = len(result_data)        L2 = len(expected_result)        L = min(L1, L2)        if False:            sys.stderr.write('delta = %2d: ntaps = %d decim = %d ilen = %d\n' %                             (L2 - L1, len(taps), decimation, len(src_data)))            sys.stderr.write('  len(result_data) = %d  len(expected_result) = %d\n' %                             (len(result_data), len(expected_result)))        self.assertEqual(expected_result[0:L], result_data[0:L])    # FIXME disabled.  Triggers hang on SuSE 10.0    def xtest_004_decim_random_vals(self):        MAX_TAPS = 9        MAX_DECIM = 7        OUTPUT_LEN = 9        random.seed(0)    # we want reproducibility        for ntaps in xrange(1, MAX_TAPS + 1):            for decim in xrange(1, MAX_DECIM+1):                for ilen in xrange(ntaps + decim, ntaps + OUTPUT_LEN*decim):                    src_data = random_floats(ilen)                    taps = random_floats(ntaps)                    expected_result = reference_dec_filter(src_data, decim, taps)                    fg = gr.flow_graph()                    src = gr.vector_source_f(src_data)                    op = gr.rational_resampler_base_fff(1, decim, taps)                    dst = gr.vector_sink_f()                    fg.connect(src, op, dst)                    fg.run()                    fg = None                    result_data = dst.data()                    L1 = len(result_data)                    L2 = len(expected_result)                    L = min(L1, L2)                    if False:                        sys.stderr.write('delta = %2d: ntaps = %d decim = %d ilen = %d\n' % (L2 - L1, ntaps, decim, ilen))                        sys.stderr.write('  len(result_data) = %d  len(expected_result) = %d\n' %                                         (len(result_data), len(expected_result)))                    self.assertEqual(expected_result[0:L], result_data[0:L])    # FIXME disabled.  Triggers hang on SuSE 10.0    def xtest_005_interp_random_vals(self):        MAX_TAPS = 9        MAX_INTERP = 7        INPUT_LEN = 9        random.seed(0)    # we want reproducibility        for ntaps in xrange(1, MAX_TAPS + 1):            for interp in xrange(1, MAX_INTERP+1):                for ilen in xrange(ntaps, ntaps + INPUT_LEN):                    src_data = random_floats(ilen)                    taps = random_floats(ntaps)                    expected_result = reference_interp_filter(src_data, interp, taps)                    fg = gr.flow_graph()                    src = gr.vector_source_f(src_data)                    op = gr.rational_resampler_base_fff(interp, 1, taps)                    dst = gr.vector_sink_f()                    fg.connect(src, op, dst)                    fg.run()                    fg = None                    result_data = dst.data()                    L1 = len(result_data)                    L2 = len(expected_result)                    L = min(L1, L2)                    #if True or abs(L1-L2) > 1:                    if False:                        sys.stderr.write('delta = %2d: ntaps = %d interp = %d ilen = %d\n' % (L2 - L1, ntaps, interp, ilen))                        #sys.stderr.write('  len(result_data) = %d  len(expected_result) = %d\n' %                        #                 (len(result_data), len(expected_result)))                    #self.assertEqual(expected_result[0:L], result_data[0:L])                    # FIXME check first ntaps+1 answers                    self.assertEqual(expected_result[ntaps+1:L], result_data[ntaps+1:L])    def test_006_interp_decim(self):        taps = (0,1,0,0)        src_data = range(10000)        interp = 3        decimation = 2        expected_result = reference_interp_dec_filter(src_data, interp, decimation, taps)        src = gr.vector_source_f(src_data)        op = gr.rational_resampler_base_fff(interp, decimation, taps)        dst = gr.vector_sink_f()        self.fg.connect(src, op)        self.fg.connect(op, dst)        self.fg.run()        result_data = dst.data()        L1 = len(result_data)        L2 = len(expected_result)        L = min(L1, L2)        if False:            sys.stderr.write('delta = %2d: ntaps = %d decim = %d ilen = %d\n' %                             (L2 - L1, len(taps), decimation, len(src_data)))            sys.stderr.write('  len(result_data) = %d  len(expected_result) = %d\n' %                             (len(result_data), len(expected_result)))        self.assertEqual(expected_result[1:L], result_data[1:L])    #    # test the blks.rational_resampler_??? primitives...    #    def test_101_interp(self):        taps = [1, 10, 100, 1000, 10000]        src_data = (0, 2, 3, 5, 7, 11, 13, 17)        interpolation = 3        xr = (0,0,0,0,2,20,200,2003,20030,300,3005,30050,500,5007,50070,700,7011,70110,1100,11013,110130,1300,13017,130170,1700.0,17000.0,170000.0)        expected_result = tuple([float(x) for x in xr])        src = gr.vector_source_f(src_data)        op = blks.rational_resampler_fff(self.fg, interpolation, 1, taps=taps)        dst = gr.vector_sink_f()        self.fg.connect(src, op)        self.fg.connect(op, dst)        self.fg.run()        result_data = dst.data()        self.assertEqual(expected_result, result_data)if __name__ == '__main__':    gr_unittest.main()        

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -