diff options
author | Josh Morman <jmorman@perspectalabs.com> | 2021-03-25 16:27:51 -0400 |
---|---|---|
committer | mormj <34754695+mormj@users.noreply.github.com> | 2021-04-21 14:02:57 -0400 |
commit | 31c4a701e6b6fdf84bb1385663a0b707dd40a766 (patch) | |
tree | 83eb4b33816faeb138877c86314a1c097b6e375c /gr-digital/python/digital | |
parent | cfee2be5e63eef28a1835e6039ec4511d4500d88 (diff) |
digital: fix qa for equalizers
Signed-off-by: Josh Morman <jmorman@perspectalabs.com>
Diffstat (limited to 'gr-digital/python/digital')
-rw-r--r-- | gr-digital/python/digital/qa_cma_equalizer.py | 42 | ||||
-rwxr-xr-x | gr-digital/python/digital/qa_decision_feedback_equalizer.py | 41 | ||||
-rwxr-xr-x | gr-digital/python/digital/qa_linear_equalizer.py | 36 | ||||
-rw-r--r-- | gr-digital/python/digital/qa_lms_equalizer.py | 45 |
4 files changed, 59 insertions, 105 deletions
diff --git a/gr-digital/python/digital/qa_cma_equalizer.py b/gr-digital/python/digital/qa_cma_equalizer.py deleted file mode 100644 index f6da3d1b70..0000000000 --- a/gr-digital/python/digital/qa_cma_equalizer.py +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2006,2007,2010,2011,2013 Free Software Foundation, Inc. -# -# This file is part of GNU Radio -# -# SPDX-License-Identifier: GPL-3.0-or-later -# -# - - -from gnuradio import gr, gr_unittest, digital, blocks - - -class test_cma_equalizer_fir(gr_unittest.TestCase): - - def setUp(self): - self.tb = gr.top_block() - - def tearDown(self): - self.tb = None - - def transform(self, src_data): - SRC = blocks.vector_source_c(src_data, False) - EQU = digital.cma_equalizer_cc(4, 1.0, .001, 1) - DST = blocks.vector_sink_c() - self.tb.connect(SRC, EQU, DST) - self.tb.run() - return DST.data() - - def test_001_identity(self): - # Constant modulus signal so no adjustments - src_data = (1 + 0j, 0 + 1j, -1 + 0j, 0 - 1j) * 1000 - expected_data = src_data - result = self.transform(src_data) - - N = -500 - self.assertComplexTuplesAlmostEqual(expected_data[N:], result[N:]) - - -if __name__ == "__main__": - gr_unittest.run(test_cma_equalizer_fir) diff --git a/gr-digital/python/digital/qa_decision_feedback_equalizer.py b/gr-digital/python/digital/qa_decision_feedback_equalizer.py index 1249df46a1..1d4587a6f0 100755 --- a/gr-digital/python/digital/qa_decision_feedback_equalizer.py +++ b/gr-digital/python/digital/qa_decision_feedback_equalizer.py @@ -15,7 +15,7 @@ import numpy from gnuradio import digital, blocks, channels -class qa_linear_equalizer(gr_unittest.TestCase): +class qa_decision_feedback_equalizer(gr_unittest.TestCase): def unpack_values(self, values_in, bits_per_value, bits_per_symbol): # verify that 8 is divisible by bits_per_symbol @@ -108,22 +108,43 @@ class qa_linear_equalizer(gr_unittest.TestCase): def tearDown(self): self.tb = None - def transform(self, src_data, gain, const): - SRC = blocks.vector_source_c(src_data, False) - EQU = digital.lms_dd_equalizer_cc(4, gain, 1, const.base()) - DST = blocks.vector_sink_c() - self.tb.connect(SRC, EQU, DST) + def transform(self, src_data, const, alg): + src = blocks.vector_source_c(src_data, False) + + leq = digital.decision_feedback_equalizer( + 2, + 1, + 1, + alg, + True, + [], + '') + dst = blocks.vector_sink_c() + self.tb.connect(src, leq, dst) self.tb.run() - return DST.data() + return dst.data() + + def test_001_identity_lms(self): + # Constant modulus signal so no adjustments + const = digital.constellation_qpsk() + src_data = const.points() * 1000 + alg = digital.adaptive_algorithm_lms(const, .1).base() + N = 100 # settling time + expected_data = src_data[N:] + result = self.transform(src_data, const, alg)[N:] + + N = -500 + self.assertComplexTuplesAlmostEqual(expected_data[N:], result[N:], 5) - def test_001_identity(self): + def test_002_identity_cma(self): # Constant modulus signal so no adjustments const = digital.constellation_qpsk() src_data = const.points() * 1000 + alg = digital.adaptive_algorithm_cma(const, .001, 4).base() N = 100 # settling time expected_data = src_data[N:] - result = self.transform(src_data, 0.1, const)[N:] + result = self.transform(src_data, const, alg)[N:] N = -500 self.assertComplexTuplesAlmostEqual(expected_data[N:], result[N:], 5) @@ -223,4 +244,4 @@ class qa_linear_equalizer(gr_unittest.TestCase): if __name__ == '__main__': - gr_unittest.run(qa_linear_equalizer) + gr_unittest.run(qa_decision_feedback_equalizer) diff --git a/gr-digital/python/digital/qa_linear_equalizer.py b/gr-digital/python/digital/qa_linear_equalizer.py index 1ad3c3bece..64fd84d2f3 100755 --- a/gr-digital/python/digital/qa_linear_equalizer.py +++ b/gr-digital/python/digital/qa_linear_equalizer.py @@ -105,22 +105,42 @@ class qa_linear_equalizer(gr_unittest.TestCase): def tearDown(self): self.tb = None - def transform(self, src_data, gain, const): - SRC = blocks.vector_source_c(src_data, False) - EQU = digital.lms_dd_equalizer_cc(4, gain, 1, const.base()) - DST = blocks.vector_sink_c() - self.tb.connect(SRC, EQU, DST) + def transform(self, src_data, const, alg): + src = blocks.vector_source_c(src_data, False) + leq = digital.linear_equalizer( + 4, + 1, + alg, + True, + [], + '') + dst = blocks.vector_sink_c() + self.tb.connect(src, leq, dst) self.tb.run() - return DST.data() + return dst.data() + + def test_001_identity_lms(self): + # Constant modulus signal so no adjustments + const = digital.constellation_qpsk() + src_data = const.points() * 1000 + alg = digital.adaptive_algorithm_lms(const, .1).base() + + N = 100 # settling time + expected_data = src_data[N:] + result = self.transform(src_data, const, alg)[N:] + + N = -500 + self.assertComplexTuplesAlmostEqual(expected_data[N:], result[N:], 5) - def test_001_identity(self): + def test_002_identity_cma(self): # Constant modulus signal so no adjustments const = digital.constellation_qpsk() src_data = const.points() * 1000 + alg = digital.adaptive_algorithm_cma(const, .001, 4).base() N = 100 # settling time expected_data = src_data[N:] - result = self.transform(src_data, 0.1, const)[N:] + result = self.transform(src_data, const, alg)[N:] N = -500 self.assertComplexTuplesAlmostEqual(expected_data[N:], result[N:], 5) diff --git a/gr-digital/python/digital/qa_lms_equalizer.py b/gr-digital/python/digital/qa_lms_equalizer.py deleted file mode 100644 index 23e3c6f28f..0000000000 --- a/gr-digital/python/digital/qa_lms_equalizer.py +++ /dev/null @@ -1,45 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2006,2007,2010,2011,2013 Free Software Foundation, Inc. -# -# This file is part of GNU Radio -# -# SPDX-License-Identifier: GPL-3.0-or-later -# -# - - -from gnuradio import gr, gr_unittest, digital, blocks - - -class test_lms_dd_equalizer(gr_unittest.TestCase): - - def setUp(self): - self.tb = gr.top_block() - - def tearDown(self): - self.tb = None - - def transform(self, src_data, gain, const): - SRC = blocks.vector_source_c(src_data, False) - EQU = digital.lms_dd_equalizer_cc(4, gain, 1, const.base()) - DST = blocks.vector_sink_c() - self.tb.connect(SRC, EQU, DST) - self.tb.run() - return DST.data() - - def test_001_identity(self): - # Constant modulus signal so no adjustments - const = digital.constellation_qpsk() - src_data = const.points() * 1000 - - N = 100 # settling time - expected_data = src_data[N:] - result = self.transform(src_data, 0.1, const)[N:] - - N = -500 - self.assertComplexTuplesAlmostEqual(expected_data[N:], result[N:], 5) - - -if __name__ == "__main__": - gr_unittest.run(test_lms_dd_equalizer) |