summaryrefslogtreecommitdiff
path: root/gr-digital/python/digital/qa_constellation.py
diff options
context:
space:
mode:
Diffstat (limited to 'gr-digital/python/digital/qa_constellation.py')
-rw-r--r--gr-digital/python/digital/qa_constellation.py82
1 files changed, 81 insertions, 1 deletions
diff --git a/gr-digital/python/digital/qa_constellation.py b/gr-digital/python/digital/qa_constellation.py
index 83a875af4b..00248f4f09 100644
--- a/gr-digital/python/digital/qa_constellation.py
+++ b/gr-digital/python/digital/qa_constellation.py
@@ -21,7 +21,7 @@
#
import random
-from cmath import exp, pi, log
+from cmath import exp, pi, log, sqrt
from gnuradio import gr, gr_unittest, digital, blocks
from gnuradio.digital.utils import mod_codes
@@ -185,6 +185,86 @@ class test_constellation(gr_unittest.TestCase):
first = constellation.bits_per_symbol()
self.assertEqual(self.src_data[first:len(data)], data[first:])
+ def test_soft_qpsk_gen(self):
+ prec = 8
+ constel, code = digital.psk_4_0()
+
+ rot_sym = 1
+ side = 2
+ width = 2
+ c = digital.constellation_rect(constel, code, rot_sym,
+ side, side, width, width)
+
+ # Get max energy/symbol in constellation
+ constel = c.points()
+ Es = max([abs(constel_i) for constel_i in constel])
+
+ table = digital.soft_dec_table_generator(digital.sd_psk_4_0, prec, Es)
+ c.set_soft_dec_lut(table, prec)
+
+ x = sqrt(2.0)/2.0
+ step = (x.real+x.real) / (2**prec - 1)
+ samples = [ -x-x*1j, -x+x*1j,
+ x+x*1j, x-x*1j,
+ (-x+128*step)+(-x+128*step)*1j,
+ (-x+64*step) +(-x+64*step)*1j, (-x+64*step) +(-x+192*step)*1j,
+ (-x+192*step)+(-x+192*step)*1j, (-x+192*step)+(-x+64*step)*1j,]
+
+ y_python_raw_calc = []
+ y_python_gen_calc = []
+ y_python_table = []
+ y_cpp_raw_calc = []
+ y_cpp_table = []
+ for sample in samples:
+ y_python_raw_calc += digital.calc_soft_dec(sample, constel, code)
+ y_python_gen_calc += digital.sd_psk_4_0(sample, Es)
+ y_python_table += digital.calc_soft_dec_from_table(sample, table, prec, Es)
+
+ y_cpp_raw_calc += c.calc_soft_dec(sample)
+ y_cpp_table += c.soft_decision_maker(sample)
+
+ self.assertFloatTuplesAlmostEqual(y_python_raw_calc, y_python_gen_calc, 4)
+ self.assertFloatTuplesAlmostEqual(y_python_raw_calc, y_python_table, 2)
+ self.assertFloatTuplesAlmostEqual(y_cpp_raw_calc, y_cpp_table, 4)
+
+ def test_soft_qpsk_calc(self):
+ prec = 8
+ constel, code = digital.psk_4_0()
+
+ rot_sym = 1
+ side = 2
+ width = 2
+ c = digital.constellation_rect(constel, code, rot_sym,
+ side, side, width, width)
+
+ # Get max energy/symbol in constellation
+ constel = c.points()
+ Es = max([abs(constel_i) for constel_i in constel])
+
+ table = digital.soft_dec_table(constel, code, prec)
+ c.gen_soft_dec_lut(prec)
+
+ x = sqrt(2.0)/2.0
+ step = (x.real+x.real) / (2**prec - 1)
+ samples = [ -x-x*1j, -x+x*1j,
+ x+x*1j, x-x*1j,
+ (-x+128*step)+(-x+128*step)*1j,
+ (-x+64*step) +(-x+64*step)*1j, (-x+64*step) +(-x+192*step)*1j,
+ (-x+192*step)+(-x+192*step)*1j, (-x+192*step)+(-x+64*step)*1j,]
+
+ y_python_raw_calc = []
+ y_python_table = []
+ y_cpp_raw_calc = []
+ y_cpp_table = []
+ for sample in samples:
+ y_python_raw_calc += digital.calc_soft_dec(sample, constel, code)
+ y_python_table += digital.calc_soft_dec_from_table(sample, table, prec, Es)
+
+ y_cpp_raw_calc += c.calc_soft_dec(sample)
+ y_cpp_table += c.soft_decision_maker(sample)
+
+ self.assertFloatTuplesAlmostEqual(y_python_raw_calc, y_python_table, 4)
+ self.assertFloatTuplesAlmostEqual(y_cpp_raw_calc, y_cpp_table, 4)
class mod_demod(gr.hier_block2):
def __init__(self, constellation, differential, rotation):