summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Reynwar <ben@reynwar.net>2012-04-26 21:41:11 -0700
committerBen Reynwar <ben@reynwar.net>2012-04-26 21:41:11 -0700
commit93940233c63b1e889a502dc0558de2bc03bab414 (patch)
tree604e286bf13689f2af939e04b395a17da5587111
parente7f45e3c513242706a9e4aa36e99e33e79e66d4f (diff)
gr-digital: API-CHANGE. Tidying bpsk, qpsk and generic_mod_demod.
-rw-r--r--gr-digital/python/bpsk.py49
-rw-r--r--gr-digital/python/generic_mod_demod.py33
-rw-r--r--gr-digital/python/qpsk.py91
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)
#