From 0ccec373b3d68825d02b4494b3e2c90bda86a471 Mon Sep 17 00:00:00 2001 From: Vasil Velichkov Date: Thu, 3 May 2018 05:05:43 +0300 Subject: Add tests for the TCH/F and TCH/H Demappers --- python/CMakeLists.txt | 2 + python/qa_tch_f_chans_demapper.py | 154 ++++++++++++++++++++++++++++ python/qa_tch_h_chans_demapper.py | 209 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 365 insertions(+) create mode 100755 python/qa_tch_f_chans_demapper.py create mode 100755 python/qa_tch_h_chans_demapper.py diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 418605e..22c88a9 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -58,6 +58,8 @@ GR_ADD_TEST(qa_burst_sdcch_subslot_filter ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_S GR_ADD_TEST(qa_burst_fnr_filter ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_burst_fnr_filter.py) GR_ADD_TEST(qa_dummy_burst_filter ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_dummy_burst_filter.py) GR_ADD_TEST(qa_tch_f_decoder ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_tch_f_decoder.py) +GR_ADD_TEST(qa_tch_f_chans_demapper ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_tch_f_chans_demapper.py) +GR_ADD_TEST(qa_tch_h_chans_demapper ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_tch_h_chans_demapper.py) #GR_ADD_TEST(qa_msg_to_tag ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_msg_to_tag.py) #GR_ADD_TEST(qa_controlled_fractional_resampler_cc ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_controlled_fractional_resampler_cc.py) #GR_ADD_TEST(qa_uplink_downlink_splitter ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_uplink_downlink_splitter.py) diff --git a/python/qa_tch_f_chans_demapper.py b/python/qa_tch_f_chans_demapper.py new file mode 100755 index 0000000..6643653 --- /dev/null +++ b/python/qa_tch_f_chans_demapper.py @@ -0,0 +1,154 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# @file +# @author (C) 2018 by Vasil Velichkov +# @section LICENSE +# +# Gr-gsm 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. +# +# Gr-gsm 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 gr-gsm; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# +# + +import numpy as np +from gnuradio import gr, gr_unittest, blocks +import grgsm_swig as grgsm +import pmt + +class qa_tch_f_chans_demapper (gr_unittest.TestCase): + + def setUp (self): + self.tb = gr.top_block () + + self.bursts = [ + "1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"] + + def tearDown (self): + self.tb = None + + def test_fr_demapper (self): + """ + TCH/F Full Rate demapper + """ + frames = [ + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29] + timeslots = [ + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3 + ] + b = self.bursts + bursts = [ + b[ 0], b[ 1], b[ 2], b[ 3], b[ 4], b[ 5], b[ 6], b[ 7], + b[ 8], b[ 9], b[10], b[11], b[12], #12 - sacch + b[13], b[14], b[15], b[16], b[17], b[18], b[19], b[20], + b[21], b[22], b[23], b[24], b[25], #25 - idle + b[26], b[27], b[28], b[29], b[30] + ] + + src = grgsm.burst_source(frames, timeslots, bursts) + demapper = grgsm.tch_f_chans_demapper(3) + tch = grgsm.burst_sink() + acch = grgsm.burst_sink() + + self.tb.msg_connect(src, "out", demapper, "bursts") + self.tb.msg_connect(demapper, "tch_bursts", tch, "in") + self.tb.msg_connect(demapper, "acch_bursts", acch, "in") + + self.tb.run () + + self.assertEqual([ + b[ 0], b[ 1], b[ 2], b[ 3], b[ 4], b[ 5], b[ 6], b[ 7], + b[ 4], b[ 5], b[ 6], b[ 7], b[ 8], b[ 9], b[10], b[11], + b[ 8], b[ 9], b[10], b[11], + b[13], b[14], b[15], b[16], + b[13], b[14], b[15], b[16], b[17], b[18], b[19], b[20], + b[17], b[18], b[19], b[20], b[21], b[22], b[23], b[24], + b[21], b[22], b[23], b[24], + b[26], b[27], b[28], b[29], + ], list(tch.get_burst_data())) + + self.assertEqual([], list(acch.get_burst_data())) + + def sacch_fr_test (self, ts, frames, bursts): + timeslots = [ts, ts, ts, ts, ts, ts, ts, ts] + + src = grgsm.burst_source(frames, timeslots, bursts) + demapper = grgsm.tch_f_chans_demapper(ts) + tch = grgsm.burst_sink() + acch = grgsm.burst_sink() + + self.tb.msg_connect(src, "out", demapper, "bursts") + self.tb.msg_connect(demapper, "tch_bursts", tch, "in") + self.tb.msg_connect(demapper, "acch_bursts", acch, "in") + + self.tb.run () + + self.assertEqual([], list(tch.get_burst_data())) + + return list(acch.get_burst_data()) + + def test_sacch_tf (self): + """ + SACCH/TF tests + """ + b = self.bursts + bursts=[b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7]] + even = [b[0], b[2], b[4], b[6]] + odd = [b[1], b[3], b[5], b[7]] + self.assertEqual(even, self.sacch_fr_test(ts=0, frames=[12, 25, 38, 51, 64, 77, 90, 103], bursts=bursts)) + self.assertEqual(odd, self.sacch_fr_test(ts=1, frames=[12, 25, 38, 51, 64, 77, 90, 103], bursts=bursts)) + self.assertEqual(even, self.sacch_fr_test(ts=2, frames=[38, 51, 64, 77, 90, 103, 116, 129], bursts=bursts)) + self.assertEqual(odd, self.sacch_fr_test(ts=3, frames=[38, 51, 64, 77, 90, 103, 116, 129], bursts=bursts)) + self.assertEqual(even, self.sacch_fr_test(ts=4, frames=[64, 77, 90, 103, 116, 129, 142, 155], bursts=bursts)) + self.assertEqual(odd, self.sacch_fr_test(ts=5, frames=[64, 77, 90, 103, 116, 129, 142, 155], bursts=bursts)) + self.assertEqual(even, self.sacch_fr_test(ts=6, frames=[90, 103, 116, 129, 142, 155, 168, 181], bursts=bursts)) + self.assertEqual(odd, self.sacch_fr_test(ts=7, frames=[90, 103, 116, 129, 142, 155, 168, 181], bursts=bursts)) + +if __name__ == '__main__': + gr_unittest.run(qa_tch_f_chans_demapper, "qa_tch_f_chans_demapper.xml") diff --git a/python/qa_tch_h_chans_demapper.py b/python/qa_tch_h_chans_demapper.py new file mode 100755 index 0000000..4348f98 --- /dev/null +++ b/python/qa_tch_h_chans_demapper.py @@ -0,0 +1,209 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# @file +# @author (C) 2018 by Vasil Velichkov +# @section LICENSE +# +# Gr-gsm 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. +# +# Gr-gsm 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 gr-gsm; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# +# + +import numpy as np +from gnuradio import gr, gr_unittest, blocks +import grgsm_swig as grgsm +import pmt + +class qa_tch_h_chans_demapper (gr_unittest.TestCase): + + def setUp (self): + self.tb = gr.top_block () + + self.bursts = [ + "1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"] + + def tearDown (self): + self.tb = None + + def test_hr_demapper_sub0 (self): + """ + TCH/F Half Rate demapper sub-channel 0 + """ + frames = [ + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29] + timeslots = [ + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3 + ] + b = self.bursts + bursts = [ + b[ 0], b[ 1], b[ 2], b[ 3], b[ 4], b[ 5], b[ 6], b[ 7], + b[ 8], b[ 9], b[10], b[11], b[12], #12 - sacch + b[13], b[14], b[15], b[16], b[17], b[18], b[19], b[20], + b[21], b[22], b[23], b[24], b[25], #25 - idle + b[26], b[27], b[28], b[29], b[30] + ] + + src = grgsm.burst_source(frames, timeslots, bursts) + demapper = grgsm.tch_h_chans_demapper(3, 0) + tch = grgsm.burst_sink() + acch = grgsm.burst_sink() + + self.tb.msg_connect(src, "out", demapper, "bursts") + self.tb.msg_connect(demapper, "tch_bursts", tch, "in") + self.tb.msg_connect(demapper, "acch_bursts", acch, "in") + + self.tb.run () + + self.assertEqual([ + b[ 0], b[ 2], b[ 4], b[ 6], + b[ 4], b[ 6], b[ 8], b[10], + b[ 8], b[10], + b[13], b[15], + b[13], b[15], b[17], b[19], + b[17], b[19], b[21], b[23], + b[21], b[23], + b[26], b[28], + ], list(tch.get_burst_data())) + + self.assertEqual([], list(acch.get_burst_data())) + + def test_hr_demapper_sub1 (self): + """ + TCH/F Half Rate demapper sub-channel 1 + """ + frames = [ + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29] + timeslots = [ + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3 + ] + b = self.bursts + bursts = [ + b[ 0], b[ 1], b[ 2], b[ 3], b[ 4], b[ 5], b[ 6], b[ 7], + b[ 8], b[ 9], b[10], b[11], b[12], #12 - sacch + b[13], b[14], b[15], b[16], b[17], b[18], b[19], b[20], + b[21], b[22], b[23], b[24], b[25], #25 - idle + b[26], b[27], b[28], b[29], b[30] + ] + src = grgsm.burst_source(frames, timeslots, bursts) + demapper = grgsm.tch_h_chans_demapper(3, 1) + tch = grgsm.burst_sink() + acch = grgsm.burst_sink() + + self.tb.msg_connect(src, "out", demapper, "bursts") + self.tb.msg_connect(demapper, "tch_bursts", tch, "in") + self.tb.msg_connect(demapper, "acch_bursts", acch, "in") + + self.tb.run () + + self.assertEqual([ + b[ 1], b[ 3], b[ 5], b[ 7], + b[ 5], b[ 7], b[ 9], b[11], + b[ 9], b[11], + b[14], b[16], + b[14], b[16], b[18], b[20], + b[18], b[20], b[22], b[24], + b[22], b[24], + b[27], b[29], + ], list(tch.get_burst_data())) + + self.assertEqual([], list(acch.get_burst_data())) + + def sacch_hr_test (self, ts, sub, frames, bursts): + timeslots = [ts, ts, ts, ts, ts, ts, ts, ts] + + src = grgsm.burst_source(frames, timeslots, bursts) + demapper = grgsm.tch_h_chans_demapper(ts, sub) + tch = grgsm.burst_sink() + acch = grgsm.burst_sink() + + self.tb.msg_connect(src, "out", demapper, "bursts") + self.tb.msg_connect(demapper, "tch_bursts", tch, "in") + self.tb.msg_connect(demapper, "acch_bursts", acch, "in") + + self.tb.run () + + self.assertEqual([], list(tch.get_burst_data())) + + return list(acch.get_burst_data()) + + def test_sacch_th (self): + """ + SACCH/TH tests + """ + b = self.bursts + bursts=[b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7]] + even = [b[0], b[2], b[4], b[6]] + odd = [b[1], b[3], b[5], b[7]] + self.assertEqual(even, self.sacch_hr_test(ts=0, sub=0, frames=[12, 25, 38, 51, 64, 77, 90, 103], bursts=bursts)) + self.assertEqual(odd, self.sacch_hr_test(ts=0, sub=1, frames=[12, 25, 38, 51, 64, 77, 90, 103], bursts=bursts)) + self.assertEqual(even, self.sacch_hr_test(ts=1, sub=0, frames=[12, 25, 38, 51, 64, 77, 90, 103], bursts=bursts)) + self.assertEqual(odd, self.sacch_hr_test(ts=1, sub=1, frames=[12, 25, 38, 51, 64, 77, 90, 103], bursts=bursts)) + self.assertEqual(even, self.sacch_hr_test(ts=2, sub=0, frames=[38, 51, 64, 77, 90, 103, 116, 129], bursts=bursts)) + self.assertEqual(odd, self.sacch_hr_test(ts=2, sub=1, frames=[38, 51, 64, 77, 90, 103, 116, 129], bursts=bursts)) + self.assertEqual(even, self.sacch_hr_test(ts=3, sub=0, frames=[38, 51, 64, 77, 90, 103, 116, 129], bursts=bursts)) + self.assertEqual(odd, self.sacch_hr_test(ts=3, sub=1, frames=[38, 51, 64, 77, 90, 103, 116, 129], bursts=bursts)) + self.assertEqual(even, self.sacch_hr_test(ts=4, sub=0, frames=[64, 77, 90, 103, 116, 129, 142, 155], bursts=bursts)) + self.assertEqual(odd, self.sacch_hr_test(ts=4, sub=1, frames=[64, 77, 90, 103, 116, 129, 142, 155], bursts=bursts)) + self.assertEqual(even, self.sacch_hr_test(ts=5, sub=0, frames=[64, 77, 90, 103, 116, 129, 142, 155], bursts=bursts)) + self.assertEqual(odd, self.sacch_hr_test(ts=5, sub=1, frames=[64, 77, 90, 103, 116, 129, 142, 155], bursts=bursts)) + self.assertEqual(even, self.sacch_hr_test(ts=6, sub=0, frames=[90, 103, 116, 129, 142, 155, 168, 181], bursts=bursts)) + self.assertEqual(odd, self.sacch_hr_test(ts=6, sub=1, frames=[90, 103, 116, 129, 142, 155, 168, 181], bursts=bursts)) + self.assertEqual(even, self.sacch_hr_test(ts=7, sub=0, frames=[90, 103, 116, 129, 142, 155, 168, 181], bursts=bursts)) + self.assertEqual(odd, self.sacch_hr_test(ts=7, sub=1, frames=[90, 103, 116, 129, 142, 155, 168, 181], bursts=bursts)) + +if __name__ == '__main__': + gr_unittest.run(qa_tch_h_chans_demapper, "qa_tch_h_chans_demapper.xml") -- cgit v1.2.3