commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] r3616 - gnuradio/branches/developers/eb/digital-wip/gn


From: eb
Subject: [Commit-gnuradio] r3616 - gnuradio/branches/developers/eb/digital-wip/gnuradio-core/src/python/gnuradio/blksimpl
Date: Fri, 22 Sep 2006 12:04:27 -0600 (MDT)

Author: eb
Date: 2006-09-22 12:04:26 -0600 (Fri, 22 Sep 2006)
New Revision: 3616

Modified:
   
gnuradio/branches/developers/eb/digital-wip/gnuradio-core/src/python/gnuradio/blksimpl/bpsk.py
   
gnuradio/branches/developers/eb/digital-wip/gnuradio-core/src/python/gnuradio/blksimpl/dbpsk.py
   
gnuradio/branches/developers/eb/digital-wip/gnuradio-core/src/python/gnuradio/blksimpl/dqpsk.py
   
gnuradio/branches/developers/eb/digital-wip/gnuradio-core/src/python/gnuradio/blksimpl/gmsk.py
   
gnuradio/branches/developers/eb/digital-wip/gnuradio-core/src/python/gnuradio/blksimpl/psk.py
Log:
merged Tom's mod/demod mods

Modified: 
gnuradio/branches/developers/eb/digital-wip/gnuradio-core/src/python/gnuradio/blksimpl/bpsk.py
===================================================================
--- 
gnuradio/branches/developers/eb/digital-wip/gnuradio-core/src/python/gnuradio/blksimpl/bpsk.py
      2006-09-22 17:52:55 UTC (rev 3615)
+++ 
gnuradio/branches/developers/eb/digital-wip/gnuradio-core/src/python/gnuradio/blksimpl/bpsk.py
      2006-09-22 18:04:26 UTC (rev 3616)
@@ -38,7 +38,7 @@
 
 class bpsk_mod(gr.hier_block):
 
-    def __init__(self, fg, spb, excess_bw, gray_code=True, verbose=True, 
debug=False):
+    def __init__(self, fg, spb, excess_bw=0.35, gray_code=True, verbose=True, 
debug=False):
         """
        Hierarchical block for RRC-filtered BPSK modulation.
 
@@ -92,14 +92,14 @@
 
        # Connect and Initialize base class
         self.fg.connect(self.bytes2chunks, self.chunks2symbols, 
self.rrc_filter)
-       gr.hier_block.__init__(self, self.fg, self.bytes2chunks, 
self.rrc_filter)
+       gr.hier_block.__init__(self, self._fg, self.bytes2chunks, 
self.rrc_filter)
 
     def samples_per_symbol(self):
-        return self.spb
+        return self._samples_per_symbol
 
-    def bits_per_baud(self=None):   # staticmethod that's also callable on an 
instance
+    def bits_per_symbol(self=None):   # staticmethod that's also callable on 
an instance
         return 1
-    bits_per_baud = staticmethod(bits_per_baud)      # make it a static 
method.  RTFM
+    bits_per_symbol = staticmethod(bits_per_symbol)      # make it a static 
method.  RTFM
 
     def verbose(self):
         print "bits per symbol = %d" % self.bits_per_baud()
@@ -107,17 +107,20 @@
 
     def debug(self):
         print "Modulation debugging turned on."
-        self.fg.connect(self.bytes2chunks,
-                        gr.file_sink(gr.sizeof_char, "bytes2chunks.dat"))
-        self.fg.connect(self.chunks2symbols,
-                        gr.file_sink(gr.sizeof_gr_complex, 
"chunks2symbols.dat"))
-        self.fg.connect(self.rrc_filter,
-                        gr.file_sink(gr.sizeof_gr_complex, "rrc.dat"))
+        self._fg.connect(self.bytes2chunks,
+                         gr.file_sink(gr.sizeof_char, "bytes2chunks.dat"))
+        self._fg.connect(self.chunks2symbols,
+                         gr.file_sink(gr.sizeof_gr_complex, 
"chunks2symbols.dat"))
+        self._fg.connect(self.rrc_filter,
+                         gr.file_sink(gr.sizeof_gr_complex, "rrc_filter.dat"))
 
-    def arguments(self=None):
-        args = {'spb':2, 'excess_bw':0.3, 'gray_code':True, 'verbose':True, 
'debug':False}
-        return args
-    arguments = staticmethod(arguments)
+    def extract_kwargs_from_options(options):
+        """
+        Given command line options, create dictionary suitable for passing to 
__init__
+        """
+        return modulation_utils.extract_kwargs_from_options(
+                 bpsk_demod.__init__, ('self', 'fg'), options)
+    extract_kwargs_from_options=staticmethod(extract_kwargs_from_options)
 
     def add_options(parser):
         """
@@ -125,7 +128,7 @@
         """
         from optparse import OptionConflictError
         try:
-            parser.add_option("", "--excess-bw", type="float", default=0.3,
+            parser.add_option("", "--excess-bw", type="float", default=0.35,
                               help="set RRC excess bandwith factor 
[default=%default]")
             parser.add_option("", "--no-gray-code", action="store_false", 
default=True,
                               help="Don't use gray coding on modulated bits 
[default=%default]")
@@ -135,7 +138,8 @@
 
 
 class bpsk_demod__coherent_detection_of_psk(gr.hier_block):
-    def __init__(self, fg, spb, excess_bw=0.35, costas_alpha=0.005, 
gain_mu=0.05, mu=0.5,
+    def __init__(self, fg, samples_per_symbol, excess_bw=0.35, 
costas_alpha=0.05,
+                 gain_mu=0.03, mu=0.05, omega_relative_limit=0.5,
                  gray_code=True, verbose=True, debug=False):
         """
        Hierarchical block for RRC-filtered BPSK demodulation
@@ -145,7 +149,7 @@
 
        @param fg: flow graph
        @type fg: flow graph
-       @param spb: samples per baud >= 2
+       @param spb: samples per symbol >= 2
        @type spb: float
        @param excess_bw: Root-raised cosine filter excess bandwidth
        @type excess_bw: float
@@ -161,11 +165,13 @@
         @type debug: bool
        """
 
-        self.fg = fg
-        self.spb = spb
-        self.excess_bw = excess_bw
-        self.costas_alpha = costas_alpha
-        self.gain_mu = gain_mu
+        self._fg = fg
+        self._samples_per_symbol = _samples_per_symbol
+        self._excess_bw = excess_bw
+        self._costas_alpha = costas_alpha
+        self._gain_mu = gain_mu
+        self._mu = mu
+        self._omega_relative_limit = omega_relative_limit
 
         if spb < 2:
             raise TypeError, "sbp must be >= 2"
@@ -173,35 +179,33 @@
         arity = pow(2,self.bits_per_baud())
 
         # Automatic gain control
-        self.preamp = gr.multiply_const_cc(10e-5)
-        self.agc = gr.agc_cc(1e-3, 1, 1)
+        scale = (1.0/16384.0)
+        self.pre_scaler = gr.multiply_const_cc(scale)   # scale the signal 
from full-range to +-1
+        self.agc = gr.agc_cc(0.1, 0.01, 1, 1, 1000)
         
         # Costas loop (carrier tracking)
         # FIXME: need to decide how to handle this more generally; do we pull 
it from higher layer?
         costas_order = 2
-        self.costas_alpha *= 15   # 2nd order loop needs more gain
-        beta = .25 * costas_alpha * costas_alpha
-        self.costas_loop = gr.costas_loop_cc(self.costas_alpha, beta, 0.05, 
-0.05, costas_order)
+        beta = .25 * self._costas_alpha * self._costas_alpha
+        self.costas_loop = gr.costas_loop_cc(self._costas_alpha, beta, 0.5, 
-0.5, costas_order)
 
         # RRC data filter
         ntaps = 11 * spb
         self.rrc_taps = gr.firdes.root_raised_cosine(
-            1.0,                # gain 
-            spb,                # sampling rate
-            1.0,                # symbol rate
-            self.excess_bw,     # excess bandwidth (roll-off factor)
+            1.0,                 # gain 
+            samples_per_symbol,  # sampling rate
+            1.0,                 # symbol rate
+            self.excess_bw,      # excess bandwidth (roll-off factor)
             ntaps)
 
         self.rrc_filter=gr.fir_filter_ccf(1, self.rrc_taps)
 
         # symbol clock recovery
-        omega = spb
+        omega = _samples_per_symbol
         gain_omega = .25 * gain_mu * gain_mu
-        omega_rel_limit = 0.5
-        mu = 0.05
-        self.gain_mu = 0.1
         self.clock_recovery=gr.clock_recovery_mm_cc(omega, gain_omega,
-                                                    mu, self.gain_mu, 
omega_rel_limit)
+                                                    self._mu, self._gain_mu,
+                                                    self._omega_rel_limit)
 
         # find closest constellation point
         #rot = .707 + .707j
@@ -222,64 +226,68 @@
             self.debug()
 
         # Connect and Initialize base class
-        self.fg.connect(self.preamp, self.agc, self.costas_loop, 
self.rrc_filter, \
-                        self.clock_recovery, self.slicer, self.gray_decoder, 
self.unpack)
-        gr.hier_block.__init__(self, self.fg, self.preamp, self.unpack)
+        self._fg.connect(self.pre_scaler, self.agc, self.costas_loop, 
self.rrc_filter, \
+                         self.clock_recovery, self.slicer, self.gray_decoder, 
self.unpack)
+        gr.hier_block.__init__(self, self.fg, self.pre_scaler, self.unpack)
 
     def samples_per_symbol(self):
-        return self.spb
+        return self._samples_per_symbol
 
-    def bits_per_baud(self=None):   # staticmethod that's also callable on an 
instance
+    def bits_per_symbol(self=None):   # staticmethod that's also callable on 
an instance
         return 1
-    bits_per_baud = staticmethod(bits_per_baud)      # make it a static 
method.  RTFM
+    bits_per_symbol = staticmethod(bits_per_symbol)      # make it a static 
method.  RTFM
 
     def verbose(self):
-        print "bits per symbol = %d"         % self.bits_per_baud()
-        print "RRC roll-off factor = %.2f"   % self.excess_bw
-        print "Costas Loop alpha = %.5f"     % self.costas_alpha
-        print "M&M symbol sync gain  = %.5f" % self.gain_mu
+        print "bits per symbol = %d"        % self._samples_per_symbol
+        print "RRC roll-off factor = %.2f"  % self._excess_bw
+        print "Costas Loop alpha = %.5f"    % self._costas_alpha
+        print "M&M symbol sync gain = %.5f" % self._gain_mu
+        print "M&M symbol sync mu = %.5f"   % self._mu
+        print "M&M omega relative limit = %.5f" % self._omega_relative_limit
 
     def debug(self):
-        print "Modulation debugging turned on."
-        self.fg.connect(self.agc,
-                        gr.file_sink(gr.sizeof_gr_complex, "agc.dat"))
-        self.fg.connect(self.costas_loop,
-                        gr.file_sink(gr.sizeof_gr_complex, "costas_loop.dat"))
-        self.fg.connect(self.rrc_filter,
-                        gr.file_sink(gr.sizeof_gr_complex, "rrc.dat"))
-        self.fg.connect(self.clock_recovery,
-                        gr.file_sink(gr.sizeof_gr_complex, 
"clock_recovery.dat"))
-        self.fg.connect(self.slicer,
-                        gr.file_sink(gr.sizeof_char, "slicer.dat"))
-        self.fg.connect(self.gray_decoder,
-                        gr.file_sink(gr.sizeof_char, "gray_decoder.dat"))
-        self.fg.connect(self.unpack,
-                        gr.file_sink(gr.sizeof_char, "unpack.dat"))
+        print "Modulation logging turned on."
+        self._fg.connect(self.agc,
+                         gr.file_sink(gr.sizeof_gr_complex, "agc.dat"))
+        self._fg.connect(self.costas_loop,
+                         gr.file_sink(gr.sizeof_gr_complex, "costas_loop.dat"))
+        self._fg.connect((self.costas_loop,1),
+                         gr.file_sink(gr.sizeof_gr_complex, 
"costas_error.dat"))
+        self._fg.connect(self.rrc_filter,
+                         gr.file_sink(gr.sizeof_gr_complex, "rrc_filter.dat"))
+        self._fg.connect(self.clock_recovery,
+                         gr.file_sink(gr.sizeof_gr_complex, 
"clock_recovery.dat"))
+        self._fg.connect(self.slicer,
+                         gr.file_sink(gr.sizeof_char, "slicer.dat"))
+        self._fg.connect(self.gray_decoder,
+                         gr.file_sink(gr.sizeof_char, "gray_decoder.dat"))
+        self._fg.connect(self.unpack,
+                         gr.file_sink(gr.sizeof_char, "unpack.dat"))
 
-    def arguments(self=None):
-        args = {'spb':2, 'excess_bw':0.3, 'costas_alpha':0.005, 
'gain_mu':0.05, 'mu':0.5,
-                'gray_code':True, 'verbose':True, 'debug':False}
-        return args
-    arguments = staticmethod(arguments)
+    def extract_kwargs_from_options(options):
+        """
+        Given command line options, create dictionary suitable for passing to 
__init__
+        """
+        return modulation_utils.extract_kwargs_from_options(
+                 bpsk_demod.__init__, ('self', 'fg'), options)
+    extract_kwargs_from_options=staticmethod(extract_kwargs_from_options)
 
     def add_options(parser):
         """
-        Adds modulation-specific options to the standard parser
+        Adds BPSK-specific options to the standard parser
         """
-        from optparse import OptionConflictError
-        try:
-            parser.add_option("", "--excess-bw", type="float", default=0.3,
-                              help="set RRC excess bandwith factor 
[default=%default]")
-            parser.add_option("", "--no-gray-code", action="store_false", 
default=True,
-                              help="Don't use gray coding on modulated bits 
[default=%default]")
-            parser.add_option("", "--costas-alpha", type="float", 
default=0.005,
-                              help="set Costas loop alpha value 
[default=%default]")
-            parser.add_option("", "--gain-mu", type="float", default=0.05,
-                              help="set M&M symbol sync loop gain mu value 
[default=%default]")
-            parser.add_option("", "--mu", type="float", default=0.5,
-                              help="set M&M symbol sync loop mu value 
[default=%default]")
-        except OptionConflictError:
-            pass
+        parser.add_option("", "--excess-bw", type="float", default=0.3,
+                          help="set RRC excess bandwith factor 
[default=%default]")
+        parser.add_option("", "--no-gray-code", action="store_false", 
default=True,
+                          help="Don't use gray coding on modulated bits 
[default=%default]")
+        parser.add_option("", "--costas-alpha", type="float", default=0.05,
+                          help="set Costas loop alpha value 
[default=%default]")
+        parser.add_option("", "--gain-mu", type="float", default=0.05,
+                          help="set M&M symbol sync loop gain mu value 
[default=%default] (GMSK/PSK)")
+        parser.add_option("", "--mu", type="float", default=0.5,
+                          help="set M&M symbol sync loop mu value 
[default=%default] (GMSK/PSK)")
+        parser.add_option("", "--omega-relative-limit", type="float", 
default=0.5,
+                          help="M&M clock recovery omega relative limit 
[default=%default] (GMSK/PSK)")
     add_options=staticmethod(add_options)
     
 bpsk_demod = bpsk_demod__coherent_detection_of_psk

Modified: 
gnuradio/branches/developers/eb/digital-wip/gnuradio-core/src/python/gnuradio/blksimpl/dbpsk.py
===================================================================
--- 
gnuradio/branches/developers/eb/digital-wip/gnuradio-core/src/python/gnuradio/blksimpl/dbpsk.py
     2006-09-22 17:52:55 UTC (rev 3615)
+++ 
gnuradio/branches/developers/eb/digital-wip/gnuradio-core/src/python/gnuradio/blksimpl/dbpsk.py
     2006-09-22 18:04:26 UTC (rev 3616)
@@ -39,9 +39,9 @@
 
 class dbpsk_mod(gr.hier_block):
     def __init__(self, fg, samples_per_symbol=2, excess_bw=0.35,
-                 gray_code=True, verbose=True, debug=False):
+                 gray_code=True, verbose=True, log=False):
         """
-       Hierarchical block for RRC-filtered QPSK modulation.
+       Hierarchical block for RRC-filtered differential BPSK modulation.
 
        The input is a byte stream (unsigned char) and the
        output is the complex modulated signal at baseband.
@@ -56,8 +56,8 @@
         @type gray_code: bool
         @param verbose: Print information about modulator?
         @type verbose: bool
-        @param debug: Log modulation data to files?
-        @type debug: bool
+        @param log: Log modulation data to files?
+        @type log: bool
        """
 
         self._fg = fg
@@ -87,7 +87,7 @@
         # pulse shaping filter
        self.rrc_taps = gr.firdes.root_raised_cosine(
            self._samples_per_symbol, # gain  (samples_per_symbol since we're
-                                      #   interpolating by samples_per_symbol)
+                                      # interpolating by samples_per_symbol)
            self._samples_per_symbol, # sampling rate
            1.0,                      # symbol rate
            self._excess_bw,          # excess bandwidth (roll-off factor)
@@ -103,7 +103,7 @@
         if verbose:
             self._print_verbage()
             
-        if debug:
+        if log:
             self._setup_logging()
             
        # Initialize base class
@@ -121,7 +121,7 @@
         Adds DBPSK modulation-specific options to the standard parser
         """
         from optparse import OptionConflictError
-        parser.add_option("", "--excess-bw", type="float", default=0.3,
+        parser.add_option("", "--excess-bw", type="float", default=0.35,
                           help="set RRC excess bandwith factor 
[default=%default]")
         parser.add_option("", "--no-gray-code", action="store_false", 
default=True,
                           help="Don't use gray coding on modulated bits 
[default=%default]")
@@ -161,25 +161,29 @@
 # /////////////////////////////////////////////////////////////////////////////
 
 class dbpsk_demod(gr.hier_block):
-    def __init__(self, fg, samples_per_symbol, excess_bw=0.35,
-                 costas_alpha=0.005, gain_mu=0.05, mu=0.5,
-                 gray_code=True, verbose=True, debug=False):
+    def __init__(self, fg, samples_per_symbol, excess_bw=0.35, 
costas_alpha=0.05,
+                 gain_mu=0.03, mu=0.05, omega_relative_limit=0.005,
+                 gray_code=True, verbose=True, log=False):
         """
-       Hierarchical block for RRC-filtered dBPSK demodulation
+       Hierarchical block for RRC-filtered differential BPSK demodulation
 
        The input is the complex modulated signal at baseband.
        The output is a stream of bits packed 1 bit per byte (LSB)
 
        @param fg: flow graph
        @type fg: flow graph
-       @param samples_per_symbol: samples per baud >= 2
+       @param samples_per_symbol: samples per symbol >= 2
        @type samples_per_symbol: float
        @param excess_bw: Root-raised cosine filter excess bandwidth
        @type excess_bw: float
         @param costas_alpha: loop filter gain
         @type costas_alphas: float
-        @param gain_mu:
+        @param gain_mu: for M&M block
         @type gain_mu: float
+        @param mu: for M&M block
+        @type mu: float
+        @param omega_relative_limit: for M&M block
+        @type omega_relative_limit: float
         @param gray_code: Tell modulator to Gray code the bits
         @type gray_code: bool
         @param verbose: Print information about modulator?
@@ -193,6 +197,8 @@
         self._excess_bw = excess_bw
         self._costas_alpha = costas_alpha
         self._gain_mu = gain_mu
+        self._mu = mu
+        self._omega_relative_limit = omega_relative_limit
         
         if samples_per_symbol < 2:
             raise TypeError, "samples_per_symbol must be >= 2, is %r" % 
(samples_per_symbol,)
@@ -200,15 +206,15 @@
         arity = pow(2,self.bits_per_symbol())
 
         # Automatic gain control
-        self.preamp = gr.multiply_const_cc(10e-5)
-        self.agc = gr.agc_cc(1e-3, 1, 1, 1000)
+        scale = (1.0/16384.0)
+        self.pre_scaler = gr.multiply_const_cc(scale)   # scale the signal 
from full-range to +-1
+        self.agc = gr.agc2_cc(1e-1, 1e-3, 1, 1, 1000)
         
         # Costas loop (carrier tracking)
         # FIXME: need to decide how to handle this more generally; do we pull 
it from higher layer?
         costas_order = 2
-        self._costas_alpha *= 15   # 2nd order loop needs more gain
-        beta = .25 * costas_alpha * costas_alpha
-        self.costas_loop = gr.costas_loop_cc(self._costas_alpha, beta, 0.5, 
-0.5, costas_order)
+        beta = .25 * self._costas_alpha * self._costas_alpha
+        self.costas_loop = gr.costas_loop_cc(self._costas_alpha, beta, 0.005, 
-0.005, costas_order)
 
         # RRC data filter
         ntaps = 11 * self._samples_per_symbol
@@ -224,14 +230,11 @@
         # symbol clock recovery
         omega = self._samples_per_symbol
         gain_omega = .25 * self._gain_mu * self._gain_mu
-        omega_rel_limit = 0.5
-        mu = 0.05
         self.clock_recovery=gr.clock_recovery_mm_cc(omega, gain_omega,
-                                                    mu, self._gain_mu,
-                                                    omega_rel_limit)
+                                                    self._mu, self._gain_mu,
+                                                    self._omega_relative_limit)
 
         # find closest constellation point
-        #rot = .707 + .707j
         rot = 1
         rotated_const = map(lambda pt: pt * rot, psk.constellation[arity])
         print "rotated_const =", rotated_const
@@ -248,13 +251,13 @@
         if verbose:
             self._print_verbage()
 
-        if debug:
-            self._enable_logging()
+        if log:
+            self._setup_logging()
 
         # Connect and Initialize base class
-        self._fg.connect(self.preamp, self.agc, self.costas_loop, 
self.rrc_filter, self.clock_recovery,
+        self._fg.connect(self.pre_scaler, self.agc, self.costas_loop, 
self.rrc_filter, self.clock_recovery,
                          self.diffdec, self.slicer, self.gray_decoder, 
self.unpack)
-        gr.hier_block.__init__(self, self._fg, self.preamp, self.unpack)
+        gr.hier_block.__init__(self, self._fg, self.pre_scaler, self.unpack)
 
     def samples_per_symbol(self):
         return self._samples_per_symbol
@@ -267,43 +270,49 @@
         print "bits per symbol = %d"         % self.bits_per_symbol()
         print "RRC roll-off factor = %.2f"   % self._excess_bw
         print "Costas Loop alpha = %.5f"     % self._costas_alpha
-        print "M&M symbol sync gain  = %.5f" % self._gain_mu
+        print "M&M symbol sync gain = %.5f"  % self._gain_mu
+        print "M&M symbol sync mu = %.5f"    % self._mu
+        print "M&M omega relative limit = %.5f" % self._omega_relative_limit
 
     def _setup_logging(self):
         print "Modulation logging turned on."
         self._fg.connect(self.agc,
-                        gr.file_sink(gr.sizeof_gr_complex, "agc.dat"))
+                         gr.file_sink(gr.sizeof_gr_complex, "agc.dat"))
         self._fg.connect(self.costas_loop,
-                        gr.file_sink(gr.sizeof_gr_complex, "costas_loop.dat"))
+                         gr.file_sink(gr.sizeof_gr_complex, "costas_loop.dat"))
+        self._fg.connect((self.costas_loop,1),
+                         gr.file_sink(gr.sizeof_gr_complex, 
"costas_error.dat"))
         self._fg.connect(self.rrc_filter,
-                        gr.file_sink(gr.sizeof_gr_complex, "rrc.dat"))
+                         gr.file_sink(gr.sizeof_gr_complex, "rrc_filter.dat"))
         self._fg.connect(self.clock_recovery,
-                        gr.file_sink(gr.sizeof_gr_complex, 
"clock_recovery.dat"))
+                         gr.file_sink(gr.sizeof_gr_complex, 
"clock_recovery.dat"))
+        self._fg.connect((self.clock_recovery,1),
+                         gr.file_sink(gr.sizeof_gr_complex, 
"clock_recovery_error.dat"))
         self._fg.connect(self.diffdec,
-                        gr.file_sink(gr.sizeof_gr_complex, "diffdec.dat"))     
   
+                         gr.file_sink(gr.sizeof_gr_complex, "diffdec.dat"))    
    
         self._fg.connect(self.slicer,
                         gr.file_sink(gr.sizeof_char, "slicer.dat"))
         self._fg.connect(self.gray_decoder,
-                        gr.file_sink(gr.sizeof_char, "gray_decoder.dat"))
+                         gr.file_sink(gr.sizeof_char, "gray_decoder.dat"))
         self._fg.connect(self.unpack,
-                        gr.file_sink(gr.sizeof_char, "unpack.dat"))
-        self._fg.connect((self.costas_loop,1),
-                        gr.file_sink(gr.sizeof_gr_complex, "costas.dat"))
+                         gr.file_sink(gr.sizeof_char, "unpack.dat"))
         
     def add_options(parser):
         """
         Adds DBPSK demodulation-specific options to the standard parser
         """
-        parser.add_option("", "--excess-bw", type="float", default=0.3,
+        parser.add_option("", "--excess-bw", type="float", default=0.35,
                           help="set RRC excess bandwith factor 
[default=%default] (PSK)")
         parser.add_option("", "--no-gray-code", action="store_false", 
default=True,
                           help="Don't use gray coding on modulated bits 
[default=%default] (PSK)")
-        parser.add_option("", "--costas-alpha", type="float", default=0.005,
+        parser.add_option("", "--costas-alpha", type="float", default=0.05,
                           help="set Costas loop alpha value [default=%default] 
(PSK)")
         parser.add_option("", "--gain-mu", type="float", default=0.05,
-                          help="set M&M symbol sync loop gain mu value 
[default=%default] (PSK)")
+                          help="set M&M symbol sync loop gain mu value 
[default=%default] (GMSK/PSK)")
         parser.add_option("", "--mu", type="float", default=0.5,
-                          help="set M&M symbol sync loop mu value 
[default=%default] (PSK)")
+                          help="set M&M symbol sync loop mu value 
[default=%default] (GMSK/PSK)")
+        parser.add_option("", "--omega-relative-limit", type="float", 
default=0.005,
+                          help="M&M clock recovery omega relative limit 
[default=%default] (GMSK/PSK)")
     add_options=staticmethod(add_options)
     
     def extract_kwargs_from_options(options):

Modified: 
gnuradio/branches/developers/eb/digital-wip/gnuradio-core/src/python/gnuradio/blksimpl/dqpsk.py
===================================================================
--- 
gnuradio/branches/developers/eb/digital-wip/gnuradio-core/src/python/gnuradio/blksimpl/dqpsk.py
     2006-09-22 17:52:55 UTC (rev 3615)
+++ 
gnuradio/branches/developers/eb/digital-wip/gnuradio-core/src/python/gnuradio/blksimpl/dqpsk.py
     2006-09-22 18:04:26 UTC (rev 3616)
@@ -39,7 +39,7 @@
 class dqpsk_mod(gr.hier_block):
 
     def __init__(self, fg, samples_per_symbol=2, excess_bw=0.35,
-                 gray_code=True, verbose=True, debug=False):
+                 gray_code=True, verbose=True, log=False):
         """
        Hierarchical block for RRC-filtered QPSK modulation.
 
@@ -82,22 +82,24 @@
             
         self.diffenc = gr.diff_encoder_bb(arity)
 
-        self.chunks2symbols = gr.chunks_to_symbols_bc(psk.constellation[arity])
+        rot = .707 + .707j
+        rotated_const = map(lambda pt: pt * rot, psk.constellation[arity])
+        self.chunks2symbols = gr.chunks_to_symbols_bc(rotated_const)
 
         # pulse shaping filter
        self.rrc_taps = gr.firdes.root_raised_cosine(
-           samples_per_symbol, # gain  (samples_per_symbol since we're 
interpolating by samples_per_symbol)
-            samples_per_symbol, # sampling rate
-            1.0,               # symbol rate
-            excess_bw,          # excess bandwidth (roll-off factor)
+           self._samples_per_symbol, # gain  (sps since we're interpolating by 
sps)
+            self._samples_per_symbol, # sampling rate
+            1.0,                     # symbol rate
+            self._excess_bw,          # excess bandwidth (roll-off factor)
             ntaps)
 
-       self.rrc_filter = gr.interp_fir_filter_ccf(samples_per_symbol, 
self.rrc_taps)
+       self.rrc_filter = gr.interp_fir_filter_ccf(self._samples_per_symbol, 
self.rrc_taps)
 
         if verbose:
             self._print_verbage()
         
-        if debug:
+        if log:
             self._setup_logging()
             
        # Connect & Initialize base class
@@ -118,22 +120,22 @@
 
     def _setup_logging(self):
         print "Modulation logging turned on."
-        self.fg.connect(self.bytes2chunks,
-                        gr.file_sink(gr.sizeof_char, "bytes2chunks.dat"))
-        self.fg.connect(self.gray_coder,
-                        gr.file_sink(gr.sizeof_char, "graycoder.dat"))
-        self.fg.connect(self.diffenc,
-                        gr.file_sink(gr.sizeof_char, "diffenc.dat"))        
-        self.fg.connect(self.chunks2symbols,
-                        gr.file_sink(gr.sizeof_gr_complex, 
"chunks2symbols.dat"))
-        self.fg.connect(self.rrc_filter,
-                        gr.file_sink(gr.sizeof_gr_complex, "rrc_filter.dat"))
+        self._fg.connect(self.bytes2chunks,
+                         gr.file_sink(gr.sizeof_char, "bytes2chunks.dat"))
+        self._fg.connect(self.gray_coder,
+                         gr.file_sink(gr.sizeof_char, "graycoder.dat"))
+        self._fg.connect(self.diffenc,
+                         gr.file_sink(gr.sizeof_char, "diffenc.dat"))        
+        self._fg.connect(self.chunks2symbols,
+                         gr.file_sink(gr.sizeof_gr_complex, 
"chunks2symbols.dat"))
+        self._fg.connect(self.rrc_filter,
+                         gr.file_sink(gr.sizeof_gr_complex, "rrc_filter.dat"))
 
     def add_options(parser):
         """
         Adds QPSK modulation-specific options to the standard parser
         """
-        parser.add_option("", "--excess-bw", type="float", default=0.3,
+        parser.add_option("", "--excess-bw", type="float", default=0.35,
                           help="set RRC excess bandwith factor 
[default=%default] (PSK)")
         parser.add_option("", "--no-gray-code", action="store_false", 
default=True,
                           help="Don't use gray coding on modulated bits 
[default=%default] (PSK)")
@@ -156,9 +158,9 @@
 # /////////////////////////////////////////////////////////////////////////////
 
 class dqpsk_demod(gr.hier_block):
-    def __init__(self, fg, samples_per_symbol, excess_bw=0.35,
-                 costas_alpha=0.005, gain_mu=0.05, mu=0.5,
-                 gray_code=True, verbose=True, debug=False):
+    def __init__(self, fg, samples_per_symbol, excess_bw=0.35, 
costas_alpha=0.05,
+                 gain_mu=0.03, mu=0.05, omega_relative_limit=0.005,
+                 gray_code=True, verbose=True, log=False):
         """
        Hierarchical block for RRC-filtered DQPSK demodulation
 
@@ -173,8 +175,12 @@
        @type excess_bw: float
         @param costas_alpha: loop filter gain
         @type costas_alphas: float
-        @param gain_mu:
+        @param gain_mu: for M&M block
         @type gain_mu: float
+        @param mu: for M&M block
+        @type mu: float
+        @param omega_relative_limit: for M&M block
+        @type omega_relative_limit: float
         @param gray_code: Tell modulator to Gray code the bits
         @type gray_code: bool
         @param verbose: Print information about modulator?
@@ -188,6 +194,8 @@
         self._excess_bw = excess_bw
         self._costas_alpha = costas_alpha
         self._gain_mu = gain_mu
+        self._mu = mu
+        self._omega_relative_limit = omega_relative_limit
 
         if samples_per_symbol < 2:
             raise TypeError, "sbp must be >= 2, is %d" % samples_per_symbol
@@ -195,9 +203,10 @@
         arity = pow(2,self.bits_per_symbol())
  
         # Automatic gain control
-        self.preamp = gr.multiply_const_cc(10e-5)
-        self.agc = gr.agc_cc(1e-3, 1, 1)
-        
+        scale = (1.0/16384.0)
+        self.pre_scaler = gr.multiply_const_cc(scale)   # scale the signal 
from full-range to +-1
+        self.agc = gr.agc2_cc(1e-1, 1e-3, 1, 1, 1000)
+       
         # Costas loop (carrier tracking)
         # FIXME: need to decide how to handle this more generally; do we pull 
it from higher layer?
         costas_order = 4
@@ -207,33 +216,30 @@
         # RRC data filter
         ntaps = 11 * samples_per_symbol
         self.rrc_taps = gr.firdes.root_raised_cosine(
-            1.0,                # gain 
-            samples_per_symbol, # sampling rate
-            1.0,                # symbol rate
-            excess_bw,          # excess bandwidth (roll-off factor)
+            self._samples_per_symbol, # gain
+            self._samples_per_symbol, # sampling rate
+            1.0,                      # symbol rate
+            self._excess_bw,          # excess bandwidth (roll-off factor)
             ntaps)
 
         self.rrc_filter=gr.fir_filter_ccf(1, self.rrc_taps)
 
         # symbol clock recovery
-        omega = samples_per_symbol
-        gain_omega = .25 * gain_mu * gain_mu
-        omega_rel_limit = 0.5
-        mu = 0.05
-        gain_mu = 0.1
+        omega = self._samples_per_symbol
+        gain_omega = .25 * self._gain_mu * self._gain_mu
         self.clock_recovery=gr.clock_recovery_mm_cc(omega, gain_omega,
-                                                    mu, self._gain_mu,
-                                                    omega_rel_limit)
+                                                    self._mu, self._gain_mu,
+                                                    self._omega_relative_limit)
 
+        self.diffdec = gr.diff_phasor_cc()
+        #self.diffdec = gr.diff_decoder_bb(arity)
+
         # find closest constellation point
+        rot = 1
         #rot = .707 + .707j
-        rot = 1
         rotated_const = map(lambda pt: pt * rot, psk.constellation[arity])
         print "rotated_const = %s" % rotated_const
 
-        self.diffdec = gr.diff_phasor_cc()
-        #self.diffdec = gr.diff_decoder_bb(arity)
-
         self.slicer = gr.constellation_decoder_cb(rotated_const, range(arity))
         self.gray_decoder = gr.map_bb(psk.gray_to_binary[arity])
         
@@ -243,13 +249,13 @@
         if verbose:
             self._print_verbage()
         
-        if debug:
+        if log:
             self._setup_logging()
  
         # Connect & Initialize base class
-        self._fg.connect(self.preamp, self.agc, self.costas_loop, 
self.rrc_filter, self.clock_recovery,
+        self._fg.connect(self.pre_scaler, self.agc, self.costas_loop, 
self.rrc_filter, self.clock_recovery,
                          self.diffdec, self.slicer, self.gray_decoder, 
self.unpack)
-        gr.hier_block.__init__(self, self._fg, self.preamp, self.unpack)
+        gr.hier_block.__init__(self, self._fg, self.pre_scaler, self.unpack)
 
     def samples_per_symbol(self):
         return self._samples_per_symbol
@@ -262,43 +268,46 @@
         print "bits per symbol = %d"         % self.bits_per_symbol()
         print "RRC roll-off factor = %.2f"   % self._excess_bw
         print "Costas Loop alpha = %.5f"     % self._costas_alpha
-        print "M&M symbol sync gain  = %.5f" % self._gain_mu
+        print "M&M symbol sync gain = %.5f" % self._gain_mu
+        print "M&M symbol sync mu = %.5f"   % self._mu
+        print "M&M omega relative limit = %.5f" % self._omega_relative_limit
 
     def _setup_logging(self):
         print "Modulation logging turned on."
-        self.fg.connect(self.agc,
-                        gr.file_sink(gr.sizeof_gr_complex, "agc.dat"))
-        self.fg.connect(self.costas_loop,
-                        gr.file_sink(gr.sizeof_gr_complex, "costas_loop.dat"))
-        self.fg.connect(self.rrc_filter,
-                        gr.file_sink(gr.sizeof_gr_complex, "rrc.dat"))
-        self.fg.connect(self.clock_recovery,
-                        gr.file_sink(gr.sizeof_gr_complex, 
"clock_recovery.dat"))
-        self.fg.connect(self.diffdec,
-                        gr.file_sink(gr.sizeof_gr_complex, "diffdec.dat"))     
   
-        self.fg.connect(self.slicer,
-                        gr.file_sink(gr.sizeof_char, "slicer.dat"))
-        self.fg.connect(self.gray_decoder,
-                        gr.file_sink(gr.sizeof_char, "gray_decoder.dat"))
-        self.fg.connect(self.unpack,
-                        gr.file_sink(gr.sizeof_char, "unpack.dat"))
-        self.fg.connect((self.costas_loop,1),
-                        gr.file_sink(gr.sizeof_gr_complex, "costas.dat"))
+        self._fg.connect(self.agc,
+                         gr.file_sink(gr.sizeof_gr_complex, "agc.dat"))
+        self._fg.connect(self.costas_loop,
+                         gr.file_sink(gr.sizeof_gr_complex, "costas_loop.dat"))
+        self._fg.connect((self.costas_loop,1),
+                         gr.file_sink(gr.sizeof_gr_complex, 
"costas_error.dat"))
+        self._fg.connect(self.rrc_filter,
+                         gr.file_sink(gr.sizeof_gr_complex, "rrc_filter.dat"))
+        self._fg.connect(self.clock_recovery,
+                         gr.file_sink(gr.sizeof_gr_complex, 
"clock_recovery.dat"))
+        self._fg.connect((self.clock_recovery,1),
+                        gr.file_sink(gr.sizeof_gr_complex, 
"clock_recovery_error.dat"))
+        self._fg.connect(self.diffdec,
+                         gr.file_sink(gr.sizeof_gr_complex, "diffdec.dat"))    
    
+        self._fg.connect(self.slicer,
+                         gr.file_sink(gr.sizeof_char, "slicer.dat"))
+        self._fg.connect(self.gray_decoder,
+                         gr.file_sink(gr.sizeof_char, "gray_decoder.dat"))
+        self._fg.connect(self.unpack,
+                         gr.file_sink(gr.sizeof_char, "unpack.dat"))
 
-
     def add_options(parser):
         """
         Adds modulation-specific options to the standard parser
         """
-        parser.add_option("", "--excess-bw", type="float", default=0.3,
+        parser.add_option("", "--excess-bw", type="float", default=0.35,
                           help="set RRC excess bandwith factor 
[default=%default] (PSK)")
         parser.add_option("", "--no-gray-code", action="store_false", 
default=True,
                           help="Don't use gray coding on modulated bits 
[default=%default] (PSK)")
-        parser.add_option("", "--costas-alpha", type="float", default=0.005,
+        parser.add_option("", "--costas-alpha", type="float", default=0.05,
                           help="set Costas loop alpha value [default=%default] 
(PSK)")
         parser.add_option("", "--gain-mu", type="float", default=0.05,
                           help="set M&M symbol sync loop gain mu value 
[default=%default] (PSK)")
-        parser.add_option("", "--mu", type="float", default=0.5,
+        parser.add_option("", "--mu", type="float", default=0.005,
                           help="set M&M symbol sync loop mu value 
[default=%default] (PSK)")
     add_options=staticmethod(add_options)
 

Modified: 
gnuradio/branches/developers/eb/digital-wip/gnuradio-core/src/python/gnuradio/blksimpl/gmsk.py
===================================================================
--- 
gnuradio/branches/developers/eb/digital-wip/gnuradio-core/src/python/gnuradio/blksimpl/gmsk.py
      2006-09-22 17:52:55 UTC (rev 3615)
+++ 
gnuradio/branches/developers/eb/digital-wip/gnuradio-core/src/python/gnuradio/blksimpl/gmsk.py
      2006-09-22 18:04:26 UTC (rev 3616)
@@ -37,7 +37,7 @@
 
 class gmsk_mod(gr.hier_block):
 
-    def __init__(self, fg, samples_per_symbol=2, bt=0.3, verbose=True, 
debug=False):
+    def __init__(self, fg, samples_per_symbol=2, bt=0.35, verbose=True, 
log=False):
         """
        Hierarchical block for Gaussian Minimum Shift Key (GMSK)
        modulation.
@@ -73,10 +73,10 @@
        # Form Gaussian filter
         # Generate Gaussian response (Needs to be convolved with window below).
        self.gaussian_taps = gr.firdes.gaussian(
-               1,              # gain
-               samples_per_symbol,            # symbol_rate
-               bt,             # bandwidth * symbol time
-               ntaps           # number of taps
+               1,                     # gain
+               samples_per_symbol,    # symbol_rate
+               bt,                    # bandwidth * symbol time
+               ntaps                  # number of taps
                )
 
        self.sqwave = (1,) * samples_per_symbol       # rectangular window
@@ -89,7 +89,7 @@
         if verbose:
             self._print_verbage()
          
-        if debug:
+        if log:
             self._setup_logging()
 
        # Connect & Initialize base class
@@ -123,7 +123,7 @@
         """
         Adds GMSK modulation-specific options to the standard parser
         """
-        parser.add_option("", "--bt", type="float", default=0.3,
+        parser.add_option("", "--bt", type="float", default=0.35,
                           help="set bandwidth-time product [default=%default] 
(GMSK)")
     add_options=staticmethod(add_options)
 
@@ -144,9 +144,10 @@
 
 class gmsk_demod(gr.hier_block):
 
-    def __init__(self, fg, samples_per_symbol=2, omega=None, gain_mu=0.03, 
mu=0.5,
-                 omega_relative_limit=0.000200, freq_error=0.0,
-                 verbose=True, debug=False):
+    def __init__(self, fg, samples_per_symbol=2,
+                 omega=None, gain_mu=0.05, mu=0.5,
+                 omega_relative_limit=0.005, freq_error=0.0,
+                 verbose=True, log=False):
         """
        Hierarchical block for Gaussian Minimum Shift Key (GMSK)
        demodulation.
@@ -160,8 +161,8 @@
        @type samples_per_symbol: integer
         @param verbose: Print information about modulator?
         @type verbose: bool
-        @param debug: Print modualtion data to files?
-        @type debug: bool 
+        @param log: Print modualtion data to files?
+        @type log: bool 
 
         Clock recovery parameters.  These all have reasonble defaults.
         
@@ -194,8 +195,9 @@
        self._gain_omega = .25 * self._gain_mu * self._gain_mu        # 
critically damped
 
         # Automatic gain control
-        self.preamp = gr.multiply_const_cc(10e-5)
-        self.agc = gr.agc_cc(1e-3, 1, 1, 1000)
+        scale = (1.0/16384.0)
+        self.pre_scaler = gr.multiply_const_cc(scale)   # scale the signal 
from full-range to +-1
+        self.agc = gr.agc2_cc(1e-1, 1e-3, 1, 1, 1000)
 
        # Demodulate FM
        sensitivity = (pi / 2) / samples_per_symbol
@@ -213,12 +215,12 @@
         if verbose:
             self._print_verbage()
          
-        if debug:
+        if log:
             self._setup_logging()
 
        # Connect & Initialize base class
-       self._fg.connect(self.preamp, self.agc, self.fmdemod, 
self.clock_recovery, self.slicer)
-       gr.hier_block.__init__(self, self._fg, self.preamp, self.slicer)
+       self._fg.connect(self.pre_scaler, self.agc, self.fmdemod, 
self.clock_recovery, self.slicer)
+       gr.hier_block.__init__(self, self._fg, self.pre_scaler, self.slicer)
 
     def samples_per_symbol(self):
         return self._samples_per_symbol
@@ -254,12 +256,12 @@
         """
         parser.add_option("", "--omega", type="float", default=None,
                           help="M&M clock recovery omega [default=%default] 
(GMSK)")
-        parser.add_option("", "--gain-mu", type="float", default=0.03,
-                          help="M&M clock recovery gain mu [default=%default] 
(GMSK)")
+        parser.add_option("", "--gain-mu", type="float", default=0.05,
+                          help="M&M clock recovery gain mu [default=%default] 
(GMSK/PSK)")
         parser.add_option("", "--mu", type="float", default=0.5,
-                          help="M&M clock recovery mu [default=%default] 
(GMSK)")
-        parser.add_option("", "--omega-relative-limit", type="float", 
default=0.0002,
-                          help="M&M clock recovery omega relative limit 
[default=%default] (GMSK)")
+                          help="M&M clock recovery mu [default=%default] 
(GMSK/PSK)")
+        parser.add_option("", "--omega-relative-limit", type="float", 
default=0.005,
+                          help="M&M clock recovery omega relative limit 
[default=%default] (GMSK/PSK)")
         parser.add_option("", "--freq-error", type="float", default=0.0,
                           help="M&M clock recovery frequency error 
[default=%default] (GMSK)")
     add_options=staticmethod(add_options)

Modified: 
gnuradio/branches/developers/eb/digital-wip/gnuradio-core/src/python/gnuradio/blksimpl/psk.py
===================================================================
--- 
gnuradio/branches/developers/eb/digital-wip/gnuradio-core/src/python/gnuradio/blksimpl/psk.py
       2006-09-22 17:52:55 UTC (rev 3615)
+++ 
gnuradio/branches/developers/eb/digital-wip/gnuradio-core/src/python/gnuradio/blksimpl/psk.py
       2006-09-22 18:04:26 UTC (rev 3616)
@@ -53,7 +53,7 @@
 # Don't Gray code
 # -----------------------
 # identity mapping
-binary_to_gray = {
+binary_to_ungray = {
     2 : (0, 1),
     4 : (0, 1, 2, 3),
     8 : (0, 1, 2, 3, 4, 5, 6, 7)





reply via email to

[Prev in Thread] Current Thread [Next in Thread]