diff options
Diffstat (limited to 'gr-digital/python/qpsk.py')
-rw-r--r-- | gr-digital/python/qpsk.py | 91 |
1 files changed, 44 insertions, 47 deletions
diff --git a/gr-digital/python/qpsk.py b/gr-digital/python/qpsk.py index be21fd76f1..2fdeabd40f 100644 --- a/gr-digital/python/qpsk.py +++ b/gr-digital/python/qpsk.py @@ -27,21 +27,20 @@ Demodulation is not included since the generic_mod_demod from gnuradio import gr from gnuradio.digital.generic_mod_demod import generic_mod, generic_demod +from utils import mod_codes import digital_swig import modulation_utils -# Default number of points in constellation. -_def_constellation_points = 4 -# Whether gray coding is used. -_def_gray_coded = True +# The default encoding (e.g. gray-code, set-partition) +_def_mod_code = mod_codes.GRAY_CODE # ///////////////////////////////////////////////////////////////////////////// # QPSK constellation # ///////////////////////////////////////////////////////////////////////////// -def qpsk_constellation(m=_def_constellation_points): - if m != _def_constellation_points: - raise ValueError("QPSK can only have 4 constellation points.") +def qpsk_constellation(mod_code=_def_mod_code): + if mod_code != mod_codes.GRAY_CODE: + raise ValueError("This QPSK mod/demod works only for gray-coded constellations.") return digital_swig.constellation_qpsk() # ///////////////////////////////////////////////////////////////////////////// @@ -50,9 +49,7 @@ def qpsk_constellation(m=_def_constellation_points): class qpsk_mod(generic_mod): - def __init__(self, constellation_points=_def_constellation_points, - gray_coded=_def_gray_coded, - *args, **kwargs): + def __init__(self, mod_code=_def_mod_code, differential=False, *args, **kwargs): """ Hierarchical block for RRC-filtered QPSK modulation. @@ -62,15 +59,21 @@ class qpsk_mod(generic_mod): See generic_mod block for list of parameters. """ - - constellation_points = _def_constellation_points - constellation = digital_swig.constellation_qpsk() - if constellation_points != 4: - raise ValueError("QPSK can only have 4 constellation points.") - if not gray_coded: - raise ValueError("This QPSK mod/demod works only for gray-coded constellations.") + + pre_diff_code = True + if not differential: + constellation = digital_swig.constellation_qpsk() + if mod_code != mod_codes.GRAY_CODE: + raise ValueError("This QPSK mod/demod works only for gray-coded constellations.") + else: + constellation = digital_swig.constellation_dqpsk() + if mod_code not in (mod_codes.GRAY_CODE or mod_codes.NO_CODE): + raise ValueError("That mod_code is not supported for DQPSK mod/demod.") + if mod_code == mod_codes.NO_CODE: + pre_diff_code = False + super(qpsk_mod, self).__init__(constellation=constellation, - gray_coded=gray_coded, + pre_diff_code=pre_diff_code, *args, **kwargs) @@ -81,7 +84,7 @@ class qpsk_mod(generic_mod): class qpsk_demod(generic_demod): - def __init__(self, constellation_points=_def_constellation_points, + def __init__(self, mod_code=_def_mod_code, differential=False, *args, **kwargs): """ @@ -93,11 +96,20 @@ class qpsk_demod(generic_demod): See generic_demod block for list of parameters. """ - constellation_points = _def_constellation_points - constellation = digital_swig.constellation_qpsk() - if constellation_points != 4: - raise ValueError('Number of constellation points must be 4 for QPSK.') + pre_diff_code = True + if not differential: + constellation = digital_swig.constellation_qpsk() + if mod_code != mod_codes.GRAY_CODE: + raise ValueError("This QPSK mod/demod works only for gray-coded constellations.") + else: + constellation = digital_swig.constellation_dqpsk() + if mod_code not in (mod_codes.GRAY_CODE or mod_codes.NO_CODE): + raise ValueError("That mod_code is not supported for DQPSK mod/demod.") + if mod_code == mod_codes.NO_CODE: + pre_diff_code = False + super(qpsk_demod, self).__init__(constellation=constellation, + pre_diff_code=pre_diff_code, *args, **kwargs) @@ -106,20 +118,18 @@ class qpsk_demod(generic_demod): # DQPSK constellation # ///////////////////////////////////////////////////////////////////////////// -def dqpsk_constellation(m=_def_constellation_points): - if m != _def_constellation_points: - raise ValueError("DQPSK can only have 4 constellation points.") +def dqpsk_constellation(mod_code=_def_mod_code): + if mod_code != mod_codes.GRAY_CODE: + raise ValueError("The DQPSK constellation is only generated for gray_coding. But it can be used for non-grayed coded modulation if one doesn't use the pre-differential code.") return digital_swig.constellation_dqpsk() # ///////////////////////////////////////////////////////////////////////////// # DQPSK modulator # ///////////////////////////////////////////////////////////////////////////// -class dqpsk_mod(generic_mod): +class dqpsk_mod(qpsk_mod): - def __init__(self, constellation_points=_def_constellation_points, - gray_coded=_def_gray_coded, - differential=True, *args, **kwargs): + def __init__(self, mod_code=_def_mod_code, *args, **kwargs): """ Hierarchical block for RRC-filtered DQPSK modulation. @@ -128,14 +138,7 @@ class dqpsk_mod(generic_mod): See generic_mod block for list of parameters. """ - - constellation_points = _def_constellation_points - constellation = digital_swig.constellation_dqpsk() - if constellation_points != 4: - raise ValueError('Number of constellation points must be 4 for DQPSK.') - super(dqpsk_mod, self).__init__(constellation=constellation, - gray_coded=gray_coded, - differential=True, + super(dqpsk_mod, self).__init__(mod_code, differential=True, *args, **kwargs) # ///////////////////////////////////////////////////////////////////////////// @@ -143,10 +146,9 @@ class dqpsk_mod(generic_mod): # # ///////////////////////////////////////////////////////////////////////////// -class dqpsk_demod(generic_demod): +class dqpsk_demod(qpsk_demod): - def __init__(self, constellation_points=_def_constellation_points, - differential=True, *args, **kwargs): + def __init__(self, mod_code=_def_mod_code, *args, **kwargs): """ Hierarchical block for RRC-filtered DQPSK modulation. @@ -156,12 +158,7 @@ class dqpsk_demod(generic_demod): See generic_demod block for list of parameters. """ - constellation_points = _def_constellation_points - constellation = digital_swig.constellation_dqpsk() - if constellation_points != 4: - raise ValueError('Number of constellation points must be 4 for DQPSK.') - super(dqpsk_demod, self).__init__(constellation=constellation, - differential=True, + super(dqpsk_demod, self).__init__(mod_code, differential=True, *args, **kwargs) # |