summaryrefslogtreecommitdiff
path: root/gr-digital/python/digital/gmsk.py
diff options
context:
space:
mode:
Diffstat (limited to 'gr-digital/python/digital/gmsk.py')
-rw-r--r--gr-digital/python/digital/gmsk.py38
1 files changed, 25 insertions, 13 deletions
diff --git a/gr-digital/python/digital/gmsk.py b/gr-digital/python/digital/gmsk.py
index cf998391c6..68127119e6 100644
--- a/gr-digital/python/digital/gmsk.py
+++ b/gr-digital/python/digital/gmsk.py
@@ -14,6 +14,7 @@
# See gnuradio-examples/python/digital for examples
from math import pi
+from math import log as ln
from pprint import pprint
import inspect
@@ -167,7 +168,7 @@ class gmsk_demod(gr.hier_block2):
Args:
samples_per_symbol: samples per baud (integer)
gain_mu: controls rate of mu adjustment (float)
- mu: fractional delay [0.0, 1.0] (float)
+ mu: unused but unremoved for backward compatibility (unused)
omega_relative_limit: sets max variation in omega (float)
freq_error: bit rate error as a fraction (float)
verbose: Print information about modulator? (boolean)
@@ -189,7 +190,6 @@ class gmsk_demod(gr.hier_block2):
self._samples_per_symbol = samples_per_symbol
self._gain_mu = gain_mu
- self._mu = mu
self._omega_relative_limit = omega_relative_limit
self._freq_error = freq_error
self._differential = False
@@ -204,15 +204,27 @@ class gmsk_demod(gr.hier_block2):
self._gain_omega = .25 * self._gain_mu * self._gain_mu # critically damped
+ self._damping = 1.0
+ self._loop_bw = -ln((self._gain_mu + self._gain_omega)/(-2.0) + 1) # critically damped
+ self._max_dev = self._omega_relative_limit * self._samples_per_symbol
+
# Demodulate FM
sensitivity = (pi / 2) / samples_per_symbol
self.fmdemod = analog.quadrature_demod_cf(1.0 / sensitivity)
# the clock recovery block tracks the symbol clock and resamples as needed.
# the output of the block is a stream of soft symbols (float)
- self.clock_recovery = digital.clock_recovery_mm_ff(self._omega, self._gain_omega,
- self._mu, self._gain_mu,
- self._omega_relative_limit)
+ self.clock_recovery = self.digital_symbol_sync_xx_0 = digital.symbol_sync_ff(digital.TED_MUELLER_AND_MULLER,
+ self._omega,
+ self._loop_bw,
+ self._damping,
+ 1.0, # Expected TED gain
+ self._max_dev,
+ 1, # Output sps
+ digital.constellation_bpsk().base(),
+ digital.IR_MMSE_8TAP,
+ 128,
+ [])
# slice the floats at 0, outputting 1 bit (the LSB of the output byte) per sample
self.slicer = digital.binary_slicer_fb()
@@ -235,10 +247,10 @@ class gmsk_demod(gr.hier_block2):
def _print_verbage(self):
print("bits per symbol = %d" % self.bits_per_symbol())
- print("M&M clock recovery omega = %f" % self._omega)
- print("M&M clock recovery gain mu = %f" % self._gain_mu)
- print("M&M clock recovery mu = %f" % self._mu)
- print("M&M clock recovery omega rel. limit = %f" % self._omega_relative_limit)
+ print("Symbol Sync M&M omega = %f" % self._omega)
+ print("Symbol Sync M&M gain mu = %f" % self._gain_mu)
+ print("M&M clock recovery mu (Unused) = %f" % self._mu)
+ print("Symbol Sync M&M omega rel. limit = %f" % self._omega_relative_limit)
print("frequency error = %f" % self._freq_error)
@@ -257,13 +269,13 @@ class gmsk_demod(gr.hier_block2):
Adds GMSK demodulation-specific options to the standard parser
"""
parser.add_option("", "--gain-mu", type="float", default=_def_gain_mu,
- help="M&M clock recovery gain mu [default=%default] (GMSK/PSK)")
+ help="Symbol Sync M&M gain mu [default=%default] (GMSK/PSK)")
parser.add_option("", "--mu", type="float", default=_def_mu,
- help="M&M clock recovery mu [default=%default] (GMSK/PSK)")
+ help="M&M clock recovery mu [default=%default] (Unused)")
parser.add_option("", "--omega-relative-limit", type="float", default=_def_omega_relative_limit,
- help="M&M clock recovery omega relative limit [default=%default] (GMSK/PSK)")
+ help="Symbol Sync M&M omega relative limit [default=%default] (GMSK/PSK)")
parser.add_option("", "--freq-error", type="float", default=_def_freq_error,
- help="M&M clock recovery frequency error [default=%default] (GMSK)")
+ help="Symbol Sync M&M frequency error [default=%default] (GMSK)")
@staticmethod
def extract_kwargs_from_options(options):