diff options
author | Ben Reynwar <ben@reynwar.net> | 2012-04-26 21:41:11 -0700 |
---|---|---|
committer | Ben Reynwar <ben@reynwar.net> | 2012-04-26 21:41:11 -0700 |
commit | 93940233c63b1e889a502dc0558de2bc03bab414 (patch) | |
tree | 604e286bf13689f2af939e04b395a17da5587111 | |
parent | e7f45e3c513242706a9e4aa36e99e33e79e66d4f (diff) |
gr-digital: API-CHANGE. Tidying bpsk, qpsk and generic_mod_demod.
-rw-r--r-- | gr-digital/python/bpsk.py | 49 | ||||
-rw-r--r-- | gr-digital/python/generic_mod_demod.py | 33 | ||||
-rw-r--r-- | gr-digital/python/qpsk.py | 91 |
3 files changed, 75 insertions, 98 deletions
diff --git a/gr-digital/python/bpsk.py b/gr-digital/python/bpsk.py index 0d8f05c4c1..09dc856cf5 100644 --- a/gr-digital/python/bpsk.py +++ b/gr-digital/python/bpsk.py @@ -31,18 +31,11 @@ from gnuradio.digital.generic_mod_demod import generic_mod, generic_demod import digital_swig import modulation_utils -# Default number of points in constellation. -_def_constellation_points = 2 -# Whether differential coding is used. -_def_differential = False - # ///////////////////////////////////////////////////////////////////////////// # BPSK constellation # ///////////////////////////////////////////////////////////////////////////// -def bpsk_constellation(m=_def_constellation_points): - if m != _def_constellation_points: - raise ValueError("BPSK can only have 2 constellation points.") +def bpsk_constellation(): return digital_swig.constellation_bpsk() # ///////////////////////////////////////////////////////////////////////////// @@ -51,8 +44,7 @@ def bpsk_constellation(m=_def_constellation_points): class bpsk_mod(generic_mod): - def __init__(self, constellation_points=_def_constellation_points, - differential=False, *args, **kwargs): + def __init__(self, differential=False, *args, **kwargs): """ Hierarchical block for RRC-filtered BPSK modulation. @@ -63,10 +55,7 @@ class bpsk_mod(generic_mod): See generic_mod block for list of parameters. """ - constellation_points = _def_constellation_points constellation = digital_swig.constellation_bpsk() - if constellation_points != 2: - raise ValueError('Number of constellation points must be 2 for BPSK.') super(bpsk_mod, self).__init__(constellation=constellation, differential=differential, *args, **kwargs) @@ -77,8 +66,7 @@ class bpsk_mod(generic_mod): class bpsk_demod(generic_demod): - def __init__(self, constellation_points=_def_constellation_points, - differential=False, *args, **kwargs): + def __init__(self, differential=False, *args, **kwargs): """ Hierarchical block for RRC-filtered BPSK modulation. @@ -89,10 +77,7 @@ class bpsk_demod(generic_demod): See generic_demod block for list of parameters. """ - constellation_points = _def_constellation_points constellation = digital_swig.constellation_bpsk() - if constellation_points != 2: - raise ValueError('Number of constellation points must be 2 for BPSK.') super(bpsk_demod, self).__init__(constellation=constellation, differential=differential, *args, **kwargs) @@ -102,19 +87,16 @@ class bpsk_demod(generic_demod): # DBPSK constellation # ///////////////////////////////////////////////////////////////////////////// -def dbpsk_constellation(m=_def_constellation_points): - if m != _def_constellation_points: - raise ValueError("DBPSK can only have 2 constellation points.") +def dbpsk_constellation(): return digital_swig.constellation_dbpsk() # ///////////////////////////////////////////////////////////////////////////// # DBPSK modulator # ///////////////////////////////////////////////////////////////////////////// -class dbpsk_mod(generic_mod): +class dbpsk_mod(bpsk_mod): - def __init__(self, constellation_points=_def_constellation_points, - differential=True, *args, **kwargs): + def __init__(self, *args, **kwargs): """ Hierarchical block for RRC-filtered DBPSK modulation. @@ -125,12 +107,7 @@ class dbpsk_mod(generic_mod): See generic_mod block for list of parameters. """ - constellation_points = _def_constellation_points - constellation = digital_swig.constellation_bpsk() - if constellation_points != 2: - raise ValueError('Number of constellation points must be 2 for DBPSK.') - super(dbpsk_mod, self).__init__(constellation=constellation, - differential=True, + super(dbpsk_mod, self).__init__(differential=True, *args, **kwargs) # ///////////////////////////////////////////////////////////////////////////// @@ -138,10 +115,9 @@ class dbpsk_mod(generic_mod): # # ///////////////////////////////////////////////////////////////////////////// -class dbpsk_demod(generic_demod): +class dbpsk_demod(bpsk_demod): - def __init__(self, constellation_points=_def_constellation_points, - differential=True, *args, **kwargs): + def __init__(self, *args, **kwargs): """ Hierarchical block for RRC-filtered DBPSK modulation. @@ -152,12 +128,7 @@ class dbpsk_demod(generic_demod): See generic_demod block for list of parameters. """ - constellation_points = _def_constellation_points - constellation = digital_swig.constellation_bpsk() - if constellation_points != 2: - raise ValueError('Number of constellation points must be 2 for DBPSK.') - super(dbpsk_demod, self).__init__(constellation=constellation, - differential=True, + super(dbpsk_demod, self).__init__(differential=True, *args, **kwargs) # diff --git a/gr-digital/python/generic_mod_demod.py b/gr-digital/python/generic_mod_demod.py index ae876e1086..49a5f5ac6c 100644 --- a/gr-digital/python/generic_mod_demod.py +++ b/gr-digital/python/generic_mod_demod.py @@ -78,8 +78,8 @@ class generic_mod(gr.hier_block2): def __init__(self, constellation, samples_per_symbol=_def_samples_per_symbol, differential=_def_differential, + pre_diff_code=True, excess_bw=_def_excess_bw, - gray_coded=True, verbose=_def_verbose, log=_def_log): """ @@ -92,10 +92,12 @@ class generic_mod(gr.hier_block2): @type constellation: gnuradio.digital.gr_constellation @param samples_per_symbol: samples per baud >= 2 @type samples_per_symbol: float + @param differential: whether to use differential encoding + @type differential: boolean + @param pre_diff_code: whether to use apply a pre-differential mapping + @type pre_diff_code: boolean @param excess_bw: Root-raised cosine filter excess bandwidth @type excess_bw: float - @param gray_coded: turn gray coding on/off - @type gray_coded: bool @param verbose: Print information about modulator? @type verbose: bool @param log: Log modulation data to files? @@ -110,6 +112,8 @@ class generic_mod(gr.hier_block2): self._samples_per_symbol = samples_per_symbol self._excess_bw = excess_bw self._differential = differential + # Only apply a predifferential coding if the constellation also supports it. + self.pre_diff_code = pre_diff_code and self._constellation.apply_pre_diff_code() if self._samples_per_symbol < 2: raise TypeError, ("sbp must be >= 2, is %f" % self._samples_per_symbol) @@ -120,7 +124,7 @@ class generic_mod(gr.hier_block2): self.bytes2chunks = \ gr.packed_to_unpacked_bb(self.bits_per_symbol(), gr.GR_MSB_FIRST) - if gray_coded == True: + if self.pre_diff_code: self.symbol_mapper = gr.map_bb(self._constellation.pre_diff_code()) if differential: @@ -142,7 +146,7 @@ class generic_mod(gr.hier_block2): # Connect blocks = [self, self.bytes2chunks] - if gray_coded == True: + if self.pre_diff_code: blocks.append(self.symbol_mapper) if differential: blocks.append(self.diffenc) @@ -186,7 +190,7 @@ class generic_mod(gr.hier_block2): print "Modulation logging turned on." self.connect(self.bytes2chunks, gr.file_sink(gr.sizeof_char, "tx_bytes2chunks.8b")) - if self._constellation.apply_pre_diff_code(): + if self.pre_diff_code: self.connect(self.symbol_mapper, gr.file_sink(gr.sizeof_char, "tx_symbol_mapper.8b")) if self._differential: @@ -210,8 +214,8 @@ class generic_demod(gr.hier_block2): def __init__(self, constellation, samples_per_symbol=_def_samples_per_symbol, differential=_def_differential, + pre_diff_code=True, excess_bw=_def_excess_bw, - gray_coded=True, freq_bw=_def_freq_bw, timing_bw=_def_timing_bw, phase_bw=_def_phase_bw, @@ -227,10 +231,12 @@ class generic_demod(gr.hier_block2): @type constellation: gnuradio.digital.gr_constellation @param samples_per_symbol: samples per symbol >= 2 @type samples_per_symbol: float + @param differential: whether to use differential encoding + @type differential: boolean + @param pre_diff_code: whether to use apply a pre-differential mapping + @type pre_diff_code: boolean @param excess_bw: Root-raised cosine filter excess bandwidth @type excess_bw: float - @param gray_coded: turn gray coding on/off - @type gray_coded: bool @param freq_bw: loop filter lock-in bandwidth @type freq_bw: float @param timing_bw: timing recovery loop lock-in bandwidth @@ -259,6 +265,9 @@ class generic_demod(gr.hier_block2): if self._samples_per_symbol < 2: raise TypeError, ("sbp must be >= 2, is %d" % self._samples_per_symbol) + # Only apply a predifferential coding if the constellation also supports it. + self.pre_diff_code = pre_diff_code and self._constellation.apply_pre_diff_code() + arity = pow(2,self.bits_per_symbol()) nfilts = 32 @@ -289,7 +298,7 @@ class generic_demod(gr.hier_block2): if differential: self.diffdec = gr.diff_decoder_bb(arity) - if gray_coded: + if self.pre_diff_code: self.symbol_mapper = gr.map_bb( mod_codes.invert_code(self._constellation.pre_diff_code())) @@ -307,7 +316,7 @@ class generic_demod(gr.hier_block2): self.time_recov, self.receiver] if differential: blocks.append(self.diffdec) - if self._constellation.apply_pre_diff_code(): + if self.pre_diff_code: blocks.append(self.symbol_mapper) blocks += [self.unpack, self] self.connect(*blocks) @@ -357,7 +366,7 @@ class generic_demod(gr.hier_block2): if self._differential: self.connect(self.diffdec, gr.file_sink(gr.sizeof_char, "rx_diffdec.8b")) - if self._constellation.apply_pre_diff_code(): + if self.pre_diff_code: self.connect(self.symbol_mapper, gr.file_sink(gr.sizeof_char, "rx_symbol_mapper.8b")) self.connect(self.unpack, 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) # |