From 28bcffdea069764716a769eb3e344c748bc705f6 Mon Sep 17 00:00:00 2001
From: Tom <trondeau@vt.edu>
Date: Tue, 6 Oct 2009 10:23:47 -0700
Subject: wip on clock sync block; exposing set gain function

---
 .../src/lib/filter/gr_pfb_clock_sync_ccf.cc        | 36 ++++++++++++----------
 .../src/lib/filter/gr_pfb_clock_sync_ccf.h         |  9 ++++--
 .../src/lib/filter/gr_pfb_clock_sync_ccf.i         |  1 +
 3 files changed, 27 insertions(+), 19 deletions(-)

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
index 91cbf74c6b..5577e42c8a 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
@@ -60,7 +60,7 @@ gr_pfb_clock_sync_ccf::gr_pfb_clock_sync_ccf (float sps, float gain,
   // set it here to the fractional difference based on the initial phaes
   // assert(init_phase <= 2*M_PI);
   float x = init_phase / (2*M_PI); //normalize initial phase
-  d_acc = x*(d_nfilters-1);
+  d_acc = 0.5; //x*(d_nfilters-1);
   d_last_filter = (int)floor(d_acc);
   d_acc = fmodf(d_acc, 1);
   d_start_count = 0;
@@ -133,12 +133,22 @@ void
 gr_pfb_clock_sync_ccf::create_diff_taps(const std::vector<float> &newtaps,
 					std::vector<float> &difftaps)
 {
+  float maxtap = -1e12;
   difftaps.clear();
   difftaps.push_back(0); //newtaps[0]);
   for(unsigned int i = 1; i < newtaps.size()-1; i++) {
-    difftaps.push_back(newtaps[i+1] - newtaps[i-1]);
+    float tap = newtaps[i+1] - newtaps[i-1];
+    if(tap > maxtap) {
+     maxtap = tap;
+    }
+    //maxtap += tap;
+    difftaps.push_back(tap);
   }
   difftaps.push_back(0);//-newtaps[newtaps.size()-1]);
+
+  for(unsigned int i = 0; i < difftaps.size(); i++) {
+    difftaps[i] /= 1;//maxtap;
+  }
 }
 
 void
@@ -219,24 +229,18 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items,
     err[i] = error;
 
     d_acc += d_alpha*error;
-    gr_branchless_clip(d_acc, 1);
-
-    int newfilter;
-    newfilter = (int)((float)d_last_filter + d_acc);
-    if(newfilter != (int)d_last_filter)
-      d_acc = 0.5;
-
-    if(newfilter >= (int)d_nfilters) {
-      d_last_filter = newfilter - d_nfilters;
+    if(d_acc >= (int)d_nfilters) {
+      d_acc -= d_nfilters;
       count++;
     }
-    else if(newfilter < 0) {
-      d_last_filter = d_nfilters + newfilter;
+    else if(d_acc < 0) {
+      d_acc += d_nfilters-1;
       count--;
     }
-    else {
-      d_last_filter = newfilter;
-    }
+
+    d_last_filter = (int)floor(d_acc);
+    printf("error: %e  d_acc: %e  filter: %d\n",
+	   error, d_acc, d_last_filter);
 
     i++;
     count += d_sps;
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
index 1a04e55c75..d99bd6fe71 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
@@ -29,9 +29,9 @@
 class gr_pfb_clock_sync_ccf;
 typedef boost::shared_ptr<gr_pfb_clock_sync_ccf> gr_pfb_clock_sync_ccf_sptr;
 gr_pfb_clock_sync_ccf_sptr gr_make_pfb_clock_sync_ccf (float sps, float gain,
-							   const std::vector<float> &taps,
-							   unsigned int filter_size=32,
-							   float init_phase=0);
+						       const std::vector<float> &taps,
+						       unsigned int filter_size=32,
+						       float init_phase=0);
 
 class gr_fir_ccf;
 
@@ -96,6 +96,9 @@ public:
    */
   void print_taps();
   void print_diff_taps();
+
+  void set_gain(float gain)
+  { d_alpha = gain; }
   
   int general_work (int noutput_items,
 		    gr_vector_int &ninput_items,
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.i b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.i
index 729d4a1aa9..9defbc7cd0 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.i
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.i
@@ -46,4 +46,5 @@ class gr_pfb_clock_sync_ccf : public gr_block
   std::vector<float> diff_channel_taps(int channel);
   void print_taps();
   void print_diff_taps();
+  void set_gain(float gain);
 };
-- 
cgit v1.2.3


From eee064ca72cbc9779eaae2f20e18f74ff7925574 Mon Sep 17 00:00:00 2001
From: Tom <trondeau@vt.edu>
Date: Tue, 6 Oct 2009 10:24:38 -0700
Subject: Using PFB clock recovery for testing

---
 .../src/python/gnuradio/blks2impl/dbpsk.py         | 40 ++++++++++++++++------
 .../src/python/gnuradio/blks2impl/dqpsk.py         | 37 ++++++++++++++------
 2 files changed, 57 insertions(+), 20 deletions(-)

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/dbpsk.py b/gnuradio-core/src/python/gnuradio/blks2impl/dbpsk.py
index 3147bfa2ab..ac2e9323fb 100644
--- a/gnuradio-core/src/python/gnuradio/blks2impl/dbpsk.py
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/dbpsk.py
@@ -255,16 +255,34 @@ class dbpsk_demod(gr.hier_block2):
         self._mm_omega = self._samples_per_symbol
         self._mm_gain_omega = .25 * self._mm_gain_mu * self._mm_gain_mu
         self._costas_beta  = 0.25 * self._costas_alpha * self._costas_alpha
-        fmin = -0.1
-        fmax = 0.1
+        fmin = -0.25
+        fmax = 0.25
         
-        self.receiver=gr.mpsk_receiver_cc(arity, 0,
-                                         self._costas_alpha, self._costas_beta,
-                                         fmin, fmax,
-                                         self._mm_mu, self._mm_gain_mu,
-                                         self._mm_omega, self._mm_gain_omega,
-                                         self._mm_omega_relative_limit)
-
+        #self.receiver=gr.mpsk_receiver_cc(arity, 0,
+        #                                 self._costas_alpha, self._costas_beta,
+        #                                 fmin, fmax,
+        #                                 self._mm_mu, self._mm_gain_mu,
+        #                                 self._mm_omega, self._mm_gain_omega,
+        #                                 self._mm_omega_relative_limit)
+
+        self.clock_recov = gr.costas_loop_cc(self._costas_alpha,
+                                             self._costas_beta,
+                                             fmax, fmin, arity)
+        if 0:
+            self.time_recov = gr.clock_recovery_mm_cc(self._mm_omega,
+                                                      self._mm_gain_omega,
+                                                      self._mm_mu,
+                                                      self._mm_gain_mu,
+                                                      self._mm_omega_relative_limit)
+        else:
+            nfilts = 8
+            ntaps = nfilts*ntaps
+            taps = gr.firdes.root_raised_cosine(
+                nfilts, 1.0, 0.25/nfilts, self._excess_bw, ntaps)
+            self.time_recov = gr.pfb_clock_sync_ccf(self._mm_omega,
+                                                    self._mm_gain_mu,
+                                                    taps, nfilts)
+            
         # Do differential decoding based on phase change of symbols
         self.diffdec = gr.diff_phasor_cc()
 
@@ -288,7 +306,9 @@ class dbpsk_demod(gr.hier_block2):
             self._setup_logging()
 
         # Connect and Initialize base class
-        self.connect(self, self.pre_scaler, self.agc, self.rrc_filter, self.receiver,
+        self.connect(self, self.pre_scaler, self.agc, #self.rrc_filter, self.receiver,
+                     #self.clock_recov,
+                     self.time_recov,
                      self.diffdec, self.slicer, self.symbol_mapper, self.unpack, self)
 
     def samples_per_symbol(self):
diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/dqpsk.py b/gnuradio-core/src/python/gnuradio/blks2impl/dqpsk.py
index 8c15d21734..34e6581bf7 100644
--- a/gnuradio-core/src/python/gnuradio/blks2impl/dqpsk.py
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/dqpsk.py
@@ -255,16 +255,32 @@ class dqpsk_demod(gr.hier_block2):
         self._mm_omega = self._samples_per_symbol
         self._mm_gain_omega = .25 * self._mm_gain_mu * self._mm_gain_mu
         self._costas_beta  = 0.25 * self._costas_alpha * self._costas_alpha
-        fmin = -0.025
-        fmax = 0.025
+        fmin = -0.25
+        fmax = 0.25
+        
+        #self.receiver=gr.mpsk_receiver_cc(arity, pi/4.0,
+        #                                  self._costas_alpha, self._costas_beta,
+        #                                  fmin, fmax,
+        #                                  self._mm_mu, self._mm_gain_mu,
+        #                                  self._mm_omega, self._mm_gain_omega,
+        #                                  self._mm_omega_relative_limit)
+        self.clock_recov = gr.costas_loop_cc(self._costas_alpha,
+                                             self._costas_beta,
+                                             fmax, fmin, arity)
+        if 0:
+            self.time_recov = gr.clock_recovery_mm_cc(self._mm_omega,
+                                                      self._mm_gain_omega,
+                                                      self._mm_mu,
+                                                      self._mm_gain_mu,
+                                                      self._mm_omega_relative_limit)
+        else:
+            ntaps = 32*ntaps
+            taps = gr.firdes.root_raised_cosine(
+                32, 1.0, 0.25/32.0, self._excess_bw, ntaps)
+            self.time_recov = gr.pfb_clock_sync_ccf(self._mm_omega,
+                                                    self._mm_gain_mu,
+                                                    taps)
         
-        self.receiver=gr.mpsk_receiver_cc(arity, pi/4.0,
-                                          self._costas_alpha, self._costas_beta,
-                                          fmin, fmax,
-                                          self._mm_mu, self._mm_gain_mu,
-                                          self._mm_omega, self._mm_gain_omega,
-                                          self._mm_omega_relative_limit)
-
         # Perform Differential decoding on the constellation
         self.diffdec = gr.diff_phasor_cc()
         
@@ -288,7 +304,8 @@ class dqpsk_demod(gr.hier_block2):
             self._setup_logging()
  
         # Connect & Initialize base class
-        self.connect(self, self.pre_scaler, self.agc, self.rrc_filter, self.receiver,
+        self.connect(self, self.pre_scaler, self.agc, #self.rrc_filter, #self.receiver,
+                     self.clock_recov, self.time_recov,
                      self.diffdec, self.slicer, self.symbol_mapper, self.unpack, self)
 
     def samples_per_symbol(self):
-- 
cgit v1.2.3


From 314726ae7457b37f442a2751285b75b0d616c0f4 Mon Sep 17 00:00:00 2001
From: Tom <trondeau@vt.edu>
Date: Tue, 6 Oct 2009 10:29:06 -0700
Subject: Should not be clipping the error here.

---
 gnuradio-core/src/lib/general/gr_mpsk_receiver_cc.cc | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/lib/general/gr_mpsk_receiver_cc.cc b/gnuradio-core/src/lib/general/gr_mpsk_receiver_cc.cc
index 49bbb8d360..89ea4a232c 100644
--- a/gnuradio-core/src/lib/general/gr_mpsk_receiver_cc.cc
+++ b/gnuradio-core/src/lib/general/gr_mpsk_receiver_cc.cc
@@ -35,7 +35,7 @@
 
 #define M_TWOPI (2*M_PI)
 #define VERBOSE_MM     0     // Used for debugging symbol timing loop
-#define VERBOSE_COSTAS 0     // Used for debugging phase and frequency tracking
+#define VERBOSE_COSTAS 1     // Used for debugging phase and frequency tracking
 
 // Public constructor
 
@@ -265,8 +265,6 @@ gr_mpsk_receiver_cc::phase_error_tracking(gr_complex sample)
 
   // Make phase and frequency corrections based on sampled value
   phase_error = (*this.*d_phase_error_detector)(sample);
-
-  phase_error = gr_branchless_clip(phase_error, 1.0);
     
   d_freq += d_beta*phase_error;             // adjust frequency based on error
   d_phase += d_freq + d_alpha*phase_error;  // adjust phase based on error
-- 
cgit v1.2.3


From c014a0926d24d0edf10ced7ce122d154b7e33f18 Mon Sep 17 00:00:00 2001
From: Tom <trondeau@vt.edu>
Date: Tue, 6 Oct 2009 13:50:54 -0700
Subject: Making second output port of PFB clock recovery optional.

---
 gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
index 5577e42c8a..f7dd946855 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
@@ -50,7 +50,7 @@ gr_pfb_clock_sync_ccf::gr_pfb_clock_sync_ccf (float sps, float gain,
 					      float init_phase)
   : gr_block ("pfb_clock_sync_ccf",
 	      gr_make_io_signature (1, 1, sizeof(gr_complex)),
-	      gr_make_io_signature2 (2, 2, sizeof(gr_complex), sizeof(float))),
+	      gr_make_io_signature2 (1, 2, sizeof(gr_complex), sizeof(float))),
     d_updated (false), d_sps(sps), d_alpha(gain)
 {
   d_nfilters = filter_size;
@@ -209,7 +209,10 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items,
 {
   gr_complex *in = (gr_complex *) input_items[0];
   gr_complex *out = (gr_complex *) output_items[0];
-  float *err = (float *) output_items[1];
+
+  float *err;
+  if(ninput_items.size() == 2)
+    err = (float *) output_items[1];
   
   if (d_updated) {
     d_updated = false;
@@ -226,7 +229,9 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items,
   while((i < noutput_items) && (count < nrequired)) {
     out[i] = d_filters[d_last_filter]->filter(&in[count]);
     error =  (out[i] * d_diff_filters[d_last_filter]->filter(&in[count])).real();
-    err[i] = error;
+
+    if(ninput_items.size() == 2)
+      err[i] = error;
 
     d_acc += d_alpha*error;
     if(d_acc >= (int)d_nfilters) {
-- 
cgit v1.2.3


From 9d3f297ded7d78e49760c17696df49a5a7f920f8 Mon Sep 17 00:00:00 2001
From: Tom <trondeau@vt.edu>
Date: Tue, 6 Oct 2009 15:19:12 -0700
Subject: Changinging behavior of parameter update for PFB clock recovery alg.

---
 .../src/lib/filter/gr_pfb_clock_sync_ccf.cc        | 32 +++++++++++-----------
 .../src/lib/filter/gr_pfb_clock_sync_ccf.h         | 10 +++++--
 2 files changed, 23 insertions(+), 19 deletions(-)

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
index f7dd946855..b67efc52d4 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
@@ -51,7 +51,7 @@ gr_pfb_clock_sync_ccf::gr_pfb_clock_sync_ccf (float sps, float gain,
   : gr_block ("pfb_clock_sync_ccf",
 	      gr_make_io_signature (1, 1, sizeof(gr_complex)),
 	      gr_make_io_signature2 (1, 2, sizeof(gr_complex), sizeof(float))),
-    d_updated (false), d_sps(sps), d_alpha(gain)
+    d_updated (false), d_sps(sps)
 {
   d_nfilters = filter_size;
 
@@ -59,10 +59,9 @@ gr_pfb_clock_sync_ccf::gr_pfb_clock_sync_ccf (float sps, float gain,
   // The accumulator keeps track of overflow to increment the stride correctly.
   // set it here to the fractional difference based on the initial phaes
   // assert(init_phase <= 2*M_PI);
-  float x = init_phase / (2*M_PI); //normalize initial phase
-  d_acc = 0.5; //x*(d_nfilters-1);
-  d_last_filter = (int)floor(d_acc);
-  d_acc = fmodf(d_acc, 1);
+  set_gain(gain);
+  d_k = d_nfilters / 2;
+  d_rate = 0;
   d_start_count = 0;
   
 
@@ -227,28 +226,29 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items,
 
   // produce output as long as we can and there are enough input samples
   while((i < noutput_items) && (count < nrequired)) {
-    out[i] = d_filters[d_last_filter]->filter(&in[count]);
-    error =  (out[i] * d_diff_filters[d_last_filter]->filter(&in[count])).real();
+    int filtnum = (int)d_k;
+    out[i] = d_filters[filtnum]->filter(&in[count]);
+    error =  (out[i] * d_diff_filters[filtnum]->filter(&in[count])).real();
 
     if(ninput_items.size() == 2)
       err[i] = error;
 
-    d_acc += d_alpha*error;
-    if(d_acc >= (int)d_nfilters) {
-      d_acc -= d_nfilters;
+    d_k = d_k + d_alpha*error + d_rate;
+    d_rate = d_rate + d_beta*error;
+    while(d_k >= d_nfilters) {
+      d_k -= d_nfilters;
       count++;
     }
-    else if(d_acc < 0) {
-      d_acc += d_nfilters-1;
+    while(d_k < 0) {
+      d_k += d_nfilters;
       count--;
     }
 
-    d_last_filter = (int)floor(d_acc);
-    printf("error: %e  d_acc: %e  filter: %d\n",
-	   error, d_acc, d_last_filter);
-
     i++;
     count += d_sps;
+
+    printf("error: %f  k: %f  rate: %f\n",
+	   error, d_k, d_rate);
   }
 
   // Set the start index at the next entrance to the work function
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
index d99bd6fe71..b8e0f83b68 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
@@ -58,13 +58,14 @@ class gr_pfb_clock_sync_ccf : public gr_block
   bool			   d_updated;
   unsigned int             d_sps;
   float                    d_alpha;
+  float                    d_beta;
   unsigned int             d_nfilters;
   std::vector<gr_fir_ccf*> d_filters;
   std::vector<gr_fir_ccf*> d_diff_filters;
   std::vector< std::vector<float> > d_taps;
   std::vector< std::vector<float> > d_dtaps;
-  float                    d_acc;
-  unsigned int             d_last_filter;
+  float                    d_k;
+  float                    d_rate;
   unsigned int             d_start_count;
   unsigned int             d_taps_per_filter;
 
@@ -98,7 +99,10 @@ public:
   void print_diff_taps();
 
   void set_gain(float gain)
-  { d_alpha = gain; }
+  { 
+    d_alpha = gain;
+    d_beta = 0.25*d_alpha*d_alpha;
+  }
   
   int general_work (int noutput_items,
 		    gr_vector_int &ninput_items,
-- 
cgit v1.2.3


From af609b2ba2abcff069412e1348156dcec7981ff8 Mon Sep 17 00:00:00 2001
From: Tom <trondeau@vt.edu>
Date: Tue, 6 Oct 2009 17:49:49 -0700
Subject: Adding more outputs for debugging.

---
 .../src/lib/filter/gr_pfb_clock_sync_ccf.cc          | 20 +++++++++++++-------
 1 file changed, 13 insertions(+), 7 deletions(-)

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
index b67efc52d4..79779c91cf 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
@@ -209,9 +209,12 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items,
   gr_complex *in = (gr_complex *) input_items[0];
   gr_complex *out = (gr_complex *) output_items[0];
 
-  float *err;
-  if(ninput_items.size() == 2)
+  float *err, *outrate, *outk;
+  if(output_items.size() > 2) {
     err = (float *) output_items[1];
+    outrate = (float*)output_items[2];
+    outk = (float*)output_items[3];
+  }
   
   if (d_updated) {
     d_updated = false;
@@ -230,9 +233,6 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items,
     out[i] = d_filters[filtnum]->filter(&in[count]);
     error =  (out[i] * d_diff_filters[filtnum]->filter(&in[count])).real();
 
-    if(ninput_items.size() == 2)
-      err[i] = error;
-
     d_k = d_k + d_alpha*error + d_rate;
     d_rate = d_rate + d_beta*error;
     while(d_k >= d_nfilters) {
@@ -247,8 +247,14 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items,
     i++;
     count += d_sps;
 
-    printf("error: %f  k: %f  rate: %f\n",
-	   error, d_k, d_rate);
+    if(output_items.size() > 2) {
+      err[i] = error;
+      outrate[i] = d_rate;
+      outk[i] = d_k;
+    }
+
+    //printf("error: %f  k: %f  rate: %f\n",
+    //	   error, d_k, d_rate);
   }
 
   // Set the start index at the next entrance to the work function
-- 
cgit v1.2.3


From dd7adee2762b62adf80c3e4fa87d42557a7a78d2 Mon Sep 17 00:00:00 2001
From: Tom <trondeau@vt.edu>
Date: Tue, 6 Oct 2009 18:15:11 -0700
Subject: Fixing io signature for debug outputs.

---
 gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
index 79779c91cf..60ce5d2b3e 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
@@ -43,14 +43,15 @@ gr_pfb_clock_sync_ccf_sptr gr_make_pfb_clock_sync_ccf (float sps, float gain,
 								init_phase));
 }
 
-
+int ios[] = {sizeof(gr_complex), sizeof(float), sizeof(float), sizeof(float)};
+std::vector<int> iosig(ios, ios+sizeof(ios)/sizeof(int));
 gr_pfb_clock_sync_ccf::gr_pfb_clock_sync_ccf (float sps, float gain,
 					      const std::vector<float> &taps,
 					      unsigned int filter_size,
 					      float init_phase)
   : gr_block ("pfb_clock_sync_ccf",
 	      gr_make_io_signature (1, 1, sizeof(gr_complex)),
-	      gr_make_io_signature2 (1, 2, sizeof(gr_complex), sizeof(float))),
+	      gr_make_io_signaturev (1, 4, iosig)),
     d_updated (false), d_sps(sps)
 {
   d_nfilters = filter_size;
-- 
cgit v1.2.3


From 45286cd769e42c325b7c65a2f0a96757e2e97b97 Mon Sep 17 00:00:00 2001
From: Tom <trondeau@vt.edu>
Date: Tue, 6 Oct 2009 19:31:45 -0700
Subject: Adding accessor functions for both alpha and beta.

---
 .../src/lib/filter/gr_pfb_clock_sync_ccf.cc        |   3 +-
 .../src/lib/filter/gr_pfb_clock_sync_ccf.h         |   9 +-
 .../src/lib/filter/gr_pfb_clock_sync_ccf.i         |   3 +-
 gnuradio-examples/grc/demod/pam_timing.grc         | 373 ++++++++++++++-------
 grc/blocks/gr_pfb_clock_sync.xml                   |  11 +-
 5 files changed, 273 insertions(+), 126 deletions(-)

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
index 60ce5d2b3e..62282fd6af 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
@@ -60,7 +60,8 @@ gr_pfb_clock_sync_ccf::gr_pfb_clock_sync_ccf (float sps, float gain,
   // The accumulator keeps track of overflow to increment the stride correctly.
   // set it here to the fractional difference based on the initial phaes
   // assert(init_phase <= 2*M_PI);
-  set_gain(gain);
+  set_alpha(gain);
+  set_beta(0.25*gain*gain);
   d_k = d_nfilters / 2;
   d_rate = 0;
   d_start_count = 0;
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
index b8e0f83b68..5a60619319 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
@@ -98,10 +98,13 @@ public:
   void print_taps();
   void print_diff_taps();
 
-  void set_gain(float gain)
+  void set_alpha(float alpha)
   { 
-    d_alpha = gain;
-    d_beta = 0.25*d_alpha*d_alpha;
+    d_alpha = alpha;
+  }
+  void set_beta(float beta)
+  {
+    d_beta = beta;
   }
   
   int general_work (int noutput_items,
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.i b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.i
index 9defbc7cd0..7859154791 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.i
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.i
@@ -46,5 +46,6 @@ class gr_pfb_clock_sync_ccf : public gr_block
   std::vector<float> diff_channel_taps(int channel);
   void print_taps();
   void print_diff_taps();
-  void set_gain(float gain);
+  void set_alpha(float alpha);
+  void set_beta(float beta);
 };
diff --git a/gnuradio-examples/grc/demod/pam_timing.grc b/gnuradio-examples/grc/demod/pam_timing.grc
index 8722714b8f..4152d79a96 100644
--- a/gnuradio-examples/grc/demod/pam_timing.grc
+++ b/gnuradio-examples/grc/demod/pam_timing.grc
@@ -1,6 +1,6 @@
 <?xml version='1.0' encoding='ASCII'?>
 <flow_graph>
-  <timestamp>Tue Oct  6 18:00:19 2009</timestamp>
+  <timestamp>Tue Oct  6 19:23:45 2009</timestamp>
   <block>
     <key>options</key>
     <param>
@@ -367,29 +367,6 @@
       <value>0</value>
     </param>
   </block>
-  <block>
-    <key>variable</key>
-    <param>
-      <key>id</key>
-      <value>rrctaps</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>firdes.root_raised_cosine(nfilts,1.0,0.25/nfilts, .35, 11*spb*nfilts)</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(180, 935)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
   <block>
     <key>gr_throttle</key>
     <param>
@@ -463,37 +440,6 @@
       <value>0</value>
     </param>
   </block>
-  <block>
-    <key>gr_fractional_interpolator_xx</key>
-    <param>
-      <key>id</key>
-      <value>gr_fractional_interpolator_xx_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>type</key>
-      <value>complex</value>
-    </param>
-    <param>
-      <key>phase_shift</key>
-      <value>0.5</value>
-    </param>
-    <param>
-      <key>interp_ratio</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(349, 662)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
   <block>
     <key>variable</key>
     <param>
@@ -577,42 +523,53 @@
     </param>
   </block>
   <block>
-    <key>variable_slider</key>
+    <key>gr_add_xx</key>
     <param>
       <key>id</key>
-      <value>gain</value>
+      <value>gr_add_xx_0</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>label</key>
-      <value>Gain</value>
+      <key>type</key>
+      <value>float</value>
     </param>
     <param>
-      <key>value</key>
-      <value>0</value>
+      <key>num_inputs</key>
+      <value>2</value>
     </param>
     <param>
-      <key>min</key>
+      <key>vlen</key>
+      <value>1</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(482, 130)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
       <value>0</value>
     </param>
+  </block>
+  <block>
+    <key>notebook</key>
     <param>
-      <key>max</key>
-      <value>1</value>
+      <key>id</key>
+      <value>notebook_0</value>
     </param>
     <param>
-      <key>num_steps</key>
-      <value>1000</value>
+      <key>_enabled</key>
+      <value>True</value>
     </param>
     <param>
       <key>style</key>
-      <value>wx.SL_HORIZONTAL</value>
+      <value>wx.NB_TOP</value>
     </param>
     <param>
-      <key>converver</key>
-      <value>float_converter</value>
+      <key>labels</key>
+      <value>['error', 'phase', 'freq']</value>
     </param>
     <param>
       <key>grid_pos</key>
@@ -624,7 +581,7 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(757, -1)</value>
+      <value>(851, 531)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -632,10 +589,56 @@
     </param>
   </block>
   <block>
-    <key>gr_add_xx</key>
+    <key>variable</key>
     <param>
       <key>id</key>
-      <value>gr_add_xx_0</value>
+      <value>rrctaps</value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>value</key>
+      <value>firdes.root_raised_cosine(nfilts,1.0,0.25/nfilts, .35, 11*spb*nfilts)</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(110, 830)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+  </block>
+  <block>
+    <key>variable</key>
+    <param>
+      <key>id</key>
+      <value>initphase</value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>value</key>
+      <value>0.5</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(110, 913)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+  </block>
+  <block>
+    <key>gr_fractional_interpolator_xx</key>
+    <param>
+      <key>id</key>
+      <value>gr_fractional_interpolator_xx_0</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -643,19 +646,19 @@
     </param>
     <param>
       <key>type</key>
-      <value>float</value>
+      <value>complex</value>
     </param>
     <param>
-      <key>num_inputs</key>
-      <value>2</value>
+      <key>phase_shift</key>
+      <value>initphase</value>
     </param>
     <param>
-      <key>vlen</key>
-      <value>1</value>
+      <key>interp_ratio</key>
+      <value>interpratio</value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(482, 130)</value>
+      <value>(349, 662)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -663,22 +666,42 @@
     </param>
   </block>
   <block>
-    <key>notebook</key>
+    <key>variable_slider</key>
     <param>
       <key>id</key>
-      <value>notebook_0</value>
+      <value>interpratio</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
+    <param>
+      <key>label</key>
+      <value></value>
+    </param>
+    <param>
+      <key>value</key>
+      <value>1</value>
+    </param>
+    <param>
+      <key>min</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>max</key>
+      <value>2</value>
+    </param>
+    <param>
+      <key>num_steps</key>
+      <value>1000</value>
+    </param>
     <param>
       <key>style</key>
-      <value>wx.NB_TOP</value>
+      <value>wx.SL_HORIZONTAL</value>
     </param>
     <param>
-      <key>labels</key>
-      <value>['error', 'phase', 'freq']</value>
+      <key>converver</key>
+      <value>float_converter</value>
     </param>
     <param>
       <key>grid_pos</key>
@@ -690,7 +713,7 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(851, 531)</value>
+      <value>(232, 921)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -713,7 +736,7 @@
     </param>
     <param>
       <key>title</key>
-      <value>Scope Plot</value>
+      <value>Error</value>
     </param>
     <param>
       <key>samp_rate</key>
@@ -721,7 +744,7 @@
     </param>
     <param>
       <key>v_scale</key>
-      <value>0</value>
+      <value>.5</value>
     </param>
     <param>
       <key>t_scale</key>
@@ -780,7 +803,7 @@
     </param>
     <param>
       <key>v_scale</key>
-      <value>0</value>
+      <value>9</value>
     </param>
     <param>
       <key>t_scale</key>
@@ -816,38 +839,58 @@
     </param>
   </block>
   <block>
-    <key>gr_pfb_clock_sync_ccf</key>
+    <key>wxgui_scopesink2</key>
     <param>
       <key>id</key>
-      <value>gr_pfb_clock_sync_ccf_0</value>
+      <value>wxgui_scopesink2_0_0_0_0</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>sps</key>
-      <value>spb</value>
+      <key>type</key>
+      <value>float</value>
     </param>
     <param>
-      <key>gain</key>
-      <value>gain</value>
+      <key>title</key>
+      <value>Scope Plot</value>
     </param>
     <param>
-      <key>taps</key>
-      <value>rrctaps</value>
+      <key>samp_rate</key>
+      <value>samp_rate</value>
     </param>
     <param>
-      <key>filter_size</key>
-      <value>nfilts</value>
+      <key>v_scale</key>
+      <value>1.25</value>
     </param>
     <param>
-      <key>init_phase</key>
-      <value>14</value>
+      <key>t_scale</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>ac_couple</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>xy_mode</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>num_inputs</key>
+      <value>1</value>
+    </param>
+    <param>
+      <key>grid_pos</key>
+      <value></value>
+    </param>
+    <param>
+      <key>notebook</key>
+      <value>notebook_0,2</value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(341, 777)</value>
+      <value>(797, 915)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -855,58 +898,152 @@
     </param>
   </block>
   <block>
-    <key>wxgui_scopesink2</key>
+    <key>variable_slider</key>
     <param>
       <key>id</key>
-      <value>wxgui_scopesink2_0_0_0_0</value>
+      <value>alpha</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>type</key>
-      <value>float</value>
+      <key>label</key>
+      <value>Alpha</value>
     </param>
     <param>
-      <key>title</key>
-      <value>Scope Plot</value>
+      <key>value</key>
+      <value>0</value>
     </param>
     <param>
-      <key>samp_rate</key>
-      <value>samp_rate</value>
+      <key>min</key>
+      <value>0</value>
     </param>
     <param>
-      <key>v_scale</key>
-      <value>0</value>
+      <key>max</key>
+      <value>1</value>
     </param>
     <param>
-      <key>t_scale</key>
+      <key>num_steps</key>
+      <value>1000</value>
+    </param>
+    <param>
+      <key>style</key>
+      <value>wx.SL_HORIZONTAL</value>
+    </param>
+    <param>
+      <key>converver</key>
+      <value>float_converter</value>
+    </param>
+    <param>
+      <key>grid_pos</key>
+      <value></value>
+    </param>
+    <param>
+      <key>notebook</key>
+      <value></value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(757, -1)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
       <value>0</value>
     </param>
+  </block>
+  <block>
+    <key>variable_slider</key>
     <param>
-      <key>ac_couple</key>
-      <value>False</value>
+      <key>id</key>
+      <value>beta</value>
     </param>
     <param>
-      <key>xy_mode</key>
-      <value>False</value>
+      <key>_enabled</key>
+      <value>True</value>
     </param>
     <param>
-      <key>num_inputs</key>
+      <key>label</key>
+      <value>Beta</value>
+    </param>
+    <param>
+      <key>value</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>min</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>max</key>
       <value>1</value>
     </param>
+    <param>
+      <key>num_steps</key>
+      <value>1000</value>
+    </param>
+    <param>
+      <key>style</key>
+      <value>wx.SL_HORIZONTAL</value>
+    </param>
+    <param>
+      <key>converver</key>
+      <value>float_converter</value>
+    </param>
     <param>
       <key>grid_pos</key>
       <value></value>
     </param>
     <param>
       <key>notebook</key>
-      <value>notebook_0,2</value>
+      <value></value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(797, 915)</value>
+      <value>(871, 0)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+  </block>
+  <block>
+    <key>gr_pfb_clock_sync_ccf</key>
+    <param>
+      <key>id</key>
+      <value>gr_pfb_clock_sync_ccf_0</value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>sps</key>
+      <value>spb</value>
+    </param>
+    <param>
+      <key>alpha</key>
+      <value>alpha</value>
+    </param>
+    <param>
+      <key>beta</key>
+      <value>beta</value>
+    </param>
+    <param>
+      <key>taps</key>
+      <value>rrctaps</value>
+    </param>
+    <param>
+      <key>filter_size</key>
+      <value>nfilts</value>
+    </param>
+    <param>
+      <key>init_phase</key>
+      <value>14</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(346, 773)</value>
     </param>
     <param>
       <key>_rotation</key>
diff --git a/grc/blocks/gr_pfb_clock_sync.xml b/grc/blocks/gr_pfb_clock_sync.xml
index 3a066c23c1..c9487f52c4 100644
--- a/grc/blocks/gr_pfb_clock_sync.xml
+++ b/grc/blocks/gr_pfb_clock_sync.xml
@@ -8,7 +8,7 @@
 	<name>Polyphase Clock Sync</name>
 	<key>gr_pfb_clock_sync_ccf</key>
 	<import>from gnuradio import gr</import>
-	<make>gr.pfb_clock_sync_ccf($sps, $gain, $taps, $filter_size, $init_phase)</make>
+	<make>gr.pfb_clock_sync_ccf($sps, $alpha, $taps, $filter_size, $init_phase)</make>
 	<callback>set_taps($taps)</callback>
 	<callback>set_gain($gain)</callback>
 
@@ -18,8 +18,13 @@
 		<type>real</type>
 	</param>
 	<param>
-		<name>Gain</name>
-		<key>gain</key>
+		<name>Alpha</name>
+		<key>alpha</key>
+		<type>real</type>
+	</param>
+	<param>
+		<name>Beta</name>
+		<key>beta</key>
 		<type>real</type>
 	</param>
 	<param>
-- 
cgit v1.2.3


From da451d5d8b85cde797658415f0186d248f2f53dd Mon Sep 17 00:00:00 2001
From: Tom <trondeau@vt.edu>
Date: Tue, 6 Oct 2009 19:44:58 -0700
Subject: Fixing previous checkin

---
 .../src/lib/filter/gr_pfb_clock_sync_ccf.h         |   2 +-
 gnuradio-examples/grc/demod/pam_timing.grc         | 112 ++++++++++-----------
 grc/blocks/gr_pfb_clock_sync.xml                   |   3 +-
 3 files changed, 59 insertions(+), 58 deletions(-)

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
index 5a60619319..14e958691a 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
@@ -99,7 +99,7 @@ public:
   void print_diff_taps();
 
   void set_alpha(float alpha)
-  { 
+  {
     d_alpha = alpha;
   }
   void set_beta(float beta)
diff --git a/gnuradio-examples/grc/demod/pam_timing.grc b/gnuradio-examples/grc/demod/pam_timing.grc
index 4152d79a96..fae16841d5 100644
--- a/gnuradio-examples/grc/demod/pam_timing.grc
+++ b/gnuradio-examples/grc/demod/pam_timing.grc
@@ -1,6 +1,6 @@
 <?xml version='1.0' encoding='ASCII'?>
 <flow_graph>
-  <timestamp>Tue Oct  6 19:23:45 2009</timestamp>
+  <timestamp>Tue Oct  6 19:43:52 2009</timestamp>
   <block>
     <key>options</key>
     <param>
@@ -665,61 +665,6 @@
       <value>0</value>
     </param>
   </block>
-  <block>
-    <key>variable_slider</key>
-    <param>
-      <key>id</key>
-      <value>interpratio</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>label</key>
-      <value></value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>min</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>max</key>
-      <value>2</value>
-    </param>
-    <param>
-      <key>num_steps</key>
-      <value>1000</value>
-    </param>
-    <param>
-      <key>style</key>
-      <value>wx.SL_HORIZONTAL</value>
-    </param>
-    <param>
-      <key>converver</key>
-      <value>float_converter</value>
-    </param>
-    <param>
-      <key>grid_pos</key>
-      <value></value>
-    </param>
-    <param>
-      <key>notebook</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(232, 921)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
   <block>
     <key>wxgui_scopesink2</key>
     <param>
@@ -1050,6 +995,61 @@
       <value>0</value>
     </param>
   </block>
+  <block>
+    <key>variable_slider</key>
+    <param>
+      <key>id</key>
+      <value>interpratio</value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>label</key>
+      <value></value>
+    </param>
+    <param>
+      <key>value</key>
+      <value>1</value>
+    </param>
+    <param>
+      <key>min</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>max</key>
+      <value>2</value>
+    </param>
+    <param>
+      <key>num_steps</key>
+      <value>1000</value>
+    </param>
+    <param>
+      <key>style</key>
+      <value>wx.SL_HORIZONTAL</value>
+    </param>
+    <param>
+      <key>converver</key>
+      <value>float_converter</value>
+    </param>
+    <param>
+      <key>grid_pos</key>
+      <value></value>
+    </param>
+    <param>
+      <key>notebook</key>
+      <value></value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(232, 921)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+  </block>
   <connection>
     <source_block_id>random_source_x_0</source_block_id>
     <sink_block_id>gr_uchar_to_float_0</sink_block_id>
diff --git a/grc/blocks/gr_pfb_clock_sync.xml b/grc/blocks/gr_pfb_clock_sync.xml
index c9487f52c4..e62ab84a36 100644
--- a/grc/blocks/gr_pfb_clock_sync.xml
+++ b/grc/blocks/gr_pfb_clock_sync.xml
@@ -10,7 +10,8 @@
 	<import>from gnuradio import gr</import>
 	<make>gr.pfb_clock_sync_ccf($sps, $alpha, $taps, $filter_size, $init_phase)</make>
 	<callback>set_taps($taps)</callback>
-	<callback>set_gain($gain)</callback>
+	<callback>set_alpha($alpha)</callback>
+	<callback>set_beta($beta)</callback>
 
 	<param>
 		<name>Samples/Symbol</name>
-- 
cgit v1.2.3


From 3b7c8a448cbd53b394cc405357ad0831096066f5 Mon Sep 17 00:00:00 2001
From: Tom <trondeau@vt.edu>
Date: Wed, 7 Oct 2009 11:02:44 -0700
Subject: Clipping the rate of the clock recovery helps track large changes.

---
 .../src/lib/filter/gr_pfb_clock_sync_ccf.cc        |  28 ++--
 gnuradio-examples/grc/demod/pam_timing.grc         | 142 ++++++++++-----------
 2 files changed, 91 insertions(+), 79 deletions(-)

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
index 62282fd6af..35fe2a8866 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
@@ -115,13 +115,15 @@ gr_pfb_clock_sync_ccf::set_taps (const std::vector<float> &newtaps,
   // Partition the filter
   for(i = 0; i < d_nfilters; i++) {
     // Each channel uses all d_taps_per_filter with 0's if not enough taps to fill out
-    ourtaps[i] = std::vector<float>(d_taps_per_filter, 0);
+    //ourtaps[i] = std::vector<float>(d_taps_per_filter, 0);
+    ourtaps[d_nfilters-1-i] = std::vector<float>(d_taps_per_filter, 0);
     for(j = 0; j < d_taps_per_filter; j++) {
-      ourtaps[i][j] = tmp_taps[i + j*d_nfilters];  // add taps to channels in reverse order
+      ourtaps[d_nfilters - 1 - i][j] = tmp_taps[i + j*d_nfilters];
     }
     
     // Build a filter for each channel and add it's taps to it
-    ourfilter[i]->set_taps(ourtaps[i]);
+    //ourfilter[i]->set_taps(ourtaps[i]);
+    ourfilter[i]->set_taps(ourtaps[d_nfilters-1-i]);
   }
 
   // Set the history to ensure enough input items for each filter
@@ -156,26 +158,30 @@ void
 gr_pfb_clock_sync_ccf::print_taps()
 {
   unsigned int i, j;
+  printf("[ ");
   for(i = 0; i < d_nfilters; i++) {
-    printf("filter[%d]: [%.4e, ", i, d_taps[i][0]);
+    printf("[%.4e, ", d_taps[i][0]);
     for(j = 1; j < d_taps_per_filter-1; j++) {
       printf("%.4e,", d_taps[i][j]);
     }
-    printf("%.4e]\n", d_taps[i][j]);
+    printf("%.4e],", d_taps[i][j]);
   }
+  printf(" ]\n");
 }
 
 void
 gr_pfb_clock_sync_ccf::print_diff_taps()
 {
   unsigned int i, j;
+  printf("[ ");
   for(i = 0; i < d_nfilters; i++) {
-    printf("filter[%d]: [%.4e, ", i, d_dtaps[i][0]);
+    printf("[%.4e, ", d_dtaps[i][0]);
     for(j = 1; j < d_taps_per_filter-1; j++) {
       printf("%.4e,", d_dtaps[i][j]);
     }
-    printf("%.4e]\n", d_dtaps[i][j]);
+    printf("%.4e],", d_dtaps[i][j]);
   }
+  printf(" ]\n");
 }
 
 
@@ -232,12 +238,15 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items,
   // produce output as long as we can and there are enough input samples
   while((i < noutput_items) && (count < nrequired)) {
     int filtnum = (int)d_k;
+
+    // FIXME: prevent this from asserting
+    assert(filtnum < d_nfilters);
     out[i] = d_filters[filtnum]->filter(&in[count]);
     error =  (out[i] * d_diff_filters[filtnum]->filter(&in[count])).real();
 
     d_k = d_k + d_alpha*error + d_rate;
     d_rate = d_rate + d_beta*error;
-    while(d_k >= d_nfilters) {
+    while(d_k >= (float)d_nfilters) {
       d_k -= d_nfilters;
       count++;
     }
@@ -245,6 +254,9 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items,
       d_k += d_nfilters;
       count--;
     }
+    
+    // Keep our rate within a good range
+    d_rate = gr_branchless_clip(d_rate, 1.5);
 
     i++;
     count += d_sps;
diff --git a/gnuradio-examples/grc/demod/pam_timing.grc b/gnuradio-examples/grc/demod/pam_timing.grc
index ab34677fae..21fb63abec 100644
--- a/gnuradio-examples/grc/demod/pam_timing.grc
+++ b/gnuradio-examples/grc/demod/pam_timing.grc
@@ -1,6 +1,6 @@
 <?xml version='1.0' encoding='ASCII'?>
 <flow_graph>
-  <timestamp>Tue Oct  6 22:05:15 2009</timestamp>
+  <timestamp>Wed Oct  7 11:00:26 2009</timestamp>
   <block>
     <key>options</key>
     <param>
@@ -820,54 +820,42 @@
     </param>
   </block>
   <block>
-    <key>variable_slider</key>
+    <key>gr_pfb_clock_sync_ccf</key>
     <param>
       <key>id</key>
-      <value>alpha</value>
+      <value>gr_pfb_clock_sync_ccf_0</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>label</key>
-      <value>Alpha</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>min</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>max</key>
-      <value>1</value>
+      <key>sps</key>
+      <value>spb</value>
     </param>
     <param>
-      <key>num_steps</key>
-      <value>1000</value>
+      <key>alpha</key>
+      <value>alpha</value>
     </param>
     <param>
-      <key>style</key>
-      <value>wx.SL_HORIZONTAL</value>
+      <key>beta</key>
+      <value>beta</value>
     </param>
     <param>
-      <key>converver</key>
-      <value>float_converter</value>
+      <key>taps</key>
+      <value>rrctaps</value>
     </param>
     <param>
-      <key>grid_pos</key>
-      <value></value>
+      <key>filter_size</key>
+      <value>nfilts</value>
     </param>
     <param>
-      <key>notebook</key>
-      <value></value>
+      <key>init_phase</key>
+      <value>14</value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(757, -1)</value>
+      <value>(346, 773)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -875,42 +863,22 @@
     </param>
   </block>
   <block>
-    <key>gr_pfb_clock_sync_ccf</key>
+    <key>variable</key>
     <param>
       <key>id</key>
-      <value>gr_pfb_clock_sync_ccf_0</value>
+      <value>rrctaps</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>sps</key>
-      <value>spb</value>
-    </param>
-    <param>
-      <key>alpha</key>
-      <value>alpha</value>
-    </param>
-    <param>
-      <key>beta</key>
-      <value>beta</value>
-    </param>
-    <param>
-      <key>taps</key>
-      <value>rrctaps</value>
-    </param>
-    <param>
-      <key>filter_size</key>
-      <value>nfilts</value>
-    </param>
-    <param>
-      <key>init_phase</key>
-      <value>14</value>
+      <key>value</key>
+      <value>firdes.root_raised_cosine(nfilts,1.0,1.0/(spb*nfilts), .35, 11*spb*nfilts)</value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(346, 773)</value>
+      <value>(110, 830)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -921,7 +889,7 @@
     <key>variable_slider</key>
     <param>
       <key>id</key>
-      <value>interpratio</value>
+      <value>beta</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -929,19 +897,19 @@
     </param>
     <param>
       <key>label</key>
-      <value></value>
+      <value>Beta</value>
     </param>
     <param>
       <key>value</key>
-      <value>1</value>
+      <value>10e-3</value>
     </param>
     <param>
       <key>min</key>
-      <value>0</value>
+      <value>0.0</value>
     </param>
     <param>
       <key>max</key>
-      <value>2</value>
+      <value>0.1</value>
     </param>
     <param>
       <key>num_steps</key>
@@ -965,30 +933,62 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(232, 921)</value>
+      <value>(871, 0)</value>
     </param>
     <param>
       <key>_rotation</key>
-      <value>180</value>
+      <value>0</value>
     </param>
   </block>
   <block>
-    <key>variable</key>
+    <key>variable_slider</key>
     <param>
       <key>id</key>
-      <value>rrctaps</value>
+      <value>alpha</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
+    <param>
+      <key>label</key>
+      <value>Alpha</value>
+    </param>
     <param>
       <key>value</key>
-      <value>firdes.root_raised_cosine(nfilts,1.0,1.0/(spb*nfilts), .35, 11*spb*nfilts)</value>
+      <value>2</value>
+    </param>
+    <param>
+      <key>min</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>max</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>num_steps</key>
+      <value>1000</value>
+    </param>
+    <param>
+      <key>style</key>
+      <value>wx.SL_HORIZONTAL</value>
+    </param>
+    <param>
+      <key>converver</key>
+      <value>float_converter</value>
+    </param>
+    <param>
+      <key>grid_pos</key>
+      <value></value>
+    </param>
+    <param>
+      <key>notebook</key>
+      <value></value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(110, 830)</value>
+      <value>(757, -1)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -999,7 +999,7 @@
     <key>variable_slider</key>
     <param>
       <key>id</key>
-      <value>beta</value>
+      <value>interpratio</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -1007,19 +1007,19 @@
     </param>
     <param>
       <key>label</key>
-      <value>Beta</value>
+      <value></value>
     </param>
     <param>
       <key>value</key>
-      <value>0</value>
+      <value>1.001</value>
     </param>
     <param>
       <key>min</key>
-      <value>0.0</value>
+      <value>0</value>
     </param>
     <param>
       <key>max</key>
-      <value>0.1</value>
+      <value>2</value>
     </param>
     <param>
       <key>num_steps</key>
@@ -1043,11 +1043,11 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(871, 0)</value>
+      <value>(757, 133)</value>
     </param>
     <param>
       <key>_rotation</key>
-      <value>0</value>
+      <value>180</value>
     </param>
   </block>
   <connection>
-- 
cgit v1.2.3


From eeea619b80578665fd470f850c390d4aa6782336 Mon Sep 17 00:00:00 2001
From: Tom <trondeau@vt.edu>
Date: Wed, 7 Oct 2009 17:45:19 -0700
Subject: More stable version of clock sync.

---
 gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc | 14 +++++++++-----
 gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h  |  3 ++-
 2 files changed, 11 insertions(+), 6 deletions(-)

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
index 35fe2a8866..fe399ffbae 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
@@ -63,6 +63,7 @@ gr_pfb_clock_sync_ccf::gr_pfb_clock_sync_ccf (float sps, float gain,
   set_alpha(gain);
   set_beta(0.25*gain*gain);
   d_k = d_nfilters / 2;
+  d_filtnum = (int)floor(d_k);
   d_rate = 0;
   d_start_count = 0;
   
@@ -237,21 +238,24 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items,
 
   // produce output as long as we can and there are enough input samples
   while((i < noutput_items) && (count < nrequired)) {
-    int filtnum = (int)d_k;
 
     // FIXME: prevent this from asserting
     assert(filtnum < d_nfilters);
-    out[i] = d_filters[filtnum]->filter(&in[count]);
-    error =  (out[i] * d_diff_filters[filtnum]->filter(&in[count])).real();
+    out[i] = d_filters[d_filtnum]->filter(&in[count]);
+    error =  (out[i] * d_diff_filters[d_filtnum]->filter(&in[count])).real();
 
     d_k = d_k + d_alpha*error + d_rate;
     d_rate = d_rate + d_beta*error;
-    while(d_k >= (float)d_nfilters) {
+    d_filtnum = (int)floor(d_k);
+
+    while(d_filtnum >= d_nfilters) {
       d_k -= d_nfilters;
+      d_filtnum -= d_nfilters;
       count++;
     }
-    while(d_k < 0) {
+    while(d_filtnum < 0) {
       d_k += d_nfilters;
+      d_filtnum += d_nfilters;
       count--;
     }
     
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
index 14e958691a..41e5d7b2a3 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
@@ -59,13 +59,14 @@ class gr_pfb_clock_sync_ccf : public gr_block
   unsigned int             d_sps;
   float                    d_alpha;
   float                    d_beta;
-  unsigned int             d_nfilters;
+  int                      d_nfilters;
   std::vector<gr_fir_ccf*> d_filters;
   std::vector<gr_fir_ccf*> d_diff_filters;
   std::vector< std::vector<float> > d_taps;
   std::vector< std::vector<float> > d_dtaps;
   float                    d_k;
   float                    d_rate;
+  int                      d_filtnum;
   unsigned int             d_start_count;
   unsigned int             d_taps_per_filter;
 
-- 
cgit v1.2.3


From 521f3e514a7e8a887ba7a35b81d255e85fbcabc1 Mon Sep 17 00:00:00 2001
From: Tom <trondeau@vt.edu>
Date: Wed, 7 Oct 2009 18:31:50 -0700
Subject: Working sync for QPSK

---
 gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
index fe399ffbae..7dc5715d90 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
@@ -234,15 +234,18 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items,
   int nrequired = ninput_items[0] - d_taps_per_filter;
 
   int i = 0, count = d_start_count;
-  float error = 0;
+  float error;
+  float error_r, error_i;
 
   // produce output as long as we can and there are enough input samples
   while((i < noutput_items) && (count < nrequired)) {
 
     // FIXME: prevent this from asserting
-    assert(filtnum < d_nfilters);
+    assert(d_filtnum < d_nfilters);
     out[i] = d_filters[d_filtnum]->filter(&in[count]);
-    error =  (out[i] * d_diff_filters[d_filtnum]->filter(&in[count])).real();
+    error_r  = out[i].real() * d_diff_filters[d_filtnum]->filter(&in[count]).real();
+    error_i  = out[i].imag() * d_diff_filters[d_filtnum]->filter(&in[count]).imag();
+    error = error_i + error_r;
 
     d_k = d_k + d_alpha*error + d_rate;
     d_rate = d_rate + d_beta*error;
-- 
cgit v1.2.3


From 90b8b4cc8c53c963f8b0cf4bbc50277c031c3213 Mon Sep 17 00:00:00 2001
From: Tom <trondeau@vt.edu>
Date: Thu, 8 Oct 2009 21:40:16 -0700
Subject: Working on allowing fractional samples per symbol.

---
 .../src/lib/filter/gr_pfb_clock_sync_ccf.cc        |  57 +-
 .../src/lib/filter/gr_pfb_clock_sync_ccf.h         |  20 +-
 .../src/lib/filter/gr_pfb_clock_sync_ccf.i         |   7 +-
 gnuradio-examples/grc/demod/pam_timing.grc         | 858 +++++++++++----------
 4 files changed, 519 insertions(+), 423 deletions(-)

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
index 7dc5715d90..a75b20d383 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
@@ -36,11 +36,13 @@
 gr_pfb_clock_sync_ccf_sptr gr_make_pfb_clock_sync_ccf (float sps, float gain,
 						       const std::vector<float> &taps,
 						       unsigned int filter_size,
-						       float init_phase)
+						       float init_phase,
+						       float max_rate_deviation)
 {
   return gr_pfb_clock_sync_ccf_sptr (new gr_pfb_clock_sync_ccf (sps, gain, taps,
 								filter_size,
-								init_phase));
+								init_phase,
+								max_rate_deviation));
 }
 
 int ios[] = {sizeof(gr_complex), sizeof(float), sizeof(float), sizeof(float)};
@@ -48,11 +50,13 @@ std::vector<int> iosig(ios, ios+sizeof(ios)/sizeof(int));
 gr_pfb_clock_sync_ccf::gr_pfb_clock_sync_ccf (float sps, float gain,
 					      const std::vector<float> &taps,
 					      unsigned int filter_size,
-					      float init_phase)
+					      float init_phase,
+					      float max_rate_deviation)
   : gr_block ("pfb_clock_sync_ccf",
 	      gr_make_io_signature (1, 1, sizeof(gr_complex)),
 	      gr_make_io_signaturev (1, 4, iosig)),
-    d_updated (false), d_sps(sps)
+    d_updated (false), d_sps(sps), d_nfilters(filter_size),
+    d_max_dev(max_rate_deviation), d_start_count(0)
 {
   d_nfilters = filter_size;
 
@@ -63,10 +67,8 @@ gr_pfb_clock_sync_ccf::gr_pfb_clock_sync_ccf (float sps, float gain,
   set_alpha(gain);
   set_beta(0.25*gain*gain);
   d_k = d_nfilters / 2;
-  d_filtnum = (int)floor(d_k);
   d_rate = 0;
-  d_start_count = 0;
-  
+  d_filtnum = (int)floor(d_k);
 
   d_filters = std::vector<gr_fir_ccf*>(d_nfilters);
   d_diff_filters = std::vector<gr_fir_ccf*>(d_nfilters);
@@ -97,7 +99,7 @@ gr_pfb_clock_sync_ccf::set_taps (const std::vector<float> &newtaps,
 				 std::vector< std::vector<float> > &ourtaps,
 				 std::vector<gr_fir_ccf*> &ourfilter)
 {
-  unsigned int i,j;
+  int i,j;
 
   unsigned int ntaps = newtaps.size();
   d_taps_per_filter = (unsigned int)ceil((double)ntaps/(double)d_nfilters);
@@ -233,62 +235,65 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items,
   // We need this many to process one output
   int nrequired = ninput_items[0] - d_taps_per_filter;
 
-  int i = 0, count = d_start_count;
-  float error;
-  float error_r, error_i;
+  int i = 0, count = (int)floor(d_sample_num);
+  float error, error_r, error_i;
 
   // produce output as long as we can and there are enough input samples
   while((i < noutput_items) && (count < nrequired)) {
-
-    // FIXME: prevent this from asserting
-    assert(d_filtnum < d_nfilters);
     out[i] = d_filters[d_filtnum]->filter(&in[count]);
-    error_r  = out[i].real() * d_diff_filters[d_filtnum]->filter(&in[count]).real();
-    error_i  = out[i].imag() * d_diff_filters[d_filtnum]->filter(&in[count]).imag();
+    gr_complex diff = d_diff_filters[d_filtnum]->filter(&in[count]);
+    error_r  = out[i].real() * diff.real();
+    error_i  = out[i].imag() * diff.imag();
     error = error_i + error_r;
 
     d_k = d_k + d_alpha*error + d_rate;
     d_rate = d_rate + d_beta*error;
     d_filtnum = (int)floor(d_k);
 
+    // Keep the current filter number in [0, d_nfilters]
+    // If we've run beyond the last filter, wrap around and go to next sample
+    // If we've go below 0, wrap around and go to previous sample
     while(d_filtnum >= d_nfilters) {
       d_k -= d_nfilters;
       d_filtnum -= d_nfilters;
-      count++;
+      d_sample_num += 1.0;
     }
     while(d_filtnum < 0) {
       d_k += d_nfilters;
       d_filtnum += d_nfilters;
-      count--;
+      d_sample_num -= 1.0;
     }
     
     // Keep our rate within a good range
-    d_rate = gr_branchless_clip(d_rate, 1.5);
+    d_rate = gr_branchless_clip(d_rate, d_max_dev);
 
     i++;
-    count += d_sps;
+    d_sample_num += d_sps;
+    count = (int)floor(d_sample_num);
 
     if(output_items.size() > 2) {
       err[i] = error;
       outrate[i] = d_rate;
       outk[i] = d_k;
     }
-
-    //printf("error: %f  k: %f  rate: %f\n",
-    //	   error, d_k, d_rate);
   }
 
   // Set the start index at the next entrance to the work function
   // if we stop because we run out of input items, jump ahead in the
   // next call to work. Otherwise, we can start at zero.
+  /*
   if(count > nrequired) {
-    d_start_count = count - (nrequired);
+    //d_start_count = count - (nrequired);
+    d_sample_num -= nrequired;
     consume_each(ninput_items[0]-d_taps_per_filter);
   }
   else {
-    d_start_count = 0;
+    d_sample_num -= floor(d_sample_num);
     consume_each(count);
   }
-  
+  */
+  d_sample_num -= floor(d_sample_num);
+  consume_each(count);
+
   return i;
 }
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
index 41e5d7b2a3..84e174b198 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
@@ -31,7 +31,8 @@ typedef boost::shared_ptr<gr_pfb_clock_sync_ccf> gr_pfb_clock_sync_ccf_sptr;
 gr_pfb_clock_sync_ccf_sptr gr_make_pfb_clock_sync_ccf (float sps, float gain,
 						       const std::vector<float> &taps,
 						       unsigned int filter_size=32,
-						       float init_phase=0);
+						       float init_phase=0,
+						       float max_rate_deviation=1.5);
 
 class gr_fir_ccf;
 
@@ -53,12 +54,14 @@ class gr_pfb_clock_sync_ccf : public gr_block
   friend gr_pfb_clock_sync_ccf_sptr gr_make_pfb_clock_sync_ccf (float sps, float gain,
 								const std::vector<float> &taps,
 								unsigned int filter_size,
-								float init_phase);
+								float init_phase,
+								float max_rate_deviation);
 
   bool			   d_updated;
-  unsigned int             d_sps;
+  float                    d_sps;
   float                    d_alpha;
   float                    d_beta;
+  float                    d_sample_num;
   int                      d_nfilters;
   std::vector<gr_fir_ccf*> d_filters;
   std::vector<gr_fir_ccf*> d_diff_filters;
@@ -66,9 +69,10 @@ class gr_pfb_clock_sync_ccf : public gr_block
   std::vector< std::vector<float> > d_dtaps;
   float                    d_k;
   float                    d_rate;
+  float                    d_max_dev;
   int                      d_filtnum;
+  int                      d_taps_per_filter;
   unsigned int             d_start_count;
-  unsigned int             d_taps_per_filter;
 
   /*!
    * Build the polyphase filterbank timing synchronizer.
@@ -76,7 +80,8 @@ class gr_pfb_clock_sync_ccf : public gr_block
   gr_pfb_clock_sync_ccf (float sps, float gain,
 			 const std::vector<float> &taps,
 			 unsigned int filter_size,
-			 float init_phase);
+			 float init_phase,
+			 float max_rate_deviation);
   
   void create_diff_taps(const std::vector<float> &newtaps,
 			std::vector<float> &difftaps);
@@ -107,6 +112,11 @@ public:
   {
     d_beta = beta;
   }
+
+  void set_max_rate_deviation(float m)
+  {
+    d_max_dev = m;
+  }
   
   int general_work (int noutput_items,
 		    gr_vector_int &ninput_items,
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.i b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.i
index 7859154791..9957c33b75 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.i
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.i
@@ -25,7 +25,8 @@ GR_SWIG_BLOCK_MAGIC(gr,pfb_clock_sync_ccf);
 gr_pfb_clock_sync_ccf_sptr gr_make_pfb_clock_sync_ccf (float sps, float gain,
 						       const std::vector<float> &taps,
 						       unsigned int filter_size=32,
-						       float init_phase=0);
+						       float init_phase=0,
+						       float max_rate_deviation=1.5);
 
 class gr_pfb_clock_sync_ccf : public gr_block
 {
@@ -33,7 +34,8 @@ class gr_pfb_clock_sync_ccf : public gr_block
   gr_pfb_clock_sync_ccf (float sps, float gain,
 			 const std::vector<float> &taps,
 			 unsigned int filter_size,
-			 float init_phase);
+			 float init_phase,
+			 float max_rate_deviation);
 
  public:
   ~gr_pfb_clock_sync_ccf ();
@@ -48,4 +50,5 @@ class gr_pfb_clock_sync_ccf : public gr_block
   void print_diff_taps();
   void set_alpha(float alpha);
   void set_beta(float beta);
+  void set_max_rate_deviation(float m);
 };
diff --git a/gnuradio-examples/grc/demod/pam_timing.grc b/gnuradio-examples/grc/demod/pam_timing.grc
index a0dc6642a2..d51adb1f27 100644
--- a/gnuradio-examples/grc/demod/pam_timing.grc
+++ b/gnuradio-examples/grc/demod/pam_timing.grc
@@ -1,6 +1,6 @@
 <?xml version='1.0' encoding='ASCII'?>
 <flow_graph>
-  <timestamp>Wed Oct  7 20:47:05 2009</timestamp>
+  <timestamp>Thu Oct  8 21:29:27 2009</timestamp>
   <block>
     <key>options</key>
     <param>
@@ -56,29 +56,6 @@
       <value>0</value>
     </param>
   </block>
-  <block>
-    <key>variable</key>
-    <param>
-      <key>id</key>
-      <value>samp_rate</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>320000</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(128, 9)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
   <block>
     <key>gr_uchar_to_float</key>
     <param>
@@ -338,154 +315,6 @@
       <value>0</value>
     </param>
   </block>
-  <block>
-    <key>variable</key>
-    <param>
-      <key>id</key>
-      <value>rrctaps</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>firdes.root_raised_cosine(nfilts,1.0,1.0/(spb*nfilts), .35, 11*spb*nfilts)</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(513, 679)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>root_raised_cosine_filter</key>
-    <param>
-      <key>id</key>
-      <value>root_raised_cosine_filter_0_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>type</key>
-      <value>interp_fir_filter_fff</value>
-    </param>
-    <param>
-      <key>decim</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>interp</key>
-      <value>spb</value>
-    </param>
-    <param>
-      <key>gain</key>
-      <value>2*spb</value>
-    </param>
-    <param>
-      <key>samp_rate</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>sym_rate</key>
-      <value>1./spb</value>
-    </param>
-    <param>
-      <key>alpha</key>
-      <value>0.35</value>
-    </param>
-    <param>
-      <key>ntaps</key>
-      <value>11*spb</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(559, 303)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>root_raised_cosine_filter</key>
-    <param>
-      <key>id</key>
-      <value>root_raised_cosine_filter_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>type</key>
-      <value>interp_fir_filter_fff</value>
-    </param>
-    <param>
-      <key>decim</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>interp</key>
-      <value>spb</value>
-    </param>
-    <param>
-      <key>gain</key>
-      <value>2*spb</value>
-    </param>
-    <param>
-      <key>samp_rate</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>sym_rate</key>
-      <value>1./spb</value>
-    </param>
-    <param>
-      <key>alpha</key>
-      <value>0.35</value>
-    </param>
-    <param>
-      <key>ntaps</key>
-      <value>11*spb</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(557, 140)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gr_float_to_complex</key>
-    <param>
-      <key>id</key>
-      <value>gr_float_to_complex_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>vlen</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(897, 272)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
   <block>
     <key>variable_slider</key>
     <param>
@@ -541,34 +370,11 @@
       <value>0</value>
     </param>
   </block>
-  <block>
-    <key>variable</key>
-    <param>
-      <key>id</key>
-      <value>nfilts</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>32</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(435, 686)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
   <block>
     <key>variable_slider</key>
     <param>
       <key>id</key>
-      <value>beta</value>
+      <value>interpratio</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -576,19 +382,19 @@
     </param>
     <param>
       <key>label</key>
-      <value>Timing Beta</value>
+      <value>Timing Offset</value>
     </param>
     <param>
       <key>value</key>
-      <value>20e-3</value>
+      <value>1.00</value>
     </param>
     <param>
       <key>min</key>
-      <value>0.0</value>
+      <value>0.9</value>
     </param>
     <param>
       <key>max</key>
-      <value>0.1</value>
+      <value>1.1</value>
     </param>
     <param>
       <key>num_steps</key>
@@ -612,7 +418,7 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(668, 5)</value>
+      <value>(40, 684)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -620,42 +426,46 @@
     </param>
   </block>
   <block>
-    <key>variable_slider</key>
+    <key>wxgui_scopesink2</key>
     <param>
       <key>id</key>
-      <value>alpha</value>
+      <value>wxgui_scopesink2_0_0_0</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>label</key>
-      <value>Timing Alpha</value>
+      <key>type</key>
+      <value>float</value>
     </param>
     <param>
-      <key>value</key>
-      <value>2</value>
+      <key>title</key>
+      <value>Scope Plot</value>
     </param>
     <param>
-      <key>min</key>
-      <value>0</value>
+      <key>samp_rate</key>
+      <value>samp_rate</value>
     </param>
     <param>
-      <key>max</key>
-      <value>10</value>
+      <key>v_scale</key>
+      <value>9</value>
     </param>
     <param>
-      <key>num_steps</key>
-      <value>1000</value>
+      <key>t_scale</key>
+      <value>0</value>
     </param>
     <param>
-      <key>style</key>
-      <value>wx.SL_HORIZONTAL</value>
+      <key>ac_couple</key>
+      <value>False</value>
     </param>
     <param>
-      <key>converver</key>
-      <value>float_converter</value>
+      <key>xy_mode</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>num_inputs</key>
+      <value>1</value>
     </param>
     <param>
       <key>grid_pos</key>
@@ -663,11 +473,11 @@
     </param>
     <param>
       <key>notebook</key>
-      <value></value>
+      <value>notebook_0,1</value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(552, 4)</value>
+      <value>(1115, 961)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -678,7 +488,7 @@
     <key>wxgui_scopesink2</key>
     <param>
       <key>id</key>
-      <value>wxgui_scopesink2_0</value>
+      <value>wxgui_scopesink2_0_0_0_0</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -686,7 +496,7 @@
     </param>
     <param>
       <key>type</key>
-      <value>complex</value>
+      <value>float</value>
     </param>
     <param>
       <key>title</key>
@@ -698,7 +508,7 @@
     </param>
     <param>
       <key>v_scale</key>
-      <value>0</value>
+      <value>1.25</value>
     </param>
     <param>
       <key>t_scale</key>
@@ -722,11 +532,11 @@
     </param>
     <param>
       <key>notebook</key>
-      <value></value>
+      <value>notebook_0,2</value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(1133, 325)</value>
+      <value>(1113, 844)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -734,42 +544,81 @@
     </param>
   </block>
   <block>
-    <key>variable_slider</key>
+    <key>wxgui_scopesink2</key>
     <param>
       <key>id</key>
-      <value>freq_offset</value>
+      <value>wxgui_scopesink2_0_0</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>label</key>
-      <value>Frequency Offset</value>
+      <key>type</key>
+      <value>float</value>
     </param>
     <param>
-      <key>value</key>
-      <value>0</value>
+      <key>title</key>
+      <value>Error</value>
     </param>
     <param>
-      <key>min</key>
-      <value>-0.5</value>
+      <key>samp_rate</key>
+      <value>samp_rate</value>
     </param>
     <param>
-      <key>max</key>
-      <value>0.5</value>
+      <key>v_scale</key>
+      <value>.5</value>
     </param>
     <param>
-      <key>num_steps</key>
-      <value>1000</value>
+      <key>t_scale</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>ac_couple</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>xy_mode</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>num_inputs</key>
+      <value>1</value>
+    </param>
+    <param>
+      <key>grid_pos</key>
+      <value></value>
+    </param>
+    <param>
+      <key>notebook</key>
+      <value>notebook_0,0</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(1113, 724)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+  </block>
+  <block>
+    <key>notebook</key>
+    <param>
+      <key>id</key>
+      <value>notebook_0</value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
     </param>
     <param>
       <key>style</key>
-      <value>wx.SL_HORIZONTAL</value>
+      <value>wx.NB_TOP</value>
     </param>
     <param>
-      <key>converver</key>
-      <value>float_converter</value>
+      <key>labels</key>
+      <value>['error', 'phase', 'freq', 'FFT', 'Costas error']</value>
     </param>
     <param>
       <key>grid_pos</key>
@@ -781,7 +630,7 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(293, 684)</value>
+      <value>(729, 769)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -792,7 +641,7 @@
     <key>variable</key>
     <param>
       <key>id</key>
-      <value>spb</value>
+      <value>samp_rate</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -800,11 +649,11 @@
     </param>
     <param>
       <key>value</key>
-      <value>4</value>
+      <value>32000</value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(436, 752)</value>
+      <value>(128, 9)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -812,10 +661,10 @@
     </param>
   </block>
   <block>
-    <key>wxgui_fftsink2</key>
+    <key>gr_throttle</key>
     <param>
       <key>id</key>
-      <value>wxgui_fftsink2_0</value>
+      <value>gr_throttle_0</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -826,64 +675,184 @@
       <value>complex</value>
     </param>
     <param>
-      <key>title</key>
-      <value>FFT Plot</value>
+      <key>samples_per_second</key>
+      <value>samp_rate</value>
     </param>
     <param>
-      <key>samp_rate</key>
-      <value>samp_rate</value>
+      <key>vlen</key>
+      <value>1</value>
     </param>
     <param>
-      <key>baseband_freq</key>
+      <key>_coordinate</key>
+      <value>(1129, 462)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
       <value>0</value>
     </param>
+  </block>
+  <block>
+    <key>gr_costas_loop_cc</key>
     <param>
-      <key>y_per_div</key>
-      <value>10</value>
+      <key>id</key>
+      <value>gr_costas_loop_cc_0</value>
     </param>
     <param>
-      <key>y_divs</key>
-      <value>10</value>
+      <key>_enabled</key>
+      <value>False</value>
     </param>
     <param>
-      <key>ref_level</key>
-      <value>50</value>
+      <key>alpha</key>
+      <value>alpha_0</value>
     </param>
     <param>
-      <key>ref_scale</key>
-      <value>2.0</value>
+      <key>beta</key>
+      <value>beta_0</value>
     </param>
     <param>
-      <key>fft_size</key>
-      <value>1024</value>
+      <key>max_freq</key>
+      <value>5</value>
     </param>
     <param>
-      <key>fft_rate</key>
-      <value>30</value>
+      <key>min_freq</key>
+      <value>-5</value>
     </param>
     <param>
-      <key>peak_hold</key>
-      <value>False</value>
+      <key>order</key>
+      <value>4</value>
     </param>
     <param>
-      <key>average</key>
-      <value>False</value>
+      <key>_coordinate</key>
+      <value>(299, 453)</value>
     </param>
     <param>
-      <key>avg_alpha</key>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+  </block>
+  <block>
+    <key>variable_slider</key>
+    <param>
+      <key>id</key>
+      <value>freq_offset</value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>label</key>
+      <value>Frequency Offset</value>
+    </param>
+    <param>
+      <key>value</key>
       <value>0</value>
     </param>
+    <param>
+      <key>min</key>
+      <value>-0.5</value>
+    </param>
+    <param>
+      <key>max</key>
+      <value>0.5</value>
+    </param>
+    <param>
+      <key>num_steps</key>
+      <value>1000</value>
+    </param>
+    <param>
+      <key>style</key>
+      <value>wx.SL_HORIZONTAL</value>
+    </param>
+    <param>
+      <key>converver</key>
+      <value>float_converter</value>
+    </param>
     <param>
       <key>grid_pos</key>
       <value></value>
     </param>
     <param>
       <key>notebook</key>
-      <value>notebook_0,3</value>
+      <value></value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(517, 767)</value>
+      <value>(293, 684)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+  </block>
+  <block>
+    <key>variable</key>
+    <param>
+      <key>id</key>
+      <value>rrctaps</value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>value</key>
+      <value>firdes.root_raised_cosine(nfilts,1.0,1.0/(spb*nfilts), .35, int(11*spb*nfilts))</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(513, 679)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+  </block>
+  <block>
+    <key>root_raised_cosine_filter</key>
+    <param>
+      <key>id</key>
+      <value>root_raised_cosine_filter_0_0</value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>type</key>
+      <value>interp_fir_filter_fff</value>
+    </param>
+    <param>
+      <key>decim</key>
+      <value>1</value>
+    </param>
+    <param>
+      <key>interp</key>
+      <value>spb_gen</value>
+    </param>
+    <param>
+      <key>gain</key>
+      <value>2*spb_gen</value>
+    </param>
+    <param>
+      <key>samp_rate</key>
+      <value>1.0</value>
+    </param>
+    <param>
+      <key>sym_rate</key>
+      <value>1./spb_gen</value>
+    </param>
+    <param>
+      <key>alpha</key>
+      <value>0.35</value>
+    </param>
+    <param>
+      <key>ntaps</key>
+      <value>11*spb_gen</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(564, 301)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -894,7 +863,7 @@
     <key>variable_slider</key>
     <param>
       <key>id</key>
-      <value>interpratio</value>
+      <value>alpha</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -902,19 +871,19 @@
     </param>
     <param>
       <key>label</key>
-      <value>Timing Offset</value>
+      <value>Timing Alpha</value>
     </param>
     <param>
       <key>value</key>
-      <value>1.00</value>
+      <value>0</value>
     </param>
     <param>
       <key>min</key>
-      <value>0.9</value>
+      <value>0</value>
     </param>
     <param>
       <key>max</key>
-      <value>1.1</value>
+      <value>10</value>
     </param>
     <param>
       <key>num_steps</key>
@@ -938,18 +907,18 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(40, 684)</value>
+      <value>(552, 4)</value>
     </param>
     <param>
       <key>_rotation</key>
-      <value>180</value>
+      <value>0</value>
     </param>
   </block>
   <block>
     <key>variable_slider</key>
     <param>
       <key>id</key>
-      <value>beta_0</value>
+      <value>beta</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -957,11 +926,11 @@
     </param>
     <param>
       <key>label</key>
-      <value>Freq Beta</value>
+      <value>Timing Beta</value>
     </param>
     <param>
       <key>value</key>
-      <value>0.001</value>
+      <value>0</value>
     </param>
     <param>
       <key>min</key>
@@ -969,7 +938,7 @@
     </param>
     <param>
       <key>max</key>
-      <value>0.01</value>
+      <value>0.1</value>
     </param>
     <param>
       <key>num_steps</key>
@@ -993,7 +962,7 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(919, 7)</value>
+      <value>(668, 5)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -1008,7 +977,7 @@
     </param>
     <param>
       <key>_enabled</key>
-      <value>True</value>
+      <value>False</value>
     </param>
     <param>
       <key>label</key>
@@ -1056,46 +1025,42 @@
     </param>
   </block>
   <block>
-    <key>wxgui_scopesink2</key>
+    <key>variable_slider</key>
     <param>
       <key>id</key>
-      <value>wxgui_scopesink2_0_0_0</value>
+      <value>beta_0</value>
     </param>
     <param>
       <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>type</key>
-      <value>float</value>
+      <value>False</value>
     </param>
     <param>
-      <key>title</key>
-      <value>Scope Plot</value>
+      <key>label</key>
+      <value>Freq Beta</value>
     </param>
     <param>
-      <key>samp_rate</key>
-      <value>samp_rate</value>
+      <key>value</key>
+      <value>0.001</value>
     </param>
     <param>
-      <key>v_scale</key>
-      <value>9</value>
+      <key>min</key>
+      <value>0.0</value>
     </param>
     <param>
-      <key>t_scale</key>
-      <value>0</value>
+      <key>max</key>
+      <value>0.01</value>
     </param>
     <param>
-      <key>ac_couple</key>
-      <value>False</value>
+      <key>num_steps</key>
+      <value>1000</value>
     </param>
     <param>
-      <key>xy_mode</key>
-      <value>False</value>
+      <key>style</key>
+      <value>wx.SL_HORIZONTAL</value>
     </param>
     <param>
-      <key>num_inputs</key>
-      <value>1</value>
+      <key>converver</key>
+      <value>float_converter</value>
     </param>
     <param>
       <key>grid_pos</key>
@@ -1103,22 +1068,22 @@
     </param>
     <param>
       <key>notebook</key>
-      <value>notebook_0,1</value>
+      <value></value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(1115, 961)</value>
+      <value>(919, 7)</value>
     </param>
     <param>
       <key>_rotation</key>
-      <value>0</value>
+      <value>180</value>
     </param>
   </block>
   <block>
     <key>wxgui_scopesink2</key>
     <param>
       <key>id</key>
-      <value>wxgui_scopesink2_0_0_0_0</value>
+      <value>wxgui_scopesink2_0</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -1126,7 +1091,7 @@
     </param>
     <param>
       <key>type</key>
-      <value>float</value>
+      <value>complex</value>
     </param>
     <param>
       <key>title</key>
@@ -1138,7 +1103,7 @@
     </param>
     <param>
       <key>v_scale</key>
-      <value>1.25</value>
+      <value>0</value>
     </param>
     <param>
       <key>t_scale</key>
@@ -1162,11 +1127,11 @@
     </param>
     <param>
       <key>notebook</key>
-      <value>notebook_0,2</value>
+      <value></value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(1113, 844)</value>
+      <value>(1145, 258)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -1177,7 +1142,7 @@
     <key>wxgui_scopesink2</key>
     <param>
       <key>id</key>
-      <value>wxgui_scopesink2_0_0</value>
+      <value>wxgui_scopesink2_0_0_1</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -1185,7 +1150,7 @@
     </param>
     <param>
       <key>type</key>
-      <value>float</value>
+      <value>complex</value>
     </param>
     <param>
       <key>title</key>
@@ -1221,11 +1186,11 @@
     </param>
     <param>
       <key>notebook</key>
-      <value>notebook_0,0</value>
+      <value>notebook_0,4</value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(1113, 724)</value>
+      <value>(1107, 533)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -1233,58 +1198,96 @@
     </param>
   </block>
   <block>
-    <key>wxgui_scopesink2</key>
+    <key>variable</key>
     <param>
       <key>id</key>
-      <value>wxgui_scopesink2_0_0_1</value>
+      <value>spb_gen</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>type</key>
-      <value>complex</value>
+      <key>value</key>
+      <value>4</value>
     </param>
     <param>
-      <key>title</key>
-      <value>Error</value>
+      <key>_coordinate</key>
+      <value>(119, 841)</value>
     </param>
     <param>
-      <key>samp_rate</key>
-      <value>samp_rate</value>
+      <key>_rotation</key>
+      <value>0</value>
     </param>
+  </block>
+  <block>
+    <key>gr_float_to_complex</key>
     <param>
-      <key>v_scale</key>
-      <value>.5</value>
+      <key>id</key>
+      <value>gr_float_to_complex_0</value>
     </param>
     <param>
-      <key>t_scale</key>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>vlen</key>
+      <value>1</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(904, 184)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
       <value>0</value>
     </param>
+  </block>
+  <block>
+    <key>root_raised_cosine_filter</key>
     <param>
-      <key>ac_couple</key>
-      <value>False</value>
+      <key>id</key>
+      <value>root_raised_cosine_filter_0</value>
     </param>
     <param>
-      <key>xy_mode</key>
-      <value>False</value>
+      <key>_enabled</key>
+      <value>True</value>
     </param>
     <param>
-      <key>num_inputs</key>
+      <key>type</key>
+      <value>interp_fir_filter_fff</value>
+    </param>
+    <param>
+      <key>decim</key>
       <value>1</value>
     </param>
     <param>
-      <key>grid_pos</key>
-      <value></value>
+      <key>interp</key>
+      <value>spb_gen</value>
     </param>
     <param>
-      <key>notebook</key>
-      <value>notebook_0,4</value>
+      <key>gain</key>
+      <value>2*spb_gen</value>
+    </param>
+    <param>
+      <key>samp_rate</key>
+      <value>1.0</value>
+    </param>
+    <param>
+      <key>sym_rate</key>
+      <value>1./spb_gen</value>
+    </param>
+    <param>
+      <key>alpha</key>
+      <value>0.35</value>
+    </param>
+    <param>
+      <key>ntaps</key>
+      <value>11*spb_gen</value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(1111, 518)</value>
+      <value>(557, 140)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -1292,34 +1295,22 @@
     </param>
   </block>
   <block>
-    <key>notebook</key>
+    <key>variable</key>
     <param>
       <key>id</key>
-      <value>notebook_0</value>
+      <value>spb</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>style</key>
-      <value>wx.NB_TOP</value>
-    </param>
-    <param>
-      <key>labels</key>
-      <value>['error', 'phase', 'freq', 'FFT', 'Costas error']</value>
-    </param>
-    <param>
-      <key>grid_pos</key>
-      <value></value>
-    </param>
-    <param>
-      <key>notebook</key>
-      <value></value>
+      <key>value</key>
+      <value>4.01</value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(729, 769)</value>
+      <value>(32, 842)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -1334,7 +1325,7 @@
     </param>
     <param>
       <key>_enabled</key>
-      <value>True</value>
+      <value>False</value>
     </param>
     <param>
       <key>noise_voltage</key>
@@ -1350,7 +1341,7 @@
     </param>
     <param>
       <key>taps</key>
-      <value>1.0 + 1.0j</value>
+      <value>1.0</value>
     </param>
     <param>
       <key>seed</key>
@@ -1358,7 +1349,38 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(65, 542)</value>
+      <value>(59, 543)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+  </block>
+  <block>
+    <key>blks2_pfb_arb_resampler_ccf</key>
+    <param>
+      <key>id</key>
+      <value>blks2_pfb_arb_resampler_ccf_0</value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>rate</key>
+      <value>float(spb)/float(spb_gen)</value>
+    </param>
+    <param>
+      <key>taps</key>
+      <value>firdes.low_pass(320, 320, 0.45, 0.1)</value>
+    </param>
+    <param>
+      <key>size</key>
+      <value>320</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(874, 374)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -1409,69 +1431,101 @@
     </param>
   </block>
   <block>
-    <key>gr_throttle</key>
+    <key>wxgui_fftsink2</key>
     <param>
       <key>id</key>
-      <value>gr_throttle_0</value>
+      <value>wxgui_fftsink2_0</value>
     </param>
     <param>
       <key>_enabled</key>
-      <value>True</value>
+      <value>False</value>
     </param>
     <param>
       <key>type</key>
       <value>complex</value>
     </param>
     <param>
-      <key>samples_per_second</key>
+      <key>title</key>
+      <value>FFT Plot</value>
+    </param>
+    <param>
+      <key>samp_rate</key>
       <value>samp_rate</value>
     </param>
     <param>
-      <key>vlen</key>
-      <value>1</value>
+      <key>baseband_freq</key>
+      <value>0</value>
     </param>
     <param>
-      <key>_coordinate</key>
-      <value>(1129, 462)</value>
+      <key>y_per_div</key>
+      <value>10</value>
     </param>
     <param>
-      <key>_rotation</key>
+      <key>y_divs</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ref_level</key>
+      <value>50</value>
+    </param>
+    <param>
+      <key>ref_scale</key>
+      <value>2.0</value>
+    </param>
+    <param>
+      <key>fft_size</key>
+      <value>1024</value>
+    </param>
+    <param>
+      <key>fft_rate</key>
+      <value>30</value>
+    </param>
+    <param>
+      <key>peak_hold</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>average</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>avg_alpha</key>
       <value>0</value>
     </param>
-  </block>
-  <block>
-    <key>gr_costas_loop_cc</key>
     <param>
-      <key>id</key>
-      <value>gr_costas_loop_cc_0</value>
+      <key>grid_pos</key>
+      <value></value>
     </param>
     <param>
-      <key>_enabled</key>
-      <value>True</value>
+      <key>notebook</key>
+      <value>notebook_0,3</value>
     </param>
     <param>
-      <key>alpha</key>
-      <value>alpha_0</value>
+      <key>_coordinate</key>
+      <value>(517, 767)</value>
     </param>
     <param>
-      <key>beta</key>
-      <value>beta_0</value>
+      <key>_rotation</key>
+      <value>0</value>
     </param>
+  </block>
+  <block>
+    <key>variable</key>
     <param>
-      <key>max_freq</key>
-      <value>5</value>
+      <key>id</key>
+      <value>nfilts</value>
     </param>
     <param>
-      <key>min_freq</key>
-      <value>-5</value>
+      <key>_enabled</key>
+      <value>True</value>
     </param>
     <param>
-      <key>order</key>
-      <value>4</value>
+      <key>value</key>
+      <value>64</value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(916, 473)</value>
+      <value>(435, 686)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -1569,14 +1623,20 @@
     <sink_key>0</sink_key>
   </connection>
   <connection>
-    <source_block_id>gr_float_to_complex_0</source_block_id>
-    <sink_block_id>gr_channel_model_0</sink_block_id>
+    <source_block_id>gr_channel_model_0</source_block_id>
+    <sink_block_id>wxgui_fftsink2_0</sink_block_id>
     <source_key>0</source_key>
     <sink_key>0</sink_key>
   </connection>
   <connection>
     <source_block_id>gr_channel_model_0</source_block_id>
-    <sink_block_id>wxgui_fftsink2_0</sink_block_id>
+    <sink_block_id>gr_costas_loop_cc_0</sink_block_id>
+    <source_key>0</source_key>
+    <sink_key>0</sink_key>
+  </connection>
+  <connection>
+    <source_block_id>gr_costas_loop_cc_0</source_block_id>
+    <sink_block_id>gr_pfb_clock_sync_ccf_0</sink_block_id>
     <source_key>0</source_key>
     <sink_key>0</sink_key>
   </connection>
@@ -1586,6 +1646,12 @@
     <source_key>1</source_key>
     <sink_key>0</sink_key>
   </connection>
+  <connection>
+    <source_block_id>gr_pfb_clock_sync_ccf_0</source_block_id>
+    <sink_block_id>gr_throttle_0</sink_block_id>
+    <source_key>0</source_key>
+    <sink_key>0</sink_key>
+  </connection>
   <connection>
     <source_block_id>gr_channel_model_0</source_block_id>
     <sink_block_id>gr_pfb_clock_sync_ccf_0</sink_block_id>
@@ -1593,14 +1659,26 @@
     <sink_key>0</sink_key>
   </connection>
   <connection>
-    <source_block_id>gr_pfb_clock_sync_ccf_0</source_block_id>
-    <sink_block_id>gr_costas_loop_cc_0</sink_block_id>
+    <source_block_id>gr_float_to_complex_0</source_block_id>
+    <sink_block_id>blks2_pfb_arb_resampler_ccf_0</sink_block_id>
     <source_key>0</source_key>
     <sink_key>0</sink_key>
   </connection>
   <connection>
-    <source_block_id>gr_costas_loop_cc_0</source_block_id>
-    <sink_block_id>gr_throttle_0</sink_block_id>
+    <source_block_id>blks2_pfb_arb_resampler_ccf_0</source_block_id>
+    <sink_block_id>gr_channel_model_0</sink_block_id>
+    <source_key>0</source_key>
+    <sink_key>0</sink_key>
+  </connection>
+  <connection>
+    <source_block_id>blks2_pfb_arb_resampler_ccf_0</source_block_id>
+    <sink_block_id>wxgui_scopesink2_0_0_1</sink_block_id>
+    <source_key>0</source_key>
+    <sink_key>0</sink_key>
+  </connection>
+  <connection>
+    <source_block_id>blks2_pfb_arb_resampler_ccf_0</source_block_id>
+    <sink_block_id>gr_pfb_clock_sync_ccf_0</sink_block_id>
     <source_key>0</source_key>
     <sink_key>0</sink_key>
   </connection>
-- 
cgit v1.2.3


From 80841156673ff0e7eff376bceeeac9119f0e9493 Mon Sep 17 00:00:00 2001
From: Tom <trondeau@vt.edu>
Date: Fri, 9 Oct 2009 11:10:15 -0700
Subject: wip

---
 .../src/lib/filter/gr_pfb_clock_sync_ccf.cc        | 29 ++++++++++++++--------
 .../src/lib/filter/gr_pfb_clock_sync_ccf.h         | 10 ++++----
 .../src/lib/filter/gr_pfb_clock_sync_ccf.i         |  4 +--
 3 files changed, 25 insertions(+), 18 deletions(-)

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
index a75b20d383..08ab949d02 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
@@ -33,7 +33,7 @@
 #include <gr_io_signature.h>
 #include <gr_math.h>
 
-gr_pfb_clock_sync_ccf_sptr gr_make_pfb_clock_sync_ccf (float sps, float gain,
+gr_pfb_clock_sync_ccf_sptr gr_make_pfb_clock_sync_ccf (double sps, float gain,
 						       const std::vector<float> &taps,
 						       unsigned int filter_size,
 						       float init_phase,
@@ -47,7 +47,7 @@ gr_pfb_clock_sync_ccf_sptr gr_make_pfb_clock_sync_ccf (float sps, float gain,
 
 int ios[] = {sizeof(gr_complex), sizeof(float), sizeof(float), sizeof(float)};
 std::vector<int> iosig(ios, ios+sizeof(ios)/sizeof(int));
-gr_pfb_clock_sync_ccf::gr_pfb_clock_sync_ccf (float sps, float gain,
+gr_pfb_clock_sync_ccf::gr_pfb_clock_sync_ccf (double sps, float gain,
 					      const std::vector<float> &taps,
 					      unsigned int filter_size,
 					      float init_phase,
@@ -58,6 +58,7 @@ gr_pfb_clock_sync_ccf::gr_pfb_clock_sync_ccf (float sps, float gain,
     d_updated (false), d_sps(sps), d_nfilters(filter_size),
     d_max_dev(max_rate_deviation), d_start_count(0)
 {
+  printf("SPS: %f\n", d_sps);
   d_nfilters = filter_size;
 
   // Store the last filter between calls to work
@@ -240,14 +241,6 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items,
 
   // produce output as long as we can and there are enough input samples
   while((i < noutput_items) && (count < nrequired)) {
-    out[i] = d_filters[d_filtnum]->filter(&in[count]);
-    gr_complex diff = d_diff_filters[d_filtnum]->filter(&in[count]);
-    error_r  = out[i].real() * diff.real();
-    error_i  = out[i].imag() * diff.imag();
-    error = error_i + error_r;
-
-    d_k = d_k + d_alpha*error + d_rate;
-    d_rate = d_rate + d_beta*error;
     d_filtnum = (int)floor(d_k);
 
     // Keep the current filter number in [0, d_nfilters]
@@ -264,18 +257,32 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items,
       d_sample_num -= 1.0;
     }
     
+    out[i] = d_filters[d_filtnum]->filter(&in[count]);
+    gr_complex diff = d_diff_filters[d_filtnum]->filter(&in[count]);
+    error_r  = out[i].real() * diff.real();
+    error_i  = out[i].imag() * diff.imag();
+    error = error_i + error_r;
+
+    d_k = d_k + d_alpha*error + d_rate;
+    d_rate = d_rate + d_beta*error;
+
     // Keep our rate within a good range
     d_rate = gr_branchless_clip(d_rate, d_max_dev);
 
     i++;
+    int a = (int)floor(d_sample_num);
     d_sample_num += d_sps;
+    int b = a + (int)floor(d_sps);
     count = (int)floor(d_sample_num);
 
     if(output_items.size() > 2) {
       err[i] = error;
-      outrate[i] = d_rate;
       outk[i] = d_k;
     }
+    if(b != count) {
+      outrate[i] = 1;
+    }
+
   }
 
   // Set the start index at the next entrance to the work function
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
index 84e174b198..73bd7d6e6c 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
@@ -28,7 +28,7 @@
 
 class gr_pfb_clock_sync_ccf;
 typedef boost::shared_ptr<gr_pfb_clock_sync_ccf> gr_pfb_clock_sync_ccf_sptr;
-gr_pfb_clock_sync_ccf_sptr gr_make_pfb_clock_sync_ccf (float sps, float gain,
+gr_pfb_clock_sync_ccf_sptr gr_make_pfb_clock_sync_ccf (double sps, float gain,
 						       const std::vector<float> &taps,
 						       unsigned int filter_size=32,
 						       float init_phase=0,
@@ -51,17 +51,17 @@ class gr_pfb_clock_sync_ccf : public gr_block
   /*!
    * Build the polyphase filterbank timing synchronizer.
    */
-  friend gr_pfb_clock_sync_ccf_sptr gr_make_pfb_clock_sync_ccf (float sps, float gain,
+  friend gr_pfb_clock_sync_ccf_sptr gr_make_pfb_clock_sync_ccf (double sps, float gain,
 								const std::vector<float> &taps,
 								unsigned int filter_size,
 								float init_phase,
 								float max_rate_deviation);
 
   bool			   d_updated;
-  float                    d_sps;
+  double                   d_sps;
+  double                   d_sample_num;
   float                    d_alpha;
   float                    d_beta;
-  float                    d_sample_num;
   int                      d_nfilters;
   std::vector<gr_fir_ccf*> d_filters;
   std::vector<gr_fir_ccf*> d_diff_filters;
@@ -77,7 +77,7 @@ class gr_pfb_clock_sync_ccf : public gr_block
   /*!
    * Build the polyphase filterbank timing synchronizer.
    */
-  gr_pfb_clock_sync_ccf (float sps, float gain,
+  gr_pfb_clock_sync_ccf (double sps, float gain,
 			 const std::vector<float> &taps,
 			 unsigned int filter_size,
 			 float init_phase,
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.i b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.i
index 9957c33b75..1979842871 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.i
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.i
@@ -22,7 +22,7 @@
 
 GR_SWIG_BLOCK_MAGIC(gr,pfb_clock_sync_ccf);
 
-gr_pfb_clock_sync_ccf_sptr gr_make_pfb_clock_sync_ccf (float sps, float gain,
+gr_pfb_clock_sync_ccf_sptr gr_make_pfb_clock_sync_ccf (double sps, float gain,
 						       const std::vector<float> &taps,
 						       unsigned int filter_size=32,
 						       float init_phase=0,
@@ -31,7 +31,7 @@ gr_pfb_clock_sync_ccf_sptr gr_make_pfb_clock_sync_ccf (float sps, float gain,
 class gr_pfb_clock_sync_ccf : public gr_block
 {
  private:
-  gr_pfb_clock_sync_ccf (float sps, float gain,
+  gr_pfb_clock_sync_ccf (double sps, float gain,
 			 const std::vector<float> &taps,
 			 unsigned int filter_size,
 			 float init_phase,
-- 
cgit v1.2.3


From 1bce7d89c205502ed933add1a5e97c86db0b0d80 Mon Sep 17 00:00:00 2001
From: Tom <trondeau@vt.edu>
Date: Fri, 9 Oct 2009 13:26:37 -0700
Subject: Chaning update for fractional sample rate into filter index.

---
 gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc | 14 +++++---------
 1 file changed, 5 insertions(+), 9 deletions(-)

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
index 08ab949d02..56ad24ffcf 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
@@ -55,11 +55,11 @@ gr_pfb_clock_sync_ccf::gr_pfb_clock_sync_ccf (double sps, float gain,
   : gr_block ("pfb_clock_sync_ccf",
 	      gr_make_io_signature (1, 1, sizeof(gr_complex)),
 	      gr_make_io_signaturev (1, 4, iosig)),
-    d_updated (false), d_sps(sps), d_nfilters(filter_size),
+    d_updated (false), d_nfilters(filter_size),
     d_max_dev(max_rate_deviation), d_start_count(0)
 {
-  printf("SPS: %f\n", d_sps);
   d_nfilters = filter_size;
+  d_sps = floor(sps);
 
   // Store the last filter between calls to work
   // The accumulator keeps track of overflow to increment the stride correctly.
@@ -68,7 +68,8 @@ gr_pfb_clock_sync_ccf::gr_pfb_clock_sync_ccf (double sps, float gain,
   set_alpha(gain);
   set_beta(0.25*gain*gain);
   d_k = d_nfilters / 2;
-  d_rate = 0;
+  d_rate = (sps-floor(sps))*(double)d_nfilters;
+  printf("RATE: %f\n", d_rate);
   d_filtnum = (int)floor(d_k);
 
   d_filters = std::vector<gr_fir_ccf*>(d_nfilters);
@@ -270,19 +271,14 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items,
     d_rate = gr_branchless_clip(d_rate, d_max_dev);
 
     i++;
-    int a = (int)floor(d_sample_num);
     d_sample_num += d_sps;
-    int b = a + (int)floor(d_sps);
     count = (int)floor(d_sample_num);
 
     if(output_items.size() > 2) {
       err[i] = error;
+      outrate[i] = d_rate;
       outk[i] = d_k;
     }
-    if(b != count) {
-      outrate[i] = 1;
-    }
-
   }
 
   // Set the start index at the next entrance to the work function
-- 
cgit v1.2.3


From 5c70f942f8b1f979b5a58ec9b58ae409fa077005 Mon Sep 17 00:00:00 2001
From: Tom <trondeau@vt.edu>
Date: Fri, 9 Oct 2009 13:57:52 -0700
Subject: Working fractional sample rates in clock recovery algorithm.

---
 .../src/lib/filter/gr_pfb_clock_sync_ccf.cc        | 31 ++++++++++++----------
 1 file changed, 17 insertions(+), 14 deletions(-)

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
index 56ad24ffcf..fcd3686013 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
@@ -242,6 +242,14 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items,
 
   // produce output as long as we can and there are enough input samples
   while((i < noutput_items) && (count < nrequired)) {
+    out[i] = d_filters[d_filtnum]->filter(&in[count]);
+    gr_complex diff = d_diff_filters[d_filtnum]->filter(&in[count]);
+    error_r  = out[i].real() * diff.real();
+    error_i  = out[i].imag() * diff.imag();
+    error = error_i + error_r;
+
+    d_k = d_k + d_alpha*error + d_rate;
+    d_rate = d_rate + d_beta*error;
     d_filtnum = (int)floor(d_k);
 
     // Keep the current filter number in [0, d_nfilters]
@@ -250,29 +258,23 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items,
     while(d_filtnum >= d_nfilters) {
       d_k -= d_nfilters;
       d_filtnum -= d_nfilters;
-      d_sample_num += 1.0;
+      //d_sample_num += 1.0;
+      count += 1;
     }
     while(d_filtnum < 0) {
       d_k += d_nfilters;
       d_filtnum += d_nfilters;
-      d_sample_num -= 1.0;
+      //d_sample_num -= 1.0;
+      count -= 1;
     }
     
-    out[i] = d_filters[d_filtnum]->filter(&in[count]);
-    gr_complex diff = d_diff_filters[d_filtnum]->filter(&in[count]);
-    error_r  = out[i].real() * diff.real();
-    error_i  = out[i].imag() * diff.imag();
-    error = error_i + error_r;
-
-    d_k = d_k + d_alpha*error + d_rate;
-    d_rate = d_rate + d_beta*error;
-
     // Keep our rate within a good range
     d_rate = gr_branchless_clip(d_rate, d_max_dev);
 
     i++;
-    d_sample_num += d_sps;
-    count = (int)floor(d_sample_num);
+    //d_sample_num += d_sps;
+    //count = (int)floor(d_sample_num);
+    count += (int)floor(d_sps);
 
     if(output_items.size() > 2) {
       err[i] = error;
@@ -295,7 +297,8 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items,
     consume_each(count);
   }
   */
-  d_sample_num -= floor(d_sample_num);
+  //d_sample_num -= floor(d_sample_num);
+  d_sample_num = 0;
   consume_each(count);
 
   return i;
-- 
cgit v1.2.3


From baffe5aa1c39067b4b5777060bdbf84d3cb3c9fc Mon Sep 17 00:00:00 2001
From: Tom <trondeau@vt.edu>
Date: Fri, 9 Oct 2009 14:02:04 -0700
Subject: Cleaning up unused variable and code.

---
 .../src/lib/filter/gr_pfb_clock_sync_ccf.cc        | 26 ++--------------------
 .../src/lib/filter/gr_pfb_clock_sync_ccf.h         |  1 -
 2 files changed, 2 insertions(+), 25 deletions(-)

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
index fcd3686013..bfbbf8b8b4 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
@@ -56,7 +56,7 @@ gr_pfb_clock_sync_ccf::gr_pfb_clock_sync_ccf (double sps, float gain,
 	      gr_make_io_signature (1, 1, sizeof(gr_complex)),
 	      gr_make_io_signaturev (1, 4, iosig)),
     d_updated (false), d_nfilters(filter_size),
-    d_max_dev(max_rate_deviation), d_start_count(0)
+    d_max_dev(max_rate_deviation)
 {
   d_nfilters = filter_size;
   d_sps = floor(sps);
@@ -69,7 +69,6 @@ gr_pfb_clock_sync_ccf::gr_pfb_clock_sync_ccf (double sps, float gain,
   set_beta(0.25*gain*gain);
   d_k = d_nfilters / 2;
   d_rate = (sps-floor(sps))*(double)d_nfilters;
-  printf("RATE: %f\n", d_rate);
   d_filtnum = (int)floor(d_k);
 
   d_filters = std::vector<gr_fir_ccf*>(d_nfilters);
@@ -237,7 +236,7 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items,
   // We need this many to process one output
   int nrequired = ninput_items[0] - d_taps_per_filter;
 
-  int i = 0, count = (int)floor(d_sample_num);
+  int i = 0, count = 0;
   float error, error_r, error_i;
 
   // produce output as long as we can and there are enough input samples
@@ -258,13 +257,11 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items,
     while(d_filtnum >= d_nfilters) {
       d_k -= d_nfilters;
       d_filtnum -= d_nfilters;
-      //d_sample_num += 1.0;
       count += 1;
     }
     while(d_filtnum < 0) {
       d_k += d_nfilters;
       d_filtnum += d_nfilters;
-      //d_sample_num -= 1.0;
       count -= 1;
     }
     
@@ -272,8 +269,6 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items,
     d_rate = gr_branchless_clip(d_rate, d_max_dev);
 
     i++;
-    //d_sample_num += d_sps;
-    //count = (int)floor(d_sample_num);
     count += (int)floor(d_sps);
 
     if(output_items.size() > 2) {
@@ -282,23 +277,6 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items,
       outk[i] = d_k;
     }
   }
-
-  // Set the start index at the next entrance to the work function
-  // if we stop because we run out of input items, jump ahead in the
-  // next call to work. Otherwise, we can start at zero.
-  /*
-  if(count > nrequired) {
-    //d_start_count = count - (nrequired);
-    d_sample_num -= nrequired;
-    consume_each(ninput_items[0]-d_taps_per_filter);
-  }
-  else {
-    d_sample_num -= floor(d_sample_num);
-    consume_each(count);
-  }
-  */
-  //d_sample_num -= floor(d_sample_num);
-  d_sample_num = 0;
   consume_each(count);
 
   return i;
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
index 73bd7d6e6c..778db59e5b 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
@@ -72,7 +72,6 @@ class gr_pfb_clock_sync_ccf : public gr_block
   float                    d_max_dev;
   int                      d_filtnum;
   int                      d_taps_per_filter;
-  unsigned int             d_start_count;
 
   /*!
    * Build the polyphase filterbank timing synchronizer.
-- 
cgit v1.2.3


From abbd0afddfec59a8a9bbf0d5da4625e1c28f4135 Mon Sep 17 00:00:00 2001
From: Tom <trondeau@vt.edu>
Date: Fri, 9 Oct 2009 14:03:33 -0700
Subject: Moving filter number decision to start work function.

---
 gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
index bfbbf8b8b4..1507d7492a 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
@@ -241,14 +241,6 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items,
 
   // produce output as long as we can and there are enough input samples
   while((i < noutput_items) && (count < nrequired)) {
-    out[i] = d_filters[d_filtnum]->filter(&in[count]);
-    gr_complex diff = d_diff_filters[d_filtnum]->filter(&in[count]);
-    error_r  = out[i].real() * diff.real();
-    error_i  = out[i].imag() * diff.imag();
-    error = error_i + error_r;
-
-    d_k = d_k + d_alpha*error + d_rate;
-    d_rate = d_rate + d_beta*error;
     d_filtnum = (int)floor(d_k);
 
     // Keep the current filter number in [0, d_nfilters]
@@ -264,6 +256,15 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items,
       d_filtnum += d_nfilters;
       count -= 1;
     }
+
+    out[i] = d_filters[d_filtnum]->filter(&in[count]);
+    gr_complex diff = d_diff_filters[d_filtnum]->filter(&in[count]);
+    error_r  = out[i].real() * diff.real();
+    error_i  = out[i].imag() * diff.imag();
+    error = error_i + error_r;
+
+    d_k = d_k + d_alpha*error + d_rate;
+    d_rate = d_rate + d_beta*error;
     
     // Keep our rate within a good range
     d_rate = gr_branchless_clip(d_rate, d_max_dev);
-- 
cgit v1.2.3


From 3006298886b72b7d7da5c803c16f5b07b72a05ef Mon Sep 17 00:00:00 2001
From: Tom <trondeau@vt.edu>
Date: Fri, 9 Oct 2009 14:33:39 -0700
Subject: Cleaning up constructor.

---
 gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
index 1507d7492a..3af53fed5b 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
@@ -64,10 +64,9 @@ gr_pfb_clock_sync_ccf::gr_pfb_clock_sync_ccf (double sps, float gain,
   // Store the last filter between calls to work
   // The accumulator keeps track of overflow to increment the stride correctly.
   // set it here to the fractional difference based on the initial phaes
-  // assert(init_phase <= 2*M_PI);
   set_alpha(gain);
   set_beta(0.25*gain*gain);
-  d_k = d_nfilters / 2;
+  d_k = init_phase;
   d_rate = (sps-floor(sps))*(double)d_nfilters;
   d_filtnum = (int)floor(d_k);
 
-- 
cgit v1.2.3


From 016fccfd58c68ad52fd845419f57e03370851b1f Mon Sep 17 00:00:00 2001
From: Tom <trondeau@vt.edu>
Date: Fri, 9 Oct 2009 18:21:08 -0700
Subject: Adding new DBPSK block with new PFB clock recovery alg.

---
 .../src/python/gnuradio/blks2impl/dbpsk2.py        | 353 +++++++++++++++++++++
 1 file changed, 353 insertions(+)
 create mode 100644 gnuradio-core/src/python/gnuradio/blks2impl/dbpsk2.py

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/dbpsk2.py b/gnuradio-core/src/python/gnuradio/blks2impl/dbpsk2.py
new file mode 100644
index 0000000000..e9e3e965fe
--- /dev/null
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/dbpsk2.py
@@ -0,0 +1,353 @@
+#
+# Copyright 2005,2006,2007 Free Software Foundation, Inc.
+# 
+# This file is part of GNU Radio
+# 
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+# 
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+# 
+
+# See gnuradio-examples/python/digital for examples
+
+"""
+differential BPSK modulation and demodulation.
+"""
+
+from gnuradio import gr, gru, modulation_utils
+from math import pi, sqrt
+import psk
+import cmath
+from pprint import pprint
+
+# default values (used in __init__ and add_options)
+_def_samples_per_symbol = 2
+_def_excess_bw = 0.35
+_def_gray_code = True
+_def_verbose = False
+_def_log = False
+
+_def_costas_alpha = 0.1
+_def_timing_alpha = None
+_def_timing_beta = None
+_def_timing_max_dev = 1.5
+
+
+# /////////////////////////////////////////////////////////////////////////////
+#                             DBPSK modulator
+# /////////////////////////////////////////////////////////////////////////////
+
+class dbpsk2_mod(gr.hier_block2):
+
+    def __init__(self,
+                 samples_per_symbol=_def_samples_per_symbol,
+                 excess_bw=_def_excess_bw,
+                 gray_code=_def_gray_code,
+                 verbose=_def_verbose,
+                 log=_def_log):
+        """
+	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.
+        
+	@param samples_per_symbol: samples per baud >= 2
+	@type samples_per_symbol: integer
+	@param excess_bw: Root-raised cosine filter excess bandwidth
+	@type excess_bw: float
+        @param gray_code: Tell modulator to Gray code the bits
+        @type gray_code: bool
+        @param verbose: Print information about modulator?
+        @type verbose: bool
+        @param log: Log modulation data to files?
+        @type log: bool
+	"""
+
+	gr.hier_block2.__init__(self, "dbpsk_mod",
+				gr.io_signature(1, 1, gr.sizeof_char),       # Input signature
+				gr.io_signature(1, 1, gr.sizeof_gr_complex)) # Output signature
+
+        self._samples_per_symbol = samples_per_symbol
+        self._excess_bw = excess_bw
+        self._gray_code = gray_code
+
+        if not isinstance(self._samples_per_symbol, int) or self._samples_per_symbol < 2:
+            raise TypeError, ("sbp must be an integer >= 2, is %d" % self._samples_per_symbol)
+        
+	ntaps = 11 * self._samples_per_symbol
+
+        arity = pow(2,self.bits_per_symbol())
+        
+        # turn bytes into k-bit vectors
+        self.bytes2chunks = \
+          gr.packed_to_unpacked_bb(self.bits_per_symbol(), gr.GR_MSB_FIRST)
+
+        if self._gray_code:
+            self.symbol_mapper = gr.map_bb(psk.binary_to_gray[arity])
+        else:
+            self.symbol_mapper = gr.map_bb(psk.binary_to_ungray[arity])
+
+        self.diffenc = gr.diff_encoder_bb(arity)
+
+        self.chunks2symbols = gr.chunks_to_symbols_bc(psk.constellation[arity])
+
+        # 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)
+	    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(self._samples_per_symbol,
+                                                   self.rrc_taps)
+
+	# Connect
+        self.connect(self, self.bytes2chunks, self.symbol_mapper, self.diffenc,
+                     self.chunks2symbols, self.rrc_filter, self)
+
+        if verbose:
+            self._print_verbage()
+            
+        if log:
+            self._setup_logging()
+            
+
+    def samples_per_symbol(self):
+        return self._samples_per_symbol
+
+    def bits_per_symbol(self=None):   # static method that's also callable on an instance
+        return 1
+    bits_per_symbol = staticmethod(bits_per_symbol)      # make it a static method.  RTFM
+
+    def add_options(parser):
+        """
+        Adds DBPSK modulation-specific options to the standard parser
+        """
+        parser.add_option("", "--excess-bw", type="float", default=_def_excess_bw,
+                          help="set RRC excess bandwith factor [default=%default]")
+        parser.add_option("", "--no-gray-code", dest="gray_code",
+                          action="store_false", default=True,
+                          help="disable gray coding on modulated bits (PSK)")
+    add_options=staticmethod(add_options)
+
+    def extract_kwargs_from_options(options):
+        """
+        Given command line options, create dictionary suitable for passing to __init__
+        """
+        return modulation_utils.extract_kwargs_from_options(dbpsk2_mod.__init__,
+                                                            ('self',), options)
+    extract_kwargs_from_options=staticmethod(extract_kwargs_from_options)
+
+
+    def _print_verbage(self):
+        print "\nModulator:"
+        print "bits per symbol:     %d" % self.bits_per_symbol()
+        print "Gray code:           %s" % self._gray_code
+        print "RRC roll-off factor: %.2f" % self._excess_bw
+
+    def _setup_logging(self):
+        print "Modulation logging turned on."
+        self.connect(self.bytes2chunks,
+                     gr.file_sink(gr.sizeof_char, "tx_bytes2chunks.dat"))
+        self.connect(self.symbol_mapper,
+                     gr.file_sink(gr.sizeof_char, "tx_graycoder.dat"))
+        self.connect(self.diffenc,
+                     gr.file_sink(gr.sizeof_char, "tx_diffenc.dat"))
+        self.connect(self.chunks2symbols,
+                     gr.file_sink(gr.sizeof_gr_complex, "tx_chunks2symbols.dat"))
+        self.connect(self.rrc_filter,
+                     gr.file_sink(gr.sizeof_gr_complex, "tx_rrc_filter.dat"))
+              
+
+# /////////////////////////////////////////////////////////////////////////////
+#                             DBPSK demodulator
+#
+#      Differentially coherent detection of differentially encoded BPSK
+# /////////////////////////////////////////////////////////////////////////////
+
+class dbpsk2_demod(gr.hier_block2):
+
+    def __init__(self,
+                 samples_per_symbol=_def_samples_per_symbol,
+                 excess_bw=_def_excess_bw,
+                 costas_alpha=_def_costas_alpha,
+                 timing_alpha=_def_timing_alpha,
+                 timing_max_dev=_def_timing_max_dev,
+                 gray_code=_def_gray_code,
+                 verbose=_def_verbose,
+                 log=_def_log):
+        """
+	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 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_alpha: float
+        @param timing_alpha: timing loop alpha gain
+        @type timing_alpha: float
+        @param timing_max: timing loop maximum rate deviations
+        @type timing_max: float
+        @param gray_code: Tell modulator to Gray code the bits
+        @type gray_code: bool
+        @param verbose: Print information about modulator?
+        @type verbose: bool
+        @param debug: Print modualtion data to files?
+        @type debug: bool
+	"""
+        
+	gr.hier_block2.__init__(self, "dbpsk2_demod",
+				gr.io_signature(1, 1, gr.sizeof_gr_complex), # Input signature
+				gr.io_signature(1, 1, gr.sizeof_char))       # Output signature
+				
+        self._samples_per_symbol = samples_per_symbol
+        self._excess_bw = excess_bw
+        self._costas_alpha = costas_alpha
+        self._timing_alpha = timing_alpha
+        self._timing_beta = _def_timing_alpha
+        self._timing_max_dev=timing_max_dev
+        self._gray_code = gray_code
+        
+        if samples_per_symbol < 2:
+            raise TypeError, "samples_per_symbol must be >= 2, is %r" % (samples_per_symbol,)
+
+        arity = pow(2,self.bits_per_symbol())
+
+        # Automatic gain control
+        #self.agc = gr.agc2_cc(0.6e-1, 1e-3, 1, 1, 100)
+        self.agc = gr.feedforward_agc_cc(16, 1.0)
+
+        self._costas_beta  = 0.25 * self._costas_alpha * self._costas_alpha
+        fmin = -0.25
+        fmax = 0.25
+        
+        self.clock_recov = gr.costas_loop_cc(self._costas_alpha,
+                                             self._costas_beta,
+                                             fmax, fmin, arity)
+
+        # symbol clock recovery
+        if not self._timing_alpha:
+            self._timing_alpha = 2
+            self._timing_beta = 0.020
+            
+        # RRC data filter
+        nfilts = 8
+        ntaps = 11 * samples_per_symbol*nfilts
+        taps = gr.firdes.root_raised_cosine(nfilts, nfilts, 0.25, self._excess_bw, ntaps)
+        self.time_recov = gr.pfb_clock_sync_ccf(self._samples_per_symbol,
+                                                self._timing_alpha,
+                                                taps, nfilts, nfilts/2, self._timing_max_dev)
+        self.time_recov.set_beta(self._timing_beta)
+            
+        # Do differential decoding based on phase change of symbols
+        self.diffdec = gr.diff_phasor_cc()
+
+        # find closest constellation point
+        rot = 1
+        rotated_const = map(lambda pt: pt * rot, psk.constellation[arity])
+        self.slicer = gr.constellation_decoder_cb(rotated_const, range(arity))
+
+        if self._gray_code:
+            self.symbol_mapper = gr.map_bb(psk.gray_to_binary[arity])
+        else:
+            self.symbol_mapper = gr.map_bb(psk.ungray_to_binary[arity])
+        
+        # unpack the k bit vector into a stream of bits
+        self.unpack = gr.unpack_k_bits_bb(self.bits_per_symbol())
+
+        if verbose:
+            self._print_verbage()
+
+        if log:
+            self._setup_logging()
+
+        # Connect and Initialize base class
+        self.connect(self, self.agc,
+                     #self.clock_recov,
+                     self.time_recov,
+                     self.diffdec, self.slicer, self.symbol_mapper, self.unpack, self)
+
+    def samples_per_symbol(self):
+        return self._samples_per_symbol
+
+    def bits_per_symbol(self=None):   # staticmethod that's also callable on an instance
+        return 1
+    bits_per_symbol = staticmethod(bits_per_symbol)      # make it a static method.  RTFM
+
+    def _print_verbage(self):
+        print "\nDemodulator:"
+        print "bits per symbol:     %d"   % self.bits_per_symbol()
+        print "Gray code:           %s"   % self._gray_code
+        print "RRC roll-off factor: %.2f" % self._excess_bw
+        print "Costas Loop alpha:   %.2f" % self._costas_alpha
+        print "Costas Loop beta:    %.2f" % self._costas_beta
+        print "Timing alpha gain:   %.2f" % self._timing_alpha
+        print "Timing beta gain:    %.2f" % self._timing_beta
+        print "Timing max dev:      %.2f" % self._timing_max_dev
+
+    def _setup_logging(self):
+        print "Modulation logging turned on."
+        self.connect(self.pre_scaler,
+                         gr.file_sink(gr.sizeof_gr_complex, "rx_prescaler.dat"))
+        self.connect(self.agc,
+                     gr.file_sink(gr.sizeof_gr_complex, "rx_agc.dat"))
+        self.connect(self.rrc_filter,
+                     gr.file_sink(gr.sizeof_gr_complex, "rx_rrc_filter.dat"))
+        self.connect(self.receiver,
+                     gr.file_sink(gr.sizeof_gr_complex, "rx_receiver.dat"))
+        self.connect(self.diffdec,
+                     gr.file_sink(gr.sizeof_gr_complex, "rx_diffdec.dat"))        
+        self.connect(self.slicer,
+                    gr.file_sink(gr.sizeof_char, "rx_slicer.dat"))
+        self.connect(self.symbol_mapper,
+                     gr.file_sink(gr.sizeof_char, "rx_symbol_mapper.dat"))
+        self.connect(self.unpack,
+                     gr.file_sink(gr.sizeof_char, "rx_unpack.dat"))
+        
+    def add_options(parser):
+        """
+        Adds DBPSK demodulation-specific options to the standard parser
+        """
+        parser.add_option("", "--excess-bw", type="float", default=_def_excess_bw,
+                          help="set RRC excess bandwith factor [default=%default] (PSK)")
+        parser.add_option("", "--no-gray-code", dest="gray_code",
+                          action="store_false", default=_def_gray_code,
+                          help="disable gray coding on modulated bits (PSK)")
+        parser.add_option("", "--costas-alpha", type="float", default=None,
+                          help="set Costas loop alpha value [default=%default] (PSK)")
+        parser.add_option("", "--gain-alpha", type="float", default=_def_timing_alpha,
+                          help="set timing symbol sync loop gain alpha value [default=%default] (GMSK/PSK)")
+        parser.add_option("", "--gain-beta", type="float", default=_def_timing_beta,
+                          help="set timing symbol sync loop gain beta value [default=%default] (GMSK/PSK)")
+        parser.add_option("", "--timing-max-dev", type="float", default=_def_timing_max_dev,
+                          help="set timing symbol sync loop maximum deviation [default=%default] (GMSK/PSK)")
+    add_options=staticmethod(add_options)
+    
+    def extract_kwargs_from_options(options):
+        """
+        Given command line options, create dictionary suitable for passing to __init__
+        """
+        return modulation_utils.extract_kwargs_from_options(
+                 dbpsk2_demod.__init__, ('self',), options)
+    extract_kwargs_from_options=staticmethod(extract_kwargs_from_options)
+#
+# Add these to the mod/demod registry
+#
+modulation_utils.add_type_1_mod('dbpsk2', dbpsk2_mod)
+modulation_utils.add_type_1_demod('dbpsk2', dbpsk2_demod)
-- 
cgit v1.2.3


From 19e2cc4b27664a1e4fe64167b3846f3eba79db46 Mon Sep 17 00:00:00 2001
From: Tom <trondeau@vt.edu>
Date: Fri, 9 Oct 2009 18:21:36 -0700
Subject: Making old dbpsk work again to compare against new version.

---
 .../src/lib/general/gr_mpsk_receiver_cc.cc         |  2 +-
 .../src/python/gnuradio/blks2impl/Makefile.am      |  1 +
 .../src/python/gnuradio/blks2impl/dbpsk.py         | 36 +++++-----------------
 3 files changed, 10 insertions(+), 29 deletions(-)

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/lib/general/gr_mpsk_receiver_cc.cc b/gnuradio-core/src/lib/general/gr_mpsk_receiver_cc.cc
index 89ea4a232c..1efa827035 100644
--- a/gnuradio-core/src/lib/general/gr_mpsk_receiver_cc.cc
+++ b/gnuradio-core/src/lib/general/gr_mpsk_receiver_cc.cc
@@ -35,7 +35,7 @@
 
 #define M_TWOPI (2*M_PI)
 #define VERBOSE_MM     0     // Used for debugging symbol timing loop
-#define VERBOSE_COSTAS 1     // Used for debugging phase and frequency tracking
+#define VERBOSE_COSTAS 0     // Used for debugging phase and frequency tracking
 
 // Public constructor
 
diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/Makefile.am b/gnuradio-core/src/python/gnuradio/blks2impl/Makefile.am
index f0825b1513..17ce1fff94 100644
--- a/gnuradio-core/src/python/gnuradio/blks2impl/Makefile.am
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/Makefile.am
@@ -31,6 +31,7 @@ grblkspython_PYTHON =		\
 	am_demod.py		\
 	channel_model.py	\
 	dbpsk.py		\
+	dbpsk2.py		\
 	dqpsk.py		\
 	d8psk.py		\
 	filterbank.py		\
diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/dbpsk.py b/gnuradio-core/src/python/gnuradio/blks2impl/dbpsk.py
index ac2e9323fb..47a13a787a 100644
--- a/gnuradio-core/src/python/gnuradio/blks2impl/dbpsk.py
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/dbpsk.py
@@ -251,37 +251,19 @@ class dbpsk_demod(gr.hier_block2):
         # symbol clock recovery
         if not self._mm_gain_mu:
             self._mm_gain_mu = 0.1
-            
+
         self._mm_omega = self._samples_per_symbol
         self._mm_gain_omega = .25 * self._mm_gain_mu * self._mm_gain_mu
         self._costas_beta  = 0.25 * self._costas_alpha * self._costas_alpha
         fmin = -0.25
         fmax = 0.25
         
-        #self.receiver=gr.mpsk_receiver_cc(arity, 0,
-        #                                 self._costas_alpha, self._costas_beta,
-        #                                 fmin, fmax,
-        #                                 self._mm_mu, self._mm_gain_mu,
-        #                                 self._mm_omega, self._mm_gain_omega,
-        #                                 self._mm_omega_relative_limit)
-
-        self.clock_recov = gr.costas_loop_cc(self._costas_alpha,
-                                             self._costas_beta,
-                                             fmax, fmin, arity)
-        if 0:
-            self.time_recov = gr.clock_recovery_mm_cc(self._mm_omega,
-                                                      self._mm_gain_omega,
-                                                      self._mm_mu,
-                                                      self._mm_gain_mu,
-                                                      self._mm_omega_relative_limit)
-        else:
-            nfilts = 8
-            ntaps = nfilts*ntaps
-            taps = gr.firdes.root_raised_cosine(
-                nfilts, 1.0, 0.25/nfilts, self._excess_bw, ntaps)
-            self.time_recov = gr.pfb_clock_sync_ccf(self._mm_omega,
-                                                    self._mm_gain_mu,
-                                                    taps, nfilts)
+        self.receiver=gr.mpsk_receiver_cc(arity, 0,
+                                          self._costas_alpha, self._costas_beta,
+                                          fmin, fmax,
+                                          self._mm_mu, self._mm_gain_mu,
+                                          self._mm_omega, self._mm_gain_omega,
+                                          self._mm_omega_relative_limit)
             
         # Do differential decoding based on phase change of symbols
         self.diffdec = gr.diff_phasor_cc()
@@ -306,9 +288,7 @@ class dbpsk_demod(gr.hier_block2):
             self._setup_logging()
 
         # Connect and Initialize base class
-        self.connect(self, self.pre_scaler, self.agc, #self.rrc_filter, self.receiver,
-                     #self.clock_recov,
-                     self.time_recov,
+        self.connect(self, self.pre_scaler, self.agc, self.rrc_filter, self.receiver,
                      self.diffdec, self.slicer, self.symbol_mapper, self.unpack, self)
 
     def samples_per_symbol(self):
-- 
cgit v1.2.3


From b5374350ea98bee6802976937f84ce91f1f721a6 Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Mon, 12 Oct 2009 13:21:59 -0400
Subject: A bit of code cleanup.

---
 gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc | 14 ++------------
 1 file changed, 2 insertions(+), 12 deletions(-)

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
index 3af53fed5b..8271fe6b9e 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
@@ -118,14 +118,12 @@ gr_pfb_clock_sync_ccf::set_taps (const std::vector<float> &newtaps,
   // Partition the filter
   for(i = 0; i < d_nfilters; i++) {
     // Each channel uses all d_taps_per_filter with 0's if not enough taps to fill out
-    //ourtaps[i] = std::vector<float>(d_taps_per_filter, 0);
     ourtaps[d_nfilters-1-i] = std::vector<float>(d_taps_per_filter, 0);
     for(j = 0; j < d_taps_per_filter; j++) {
       ourtaps[d_nfilters - 1 - i][j] = tmp_taps[i + j*d_nfilters];
     }
     
     // Build a filter for each channel and add it's taps to it
-    //ourfilter[i]->set_taps(ourtaps[i]);
     ourfilter[i]->set_taps(ourtaps[d_nfilters-1-i]);
   }
 
@@ -139,22 +137,13 @@ void
 gr_pfb_clock_sync_ccf::create_diff_taps(const std::vector<float> &newtaps,
 					std::vector<float> &difftaps)
 {
-  float maxtap = -1e12;
   difftaps.clear();
   difftaps.push_back(0); //newtaps[0]);
   for(unsigned int i = 1; i < newtaps.size()-1; i++) {
     float tap = newtaps[i+1] - newtaps[i-1];
-    if(tap > maxtap) {
-     maxtap = tap;
-    }
-    //maxtap += tap;
     difftaps.push_back(tap);
   }
   difftaps.push_back(0);//-newtaps[newtaps.size()-1]);
-
-  for(unsigned int i = 0; i < difftaps.size(); i++) {
-    difftaps[i] /= 1;//maxtap;
-  }
 }
 
 void
@@ -260,8 +249,9 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items,
     gr_complex diff = d_diff_filters[d_filtnum]->filter(&in[count]);
     error_r  = out[i].real() * diff.real();
     error_i  = out[i].imag() * diff.imag();
-    error = error_i + error_r;
+    error = (error_i + error_r) / 2.0;       // average error from I&Q channel
 
+    // Run the control loop to update the current phase (k) and tracking rate
     d_k = d_k + d_alpha*error + d_rate;
     d_rate = d_rate + d_beta*error;
     
-- 
cgit v1.2.3


From cd963d806b7f324fd845c7b51ef20985000b774c Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Mon, 12 Oct 2009 13:26:00 -0400
Subject: Working DBPSK implementation with new PFB clock recovery block. The
 feedforward AGC wasn't playing nicely, the frequency aquistion range was
 increased to swing half the sample rate in either direction, and the number
 of filter phases to use was increased to 32.

---
 gnuradio-core/src/python/gnuradio/blks2impl/dbpsk2.py | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/dbpsk2.py b/gnuradio-core/src/python/gnuradio/blks2impl/dbpsk2.py
index e9e3e965fe..e2bce5ff08 100644
--- a/gnuradio-core/src/python/gnuradio/blks2impl/dbpsk2.py
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/dbpsk2.py
@@ -230,12 +230,13 @@ class dbpsk2_demod(gr.hier_block2):
         arity = pow(2,self.bits_per_symbol())
 
         # Automatic gain control
-        #self.agc = gr.agc2_cc(0.6e-1, 1e-3, 1, 1, 100)
-        self.agc = gr.feedforward_agc_cc(16, 1.0)
+        self.agc = gr.agc2_cc(0.6e-1, 1e-3, 1, 1, 100)
+        #self.agc = gr.feedforward_agc_cc(16, 1.0)
 
         self._costas_beta  = 0.25 * self._costas_alpha * self._costas_alpha
-        fmin = -0.25
-        fmax = 0.25
+        # Allow a frequency swing of +/- half of the sample rate
+        fmin = -0.5
+        fmax = 0.5
         
         self.clock_recov = gr.costas_loop_cc(self._costas_alpha,
                                              self._costas_beta,
@@ -247,9 +248,9 @@ class dbpsk2_demod(gr.hier_block2):
             self._timing_beta = 0.020
             
         # RRC data filter
-        nfilts = 8
+        nfilts = 32
         ntaps = 11 * samples_per_symbol*nfilts
-        taps = gr.firdes.root_raised_cosine(nfilts, nfilts, 0.25, self._excess_bw, ntaps)
+        taps = gr.firdes.root_raised_cosine(nfilts, nfilts, 1.0/float(self._samples_per_symbol), self._excess_bw, ntaps)
         self.time_recov = gr.pfb_clock_sync_ccf(self._samples_per_symbol,
                                                 self._timing_alpha,
                                                 taps, nfilts, nfilts/2, self._timing_max_dev)
@@ -279,7 +280,7 @@ class dbpsk2_demod(gr.hier_block2):
 
         # Connect and Initialize base class
         self.connect(self, self.agc,
-                     #self.clock_recov,
+                     self.clock_recov,
                      self.time_recov,
                      self.diffdec, self.slicer, self.symbol_mapper, self.unpack, self)
 
-- 
cgit v1.2.3


From 45d5eda3eb2069e963f913570e3de80184e0e6ce Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Mon, 12 Oct 2009 16:03:47 -0400
Subject: Minor fixes for logging.

---
 gnuradio-core/src/python/gnuradio/blks2impl/dbpsk2.py | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/dbpsk2.py b/gnuradio-core/src/python/gnuradio/blks2impl/dbpsk2.py
index e2bce5ff08..c56b598fab 100644
--- a/gnuradio-core/src/python/gnuradio/blks2impl/dbpsk2.py
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/dbpsk2.py
@@ -278,7 +278,7 @@ class dbpsk2_demod(gr.hier_block2):
         if log:
             self._setup_logging()
 
-        # Connect and Initialize base class
+        # Connect
         self.connect(self, self.agc,
                      self.clock_recov,
                      self.time_recov,
@@ -310,8 +310,10 @@ class dbpsk2_demod(gr.hier_block2):
                      gr.file_sink(gr.sizeof_gr_complex, "rx_agc.dat"))
         self.connect(self.rrc_filter,
                      gr.file_sink(gr.sizeof_gr_complex, "rx_rrc_filter.dat"))
-        self.connect(self.receiver,
-                     gr.file_sink(gr.sizeof_gr_complex, "rx_receiver.dat"))
+        self.connect(self.clock_recov,
+                     gr.file_sink(gr.sizeof_gr_complex, "rx_clock_recov.dat"))
+        self.connect(self.time_recov,
+                     gr.file_sink(gr.sizeof_gr_complex, "rx_time_recov.dat"))
         self.connect(self.diffdec,
                      gr.file_sink(gr.sizeof_gr_complex, "rx_diffdec.dat"))        
         self.connect(self.slicer,
-- 
cgit v1.2.3


From 4d65d1d205c447375c75ed30e9c24ee868276bfd Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Mon, 12 Oct 2009 16:04:21 -0400
Subject: Adding DQPSK version that uses the PFB timing sync block (dqpsk2).

---
 .../src/python/gnuradio/blks2impl/dqpsk2.py        | 358 +++++++++++++++++++++
 1 file changed, 358 insertions(+)
 create mode 100644 gnuradio-core/src/python/gnuradio/blks2impl/dqpsk2.py

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/dqpsk2.py b/gnuradio-core/src/python/gnuradio/blks2impl/dqpsk2.py
new file mode 100644
index 0000000000..05363bf04c
--- /dev/null
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/dqpsk2.py
@@ -0,0 +1,358 @@
+#
+# Copyright 2005,2006,2007,2009 Free Software Foundation, Inc.
+# 
+# This file is part of GNU Radio
+# 
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+# 
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+# 
+
+# See gnuradio-examples/python/digital for examples
+
+"""
+differential QPSK modulation and demodulation.
+"""
+
+from gnuradio import gr, gru, modulation_utils
+from math import pi, sqrt
+import psk
+import cmath
+from pprint import pprint
+
+# default values (used in __init__ and add_options)
+_def_samples_per_symbol = 2
+_def_excess_bw = 0.35
+_def_gray_code = True
+_def_verbose = False
+_def_log = False
+
+_def_costas_alpha = 0.01
+_def_timing_alpha = None
+_def_timing_beta = None
+_def_timing_max_dev = 1.5
+
+
+# /////////////////////////////////////////////////////////////////////////////
+#                           DQPSK modulator
+# /////////////////////////////////////////////////////////////////////////////
+
+class dqpsk2_mod(gr.hier_block2):
+
+    def __init__(self,
+                 samples_per_symbol=_def_samples_per_symbol,
+                 excess_bw=_def_excess_bw,
+                 gray_code=_def_gray_code,
+                 verbose=_def_verbose,
+                 log=_def_log):
+        """
+	Hierarchical block for RRC-filtered QPSK modulation.
+
+	The input is a byte stream (unsigned char) and the
+	output is the complex modulated signal at baseband.
+
+	@param samples_per_symbol: samples per symbol >= 2
+	@type samples_per_symbol: integer
+	@param excess_bw: Root-raised cosine filter excess bandwidth
+	@type excess_bw: float
+        @param gray_code: Tell modulator to Gray code the bits
+        @type gray_code: bool
+        @param verbose: Print information about modulator?
+        @type verbose: bool
+        @param debug: Print modualtion data to files?
+        @type debug: bool
+	"""
+
+	gr.hier_block2.__init__(self, "dqpsk2_mod",
+				gr.io_signature(1, 1, gr.sizeof_char),       # Input signature
+				gr.io_signature(1, 1, gr.sizeof_gr_complex)) # Output signature
+
+        self._samples_per_symbol = samples_per_symbol
+        self._excess_bw = excess_bw
+        self._gray_code = gray_code
+
+        if not isinstance(samples_per_symbol, int) or samples_per_symbol < 2:
+            raise TypeError, ("sbp must be an integer >= 2, is %d" % samples_per_symbol)
+
+	ntaps = 11 * samples_per_symbol
+ 
+        arity = pow(2,self.bits_per_symbol())
+
+        # turn bytes into k-bit vectors
+        self.bytes2chunks = \
+          gr.packed_to_unpacked_bb(self.bits_per_symbol(), gr.GR_MSB_FIRST)
+
+        if self._gray_code:
+            self.symbol_mapper = gr.map_bb(psk.binary_to_gray[arity])
+        else:
+            self.symbol_mapper = gr.map_bb(psk.binary_to_ungray[arity])
+            
+        self.diffenc = gr.diff_encoder_bb(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(
+	    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(self._samples_per_symbol, self.rrc_taps)
+
+        if verbose:
+            self._print_verbage()
+        
+        if log:
+            self._setup_logging()
+            
+	# Connect & Initialize base class
+        self.connect(self, self.bytes2chunks, self.symbol_mapper, self.diffenc,
+                     self.chunks2symbols, self.rrc_filter, self)
+
+    def samples_per_symbol(self):
+        return self._samples_per_symbol
+
+    def bits_per_symbol(self=None):   # staticmethod that's also callable on an instance
+        return 2
+    bits_per_symbol = staticmethod(bits_per_symbol)      # make it a static method.  RTFM
+
+    def _print_verbage(self):
+        print "\nModulator:"
+        print "bits per symbol:     %d" % self.bits_per_symbol()
+        print "Gray code:           %s" % self._gray_code
+        print "RRS roll-off factor: %f" % self._excess_bw
+
+    def _setup_logging(self):
+        print "Modulation logging turned on."
+        self.connect(self.bytes2chunks,
+                     gr.file_sink(gr.sizeof_char, "tx_bytes2chunks.dat"))
+        self.connect(self.symbol_mapper,
+                     gr.file_sink(gr.sizeof_char, "tx_graycoder.dat"))
+        self.connect(self.diffenc,
+                     gr.file_sink(gr.sizeof_char, "tx_diffenc.dat"))        
+        self.connect(self.chunks2symbols,
+                     gr.file_sink(gr.sizeof_gr_complex, "tx_chunks2symbols.dat"))
+        self.connect(self.rrc_filter,
+                     gr.file_sink(gr.sizeof_gr_complex, "tx_rrc_filter.dat"))
+
+    def add_options(parser):
+        """
+        Adds QPSK modulation-specific options to the standard parser
+        """
+        parser.add_option("", "--excess-bw", type="float", default=_def_excess_bw,
+                          help="set RRC excess bandwith factor [default=%default] (PSK)")
+        parser.add_option("", "--no-gray-code", dest="gray_code",
+                          action="store_false", default=_def_gray_code,
+                          help="disable gray coding on modulated bits (PSK)")
+    add_options=staticmethod(add_options)
+
+
+    def extract_kwargs_from_options(options):
+        """
+        Given command line options, create dictionary suitable for passing to __init__
+        """
+        return modulation_utils.extract_kwargs_from_options(dqpsk2_mod.__init__,
+                                                            ('self',), options)
+    extract_kwargs_from_options=staticmethod(extract_kwargs_from_options)
+
+
+# /////////////////////////////////////////////////////////////////////////////
+#                           DQPSK demodulator
+#
+# Differentially coherent detection of differentially encoded qpsk
+# /////////////////////////////////////////////////////////////////////////////
+
+class dqpsk2_demod(gr.hier_block2):
+
+    def __init__(self, 
+                 samples_per_symbol=_def_samples_per_symbol,
+                 excess_bw=_def_excess_bw,
+                 costas_alpha=_def_costas_alpha,
+                 timing_alpha=_def_timing_alpha,
+                 timing_max_dev=_def_timing_max_dev,
+                 gray_code=_def_gray_code,
+                 verbose=_def_verbose,
+                 log=_def_log):
+        """
+	Hierarchical block for RRC-filtered DQPSK demodulation
+
+	The input is the complex modulated signal at baseband.
+	The output is a stream of bits packed 1 bit per byte (LSB)
+
+	@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 timing_alpha: timing loop alpha gain
+        @type timing_alpha: float
+        @param timing_max: timing loop maximum rate deviations
+        @type timing_max: float
+        @param gray_code: Tell modulator to Gray code the bits
+        @type gray_code: bool
+        @param verbose: Print information about modulator?
+        @type verbose: bool
+        @param debug: Print modualtion data to files?
+        @type debug: bool
+	"""
+
+	gr.hier_block2.__init__(self, "dqpsk2_demod",
+			        gr.io_signature(1, 1, gr.sizeof_gr_complex), # Input signature
+			        gr.io_signature(1, 1, gr.sizeof_char))       # Output signature
+
+        self._samples_per_symbol = samples_per_symbol
+        self._excess_bw = excess_bw
+        self._costas_alpha = costas_alpha
+        self._timing_alpha = timing_alpha
+        self._timing_beta = _def_timing_alpha
+        self._timing_max_dev=timing_max_dev
+        self._gray_code = gray_code
+
+        if samples_per_symbol < 2:
+            raise TypeError, "sbp must be >= 2, is %d" % samples_per_symbol
+
+        arity = pow(2,self.bits_per_symbol())
+ 
+        # Automatic gain control
+        self.agc = gr.agc2_cc(0.6e-1, 1e-3, 1, 1, 100)
+        #self.agc = gr.feedforward_agc_cc(16, 2.0)
+
+        self._costas_beta  = 0.25 * self._costas_alpha * self._costas_alpha
+        # Allow a frequency swing of +/- half of the sample rate
+        fmin = -0.5
+        fmax = 0.5
+
+        self.clock_recov = gr.costas_loop_cc(self._costas_alpha,
+                                             self._costas_beta,
+                                             fmax, fmin, arity)
+
+        # symbol clock recovery
+        if not self._timing_alpha:
+            self._timing_alpha = 2
+            self._timing_beta = 0.020
+            
+        # RRC data filter
+        nfilts = 32
+        ntaps = 11 * samples_per_symbol*nfilts
+        taps = gr.firdes.root_raised_cosine(nfilts, nfilts, 1.0/float(self._samples_per_symbol), self._excess_bw, ntaps)
+        self.time_recov = gr.pfb_clock_sync_ccf(self._samples_per_symbol,
+                                                self._timing_alpha,
+                                                taps, nfilts, nfilts/2, self._timing_max_dev)
+        self.time_recov.set_beta(self._timing_beta)
+        
+        # Perform Differential decoding on the constellation
+        self.diffdec = gr.diff_phasor_cc()
+        
+        # find closest constellation point
+        rot = 1
+        rotated_const = map(lambda pt: pt * rot, psk.constellation[arity])
+        self.slicer = gr.constellation_decoder_cb(rotated_const, range(arity))
+
+        if self._gray_code:
+            self.symbol_mapper = gr.map_bb(psk.gray_to_binary[arity])
+        else:
+            self.symbol_mapper = gr.map_bb(psk.ungray_to_binary[arity])
+        
+        # unpack the k bit vector into a stream of bits
+        self.unpack = gr.unpack_k_bits_bb(self.bits_per_symbol())
+
+        if verbose:
+            self._print_verbage()
+        
+        if log:
+            self._setup_logging()
+ 
+        # Connect
+        self.connect(self, self.agc, 
+                     self.clock_recov,
+                     self.time_recov,
+                     self.diffdec, self.slicer, self.symbol_mapper, self.unpack, self)
+
+    def samples_per_symbol(self):
+        return self._samples_per_symbol
+
+    def bits_per_symbol(self=None):   # staticmethod that's also callable on an instance
+        return 2
+    bits_per_symbol = staticmethod(bits_per_symbol)      # make it a static method.  RTFM
+
+    def _print_verbage(self):
+        print "\nDemodulator:"
+        print "bits per symbol:     %d"   % self.bits_per_symbol()
+        print "Gray code:           %s"   % self._gray_code
+        print "RRC roll-off factor: %.2f" % self._excess_bw
+        print "Costas Loop alpha:   %.2e" % self._costas_alpha
+        print "Costas Loop beta:    %.2e" % self._costas_beta
+        print "Timing alpha gain:   %.2f" % self._timing_alpha
+        print "Timing beta gain:    %.2f" % self._timing_beta
+        print "Timing max dev:      %.2f" % self._timing_max_dev
+
+    def _setup_logging(self):
+        print "Modulation logging turned on."
+        self.connect(self.pre_scaler,
+                     gr.file_sink(gr.sizeof_gr_complex, "rx_prescaler.dat"))
+        self.connect(self.agc,
+                     gr.file_sink(gr.sizeof_gr_complex, "rx_agc.dat"))
+        self.connect(self.rrc_filter,
+                     gr.file_sink(gr.sizeof_gr_complex, "rx_rrc_filter.dat"))
+        self.connect(self.clock_recov,
+                     gr.file_sink(gr.sizeof_gr_complex, "rx_clock_recov.dat"))
+        self.connect(self.time_recov,
+                     gr.file_sink(gr.sizeof_gr_complex, "rx_time_recov.dat"))
+        self.connect(self.diffdec,
+                     gr.file_sink(gr.sizeof_gr_complex, "rx_diffdec.dat"))        
+        self.connect(self.slicer,
+                     gr.file_sink(gr.sizeof_char, "rx_slicer.dat"))
+        self.connect(self.symbol_mapper,
+                     gr.file_sink(gr.sizeof_char, "rx_gray_decoder.dat"))
+        self.connect(self.unpack,
+                     gr.file_sink(gr.sizeof_char, "rx_unpack.dat"))
+
+    def add_options(parser):
+        """
+        Adds modulation-specific options to the standard parser
+        """
+        parser.add_option("", "--excess-bw", type="float", default=_def_excess_bw,
+                          help="set RRC excess bandwith factor [default=%default] (PSK)")
+        parser.add_option("", "--no-gray-code", dest="gray_code",
+                          action="store_false", default=_def_gray_code,
+                          help="disable gray coding on modulated bits (PSK)")
+        parser.add_option("", "--costas-alpha", type="float", default=_def_costas_alpha,
+                          help="set Costas loop alpha value [default=%default] (PSK)")
+        parser.add_option("", "--gain-alpha", type="float", default=_def_timing_alpha,
+                          help="set timing symbol sync loop gain alpha value [default=%default] (GMSK/PSK)")
+        parser.add_option("", "--gain-beta", type="float", default=_def_timing_beta,
+                          help="set timing symbol sync loop gain beta value [default=%default] (GMSK/PSK)")
+        parser.add_option("", "--timing-max-dev", type="float", default=_def_timing_max_dev,
+                          help="set timing symbol sync loop maximum deviation [default=%default] (GMSK/PSK)")
+    add_options=staticmethod(add_options)
+
+    def extract_kwargs_from_options(options):
+        """
+        Given command line options, create dictionary suitable for passing to __init__
+        """
+        return modulation_utils.extract_kwargs_from_options(
+            dqpsk2_demod.__init__, ('self',), options)
+    extract_kwargs_from_options=staticmethod(extract_kwargs_from_options)
+
+
+#
+# Add these to the mod/demod registry
+#
+modulation_utils.add_type_1_mod('dqpsk2', dqpsk2_mod)
+modulation_utils.add_type_1_demod('dqpsk2', dqpsk2_demod)
-- 
cgit v1.2.3


From f3329805f5a801e799e671eefb370c6e6f6d36a8 Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Mon, 12 Oct 2009 16:04:47 -0400
Subject: Adding dqpsk2 block to makefile for installation.

---
 gnuradio-core/src/python/gnuradio/blks2impl/Makefile.am | 1 +
 1 file changed, 1 insertion(+)

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/Makefile.am b/gnuradio-core/src/python/gnuradio/blks2impl/Makefile.am
index 17ce1fff94..68d6836236 100644
--- a/gnuradio-core/src/python/gnuradio/blks2impl/Makefile.am
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/Makefile.am
@@ -33,6 +33,7 @@ grblkspython_PYTHON =		\
 	dbpsk.py		\
 	dbpsk2.py		\
 	dqpsk.py		\
+	dqpsk2.py		\
 	d8psk.py		\
 	filterbank.py		\
 	fm_demod.py		\
-- 
cgit v1.2.3


From 2b60291c2883dbd3b85c6f694d830fa3ccf0a6e6 Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Mon, 12 Oct 2009 16:36:09 -0400
Subject: Fixing compiler warnings.

---
 gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc | 14 ++++++--------
 1 file changed, 6 insertions(+), 8 deletions(-)

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
index 8271fe6b9e..43412f25b3 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
@@ -75,7 +75,7 @@ gr_pfb_clock_sync_ccf::gr_pfb_clock_sync_ccf (double sps, float gain,
 
   // Create an FIR filter for each channel and zero out the taps
   std::vector<float> vtaps(0, d_nfilters);
-  for(unsigned int i = 0; i < d_nfilters; i++) {
+  for(int i = 0; i < d_nfilters; i++) {
     d_filters[i] = gr_fir_util::create_gr_fir_ccf(vtaps);
     d_diff_filters[i] = gr_fir_util::create_gr_fir_ccf(vtaps);
   }
@@ -89,7 +89,7 @@ gr_pfb_clock_sync_ccf::gr_pfb_clock_sync_ccf (double sps, float gain,
 
 gr_pfb_clock_sync_ccf::~gr_pfb_clock_sync_ccf ()
 {
-  for(unsigned int i = 0; i < d_nfilters; i++) {
+  for(int i = 0; i < d_nfilters; i++) {
     delete d_filters[i];
   }
 }
@@ -149,7 +149,7 @@ gr_pfb_clock_sync_ccf::create_diff_taps(const std::vector<float> &newtaps,
 void
 gr_pfb_clock_sync_ccf::print_taps()
 {
-  unsigned int i, j;
+  int i, j;
   printf("[ ");
   for(i = 0; i < d_nfilters; i++) {
     printf("[%.4e, ", d_taps[i][0]);
@@ -164,7 +164,7 @@ gr_pfb_clock_sync_ccf::print_taps()
 void
 gr_pfb_clock_sync_ccf::print_diff_taps()
 {
-  unsigned int i, j;
+  int i, j;
   printf("[ ");
   for(i = 0; i < d_nfilters; i++) {
     printf("[%.4e, ", d_dtaps[i][0]);
@@ -181,8 +181,7 @@ std::vector<float>
 gr_pfb_clock_sync_ccf::channel_taps(int channel)
 {
   std::vector<float> taps;
-  unsigned int i;
-  for(i = 0; i < d_taps_per_filter; i++) {
+  for(int i = 0; i < d_taps_per_filter; i++) {
     taps.push_back(d_taps[channel][i]);
   }
   return taps;
@@ -192,8 +191,7 @@ std::vector<float>
 gr_pfb_clock_sync_ccf::diff_channel_taps(int channel)
 {
   std::vector<float> taps;
-  unsigned int i;
-  for(i = 0; i < d_taps_per_filter; i++) {
+  for(int i = 0; i < d_taps_per_filter; i++) {
     taps.push_back(d_dtaps[channel][i]);
   }
   return taps;
-- 
cgit v1.2.3


From c1ab962946bb05b8a20a0f19dd294eb3b3056142 Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Mon, 12 Oct 2009 17:55:17 -0400
Subject: This splits the rate into a fractional an integer value, which allows
 the loop to adjust the fractional rate while the integer rate keeps the
 increments moving properly. Allows the max rate deviation to be independent
 of the integer rate. Scaling of the differential taps also allows alpha and
 beta to operate independent of the rate when fractional samples per symbol
 are used. Slightly more tolerant to large signal values, but they still
 should be close to +/-1.

---
 .../src/lib/filter/gr_pfb_clock_sync_ccf.cc        |  20 +-
 .../src/lib/filter/gr_pfb_clock_sync_ccf.h         |   2 +
 gnuradio-examples/grc/demod/pam_timing.grc         | 760 +++++++++++----------
 3 files changed, 428 insertions(+), 354 deletions(-)

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
index 43412f25b3..433b7d6133 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
@@ -68,6 +68,8 @@ gr_pfb_clock_sync_ccf::gr_pfb_clock_sync_ccf (double sps, float gain,
   set_beta(0.25*gain*gain);
   d_k = init_phase;
   d_rate = (sps-floor(sps))*(double)d_nfilters;
+  d_rate_i = (int)floor(d_rate);
+  d_rate_f = d_rate - (float)d_rate_i;
   d_filtnum = (int)floor(d_k);
 
   d_filters = std::vector<gr_fir_ccf*>(d_nfilters);
@@ -137,13 +139,23 @@ void
 gr_pfb_clock_sync_ccf::create_diff_taps(const std::vector<float> &newtaps,
 					std::vector<float> &difftaps)
 {
+  float maxtap = 1e-20;
   difftaps.clear();
   difftaps.push_back(0); //newtaps[0]);
   for(unsigned int i = 1; i < newtaps.size()-1; i++) {
     float tap = newtaps[i+1] - newtaps[i-1];
     difftaps.push_back(tap);
+    if(tap > maxtap) {
+      maxtap = tap;
+    }
   }
   difftaps.push_back(0);//-newtaps[newtaps.size()-1]);
+
+  // Scale the differential taps; helps scale error term to better update state
+  // FIXME: should this be scaled this way or use the same gain as the taps?
+  for(unsigned int i = 0; i < difftaps.size(); i++) {
+    difftaps[i] /= maxtap;
+  }
 }
 
 void
@@ -250,18 +262,18 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items,
     error = (error_i + error_r) / 2.0;       // average error from I&Q channel
 
     // Run the control loop to update the current phase (k) and tracking rate
-    d_k = d_k + d_alpha*error + d_rate;
-    d_rate = d_rate + d_beta*error;
+    d_k = d_k + d_alpha*error + d_rate_i + d_rate_f;
+    d_rate_f = d_rate_f + d_beta*error;
     
     // Keep our rate within a good range
-    d_rate = gr_branchless_clip(d_rate, d_max_dev);
+    d_rate_f = gr_branchless_clip(d_rate_f, d_max_dev);
 
     i++;
     count += (int)floor(d_sps);
 
     if(output_items.size() > 2) {
       err[i] = error;
-      outrate[i] = d_rate;
+      outrate[i] = d_rate_f;
       outk[i] = d_k;
     }
   }
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
index 778db59e5b..a07192a7f3 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
@@ -69,6 +69,8 @@ class gr_pfb_clock_sync_ccf : public gr_block
   std::vector< std::vector<float> > d_dtaps;
   float                    d_k;
   float                    d_rate;
+  float                    d_rate_i;
+  float                    d_rate_f;
   float                    d_max_dev;
   int                      d_filtnum;
   int                      d_taps_per_filter;
diff --git a/gnuradio-examples/grc/demod/pam_timing.grc b/gnuradio-examples/grc/demod/pam_timing.grc
index 907233aca8..4e2a2f8614 100644
--- a/gnuradio-examples/grc/demod/pam_timing.grc
+++ b/gnuradio-examples/grc/demod/pam_timing.grc
@@ -1,6 +1,6 @@
 <?xml version='1.0' encoding='ASCII'?>
 <flow_graph>
-  <timestamp>Fri Oct  9 14:51:58 2009</timestamp>
+  <timestamp>Mon Oct 12 17:54:59 2009</timestamp>
   <block>
     <key>options</key>
     <param>
@@ -94,61 +94,6 @@
       <value>0</value>
     </param>
   </block>
-  <block>
-    <key>variable_slider</key>
-    <param>
-      <key>id</key>
-      <value>noise_amp</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>label</key>
-      <value>Channel Noise</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>min</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>max</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>num_steps</key>
-      <value>1000</value>
-    </param>
-    <param>
-      <key>style</key>
-      <value>wx.SL_HORIZONTAL</value>
-    </param>
-    <param>
-      <key>converver</key>
-      <value>float_converter</value>
-    </param>
-    <param>
-      <key>grid_pos</key>
-      <value></value>
-    </param>
-    <param>
-      <key>notebook</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(168, 684)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
   <block>
     <key>variable</key>
     <param>
@@ -251,22 +196,18 @@
     </param>
   </block>
   <block>
-    <key>variable_slider</key>
+    <key>random_source_x</key>
     <param>
       <key>id</key>
-      <value>alpha</value>
+      <value>random_source_x_0</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>label</key>
-      <value>Timing Alpha</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>0</value>
+      <key>type</key>
+      <value>byte</value>
     </param>
     <param>
       <key>min</key>
@@ -274,31 +215,19 @@
     </param>
     <param>
       <key>max</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>num_steps</key>
-      <value>1000</value>
-    </param>
-    <param>
-      <key>style</key>
-      <value>wx.SL_HORIZONTAL</value>
-    </param>
-    <param>
-      <key>converver</key>
-      <value>float_converter</value>
+      <value>pam_amp</value>
     </param>
     <param>
-      <key>grid_pos</key>
-      <value></value>
+      <key>num_samps</key>
+      <value>10000</value>
     </param>
     <param>
-      <key>notebook</key>
-      <value></value>
+      <key>repeat</key>
+      <value>True</value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(552, 4)</value>
+      <value>(13, 80)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -306,77 +235,92 @@
     </param>
   </block>
   <block>
-    <key>variable_slider</key>
+    <key>random_source_x</key>
     <param>
       <key>id</key>
-      <value>beta</value>
+      <value>random_source_x_0_0</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>label</key>
-      <value>Timing Beta</value>
+      <key>type</key>
+      <value>byte</value>
     </param>
     <param>
-      <key>value</key>
+      <key>min</key>
       <value>0</value>
     </param>
     <param>
-      <key>min</key>
-      <value>0.0</value>
+      <key>max</key>
+      <value>pam_amp</value>
     </param>
     <param>
-      <key>max</key>
-      <value>0.1</value>
+      <key>num_samps</key>
+      <value>10000</value>
     </param>
     <param>
-      <key>num_steps</key>
-      <value>1000</value>
+      <key>repeat</key>
+      <value>True</value>
     </param>
     <param>
-      <key>style</key>
-      <value>wx.SL_HORIZONTAL</value>
+      <key>_coordinate</key>
+      <value>(15, 245)</value>
     </param>
     <param>
-      <key>converver</key>
-      <value>float_converter</value>
+      <key>_rotation</key>
+      <value>0</value>
     </param>
+  </block>
+  <block>
+    <key>const_source_x</key>
     <param>
-      <key>grid_pos</key>
-      <value></value>
+      <key>id</key>
+      <value>const_source_x_0</value>
     </param>
     <param>
-      <key>notebook</key>
-      <value></value>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>type</key>
+      <value>float</value>
+    </param>
+    <param>
+      <key>const</key>
+      <value>-0.5*(pam_amp-1)</value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(668, 5)</value>
+      <value>(213, 197)</value>
     </param>
     <param>
       <key>_rotation</key>
-      <value>180</value>
+      <value>0</value>
     </param>
   </block>
   <block>
-    <key>variable</key>
+    <key>const_source_x</key>
     <param>
       <key>id</key>
-      <value>spb_gen</value>
+      <value>const_source_x_0_0</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>value</key>
-      <value>4</value>
+      <key>type</key>
+      <value>float</value>
+    </param>
+    <param>
+      <key>const</key>
+      <value>-0.5*(pam_amp-1)</value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(119, 841)</value>
+      <value>(200, 360)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -384,42 +328,46 @@
     </param>
   </block>
   <block>
-    <key>variable_slider</key>
+    <key>wxgui_scopesink2</key>
     <param>
       <key>id</key>
-      <value>interpratio</value>
+      <value>wxgui_scopesink2_0_0_0_0</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>label</key>
-      <value>Timing Offset</value>
+      <key>type</key>
+      <value>float</value>
     </param>
     <param>
-      <key>value</key>
-      <value>1.00</value>
+      <key>title</key>
+      <value>Scope Plot</value>
     </param>
     <param>
-      <key>min</key>
-      <value>0.9</value>
+      <key>samp_rate</key>
+      <value>samp_rate</value>
     </param>
     <param>
-      <key>max</key>
-      <value>1.1</value>
+      <key>v_scale</key>
+      <value>1.25</value>
     </param>
     <param>
-      <key>num_steps</key>
-      <value>1000</value>
+      <key>t_scale</key>
+      <value>0</value>
     </param>
     <param>
-      <key>style</key>
-      <value>wx.SL_HORIZONTAL</value>
+      <key>ac_couple</key>
+      <value>False</value>
     </param>
     <param>
-      <key>converver</key>
-      <value>float_converter</value>
+      <key>xy_mode</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>num_inputs</key>
+      <value>1</value>
     </param>
     <param>
       <key>grid_pos</key>
@@ -427,22 +375,22 @@
     </param>
     <param>
       <key>notebook</key>
-      <value></value>
+      <value>notebook_0,2</value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(40, 684)</value>
+      <value>(1111, 767)</value>
     </param>
     <param>
       <key>_rotation</key>
-      <value>180</value>
+      <value>0</value>
     </param>
   </block>
   <block>
-    <key>random_source_x</key>
+    <key>wxgui_scopesink2</key>
     <param>
       <key>id</key>
-      <value>random_source_x_0</value>
+      <value>wxgui_scopesink2_0_0_0</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -450,27 +398,47 @@
     </param>
     <param>
       <key>type</key>
-      <value>byte</value>
+      <value>float</value>
     </param>
     <param>
-      <key>min</key>
+      <key>title</key>
+      <value>Scope Plot</value>
+    </param>
+    <param>
+      <key>samp_rate</key>
+      <value>samp_rate</value>
+    </param>
+    <param>
+      <key>v_scale</key>
+      <value>9</value>
+    </param>
+    <param>
+      <key>t_scale</key>
       <value>0</value>
     </param>
     <param>
-      <key>max</key>
-      <value>pam_amp</value>
+      <key>ac_couple</key>
+      <value>False</value>
     </param>
     <param>
-      <key>num_samps</key>
-      <value>10000</value>
+      <key>xy_mode</key>
+      <value>False</value>
     </param>
     <param>
-      <key>repeat</key>
-      <value>True</value>
+      <key>num_inputs</key>
+      <value>1</value>
+    </param>
+    <param>
+      <key>grid_pos</key>
+      <value></value>
+    </param>
+    <param>
+      <key>notebook</key>
+      <value>notebook_0,1</value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(13, 80)</value>
+      <value>(1112, 881)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -478,38 +446,38 @@
     </param>
   </block>
   <block>
-    <key>random_source_x</key>
+    <key>gr_channel_model</key>
     <param>
       <key>id</key>
-      <value>random_source_x_0_0</value>
+      <value>gr_channel_model_0</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>type</key>
-      <value>byte</value>
+      <key>noise_voltage</key>
+      <value>noise_amp</value>
     </param>
     <param>
-      <key>min</key>
-      <value>0</value>
+      <key>freq_offset</key>
+      <value>freq_offset</value>
     </param>
     <param>
-      <key>max</key>
-      <value>pam_amp</value>
+      <key>epsilon</key>
+      <value>interpratio</value>
     </param>
     <param>
-      <key>num_samps</key>
-      <value>10000</value>
+      <key>taps</key>
+      <value>1.0</value>
     </param>
     <param>
-      <key>repeat</key>
-      <value>True</value>
+      <key>seed</key>
+      <value>42</value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(15, 245)</value>
+      <value>(59, 543)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -517,10 +485,10 @@
     </param>
   </block>
   <block>
-    <key>const_source_x</key>
+    <key>gr_throttle</key>
     <param>
       <key>id</key>
-      <value>const_source_x_0</value>
+      <value>gr_throttle_0</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -528,15 +496,19 @@
     </param>
     <param>
       <key>type</key>
-      <value>float</value>
+      <value>complex</value>
     </param>
     <param>
-      <key>const</key>
-      <value>-0.5*(pam_amp-1)</value>
+      <key>samples_per_second</key>
+      <value>samp_rate</value>
+    </param>
+    <param>
+      <key>vlen</key>
+      <value>1</value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(213, 197)</value>
+      <value>(290, 575)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -544,26 +516,34 @@
     </param>
   </block>
   <block>
-    <key>const_source_x</key>
+    <key>notebook</key>
     <param>
       <key>id</key>
-      <value>const_source_x_0_0</value>
+      <value>notebook_0</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>type</key>
-      <value>float</value>
+      <key>style</key>
+      <value>wx.NB_TOP</value>
     </param>
     <param>
-      <key>const</key>
-      <value>-0.5*(pam_amp-1)</value>
+      <key>labels</key>
+      <value>['error', 'phase', 'freq', 'Resampled Signal']</value>
+    </param>
+    <param>
+      <key>grid_pos</key>
+      <value></value>
+    </param>
+    <param>
+      <key>notebook</key>
+      <value></value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(200, 360)</value>
+      <value>(729, 769)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -574,7 +554,7 @@
     <key>wxgui_scopesink2</key>
     <param>
       <key>id</key>
-      <value>wxgui_scopesink2_0_0</value>
+      <value>wxgui_scopesink2_0_0_1</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -582,7 +562,7 @@
     </param>
     <param>
       <key>type</key>
-      <value>float</value>
+      <value>complex</value>
     </param>
     <param>
       <key>title</key>
@@ -618,11 +598,11 @@
     </param>
     <param>
       <key>notebook</key>
-      <value>notebook_0,0</value>
+      <value>notebook_0,3</value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(1110, 651)</value>
+      <value>(1115, 358)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -630,10 +610,10 @@
     </param>
   </block>
   <block>
-    <key>wxgui_scopesink2</key>
+    <key>gr_add_xx</key>
     <param>
       <key>id</key>
-      <value>wxgui_scopesink2_0_0_0_0</value>
+      <value>gr_add_xx_0</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -644,44 +624,70 @@
       <value>float</value>
     </param>
     <param>
-      <key>title</key>
-      <value>Scope Plot</value>
+      <key>num_inputs</key>
+      <value>2</value>
     </param>
     <param>
-      <key>samp_rate</key>
-      <value>samp_rate</value>
+      <key>vlen</key>
+      <value>1</value>
     </param>
     <param>
-      <key>v_scale</key>
-      <value>1.25</value>
+      <key>_coordinate</key>
+      <value>(440, 167)</value>
     </param>
     <param>
-      <key>t_scale</key>
+      <key>_rotation</key>
       <value>0</value>
     </param>
+  </block>
+  <block>
+    <key>gr_add_xx</key>
+    <param>
+      <key>id</key>
+      <value>gr_add_xx_0_1</value>
+    </param>
     <param>
-      <key>ac_couple</key>
-      <value>False</value>
+      <key>_enabled</key>
+      <value>True</value>
     </param>
     <param>
-      <key>xy_mode</key>
-      <value>False</value>
+      <key>type</key>
+      <value>float</value>
     </param>
     <param>
       <key>num_inputs</key>
+      <value>2</value>
+    </param>
+    <param>
+      <key>vlen</key>
       <value>1</value>
     </param>
     <param>
-      <key>grid_pos</key>
-      <value></value>
+      <key>_coordinate</key>
+      <value>(430, 330)</value>
     </param>
     <param>
-      <key>notebook</key>
-      <value>notebook_0,2</value>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+  </block>
+  <block>
+    <key>gr_float_to_complex</key>
+    <param>
+      <key>id</key>
+      <value>gr_float_to_complex_0</value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>vlen</key>
+      <value>1</value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(1111, 767)</value>
+      <value>(590, 184)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -692,7 +698,7 @@
     <key>wxgui_scopesink2</key>
     <param>
       <key>id</key>
-      <value>wxgui_scopesink2_0_0_0</value>
+      <value>wxgui_scopesink2_0</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -700,7 +706,7 @@
     </param>
     <param>
       <key>type</key>
-      <value>float</value>
+      <value>complex</value>
     </param>
     <param>
       <key>title</key>
@@ -712,7 +718,7 @@
     </param>
     <param>
       <key>v_scale</key>
-      <value>9</value>
+      <value>0</value>
     </param>
     <param>
       <key>t_scale</key>
@@ -736,11 +742,11 @@
     </param>
     <param>
       <key>notebook</key>
-      <value>notebook_0,1</value>
+      <value></value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(1112, 881)</value>
+      <value>(1116, 500)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -748,38 +754,22 @@
     </param>
   </block>
   <block>
-    <key>gr_channel_model</key>
+    <key>variable</key>
     <param>
       <key>id</key>
-      <value>gr_channel_model_0</value>
+      <value>nfilts</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>noise_voltage</key>
-      <value>noise_amp</value>
-    </param>
-    <param>
-      <key>freq_offset</key>
-      <value>freq_offset</value>
-    </param>
-    <param>
-      <key>epsilon</key>
-      <value>interpratio</value>
-    </param>
-    <param>
-      <key>taps</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>seed</key>
-      <value>42</value>
+      <key>value</key>
+      <value>32</value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(59, 543)</value>
+      <value>(435, 686)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -787,30 +777,46 @@
     </param>
   </block>
   <block>
-    <key>gr_throttle</key>
+    <key>gr_pfb_clock_sync_ccf</key>
     <param>
       <key>id</key>
-      <value>gr_throttle_0</value>
+      <value>gr_pfb_clock_sync_ccf_0</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>type</key>
-      <value>complex</value>
+      <key>sps</key>
+      <value>spb</value>
     </param>
     <param>
-      <key>samples_per_second</key>
-      <value>samp_rate</value>
+      <key>alpha</key>
+      <value>alpha</value>
     </param>
     <param>
-      <key>vlen</key>
-      <value>1</value>
+      <key>beta</key>
+      <value>beta</value>
+    </param>
+    <param>
+      <key>taps</key>
+      <value>rrctaps</value>
+    </param>
+    <param>
+      <key>filter_size</key>
+      <value>nfilts</value>
+    </param>
+    <param>
+      <key>init_phase</key>
+      <value>16</value>
+    </param>
+    <param>
+      <key>max_dev</key>
+      <value>1.5</value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(290, 575)</value>
+      <value>(512, 527)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -818,22 +824,42 @@
     </param>
   </block>
   <block>
-    <key>notebook</key>
+    <key>variable_slider</key>
     <param>
       <key>id</key>
-      <value>notebook_0</value>
+      <value>noise_amp</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
+    <param>
+      <key>label</key>
+      <value>Channel Noise</value>
+    </param>
+    <param>
+      <key>value</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>min</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>max</key>
+      <value>1.0</value>
+    </param>
+    <param>
+      <key>num_steps</key>
+      <value>1000</value>
+    </param>
     <param>
       <key>style</key>
-      <value>wx.NB_TOP</value>
+      <value>wx.SL_HORIZONTAL</value>
     </param>
     <param>
-      <key>labels</key>
-      <value>['error', 'phase', 'freq', 'Resampled Signal']</value>
+      <key>converver</key>
+      <value>float_converter</value>
     </param>
     <param>
       <key>grid_pos</key>
@@ -845,7 +871,7 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(729, 769)</value>
+      <value>(168, 684)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -853,46 +879,42 @@
     </param>
   </block>
   <block>
-    <key>wxgui_scopesink2</key>
+    <key>variable_slider</key>
     <param>
       <key>id</key>
-      <value>wxgui_scopesink2_0_0_1</value>
+      <value>interpratio</value>
     </param>
     <param>
       <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>type</key>
-      <value>complex</value>
+      <value>True</value>
     </param>
     <param>
-      <key>title</key>
-      <value>Error</value>
+      <key>label</key>
+      <value>Timing Offset</value>
     </param>
     <param>
-      <key>samp_rate</key>
-      <value>samp_rate</value>
+      <key>value</key>
+      <value>1.00</value>
     </param>
     <param>
-      <key>v_scale</key>
-      <value>.5</value>
+      <key>min</key>
+      <value>0.99</value>
     </param>
     <param>
-      <key>t_scale</key>
-      <value>0</value>
+      <key>max</key>
+      <value>1.01</value>
     </param>
     <param>
-      <key>ac_couple</key>
-      <value>False</value>
+      <key>num_steps</key>
+      <value>1000</value>
     </param>
     <param>
-      <key>xy_mode</key>
-      <value>False</value>
+      <key>style</key>
+      <value>wx.SL_HORIZONTAL</value>
     </param>
     <param>
-      <key>num_inputs</key>
-      <value>1</value>
+      <key>converver</key>
+      <value>float_converter</value>
     </param>
     <param>
       <key>grid_pos</key>
@@ -900,22 +922,22 @@
     </param>
     <param>
       <key>notebook</key>
-      <value>notebook_0,3</value>
+      <value></value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(1115, 358)</value>
+      <value>(40, 684)</value>
     </param>
     <param>
       <key>_rotation</key>
-      <value>0</value>
+      <value>180</value>
     </param>
   </block>
   <block>
     <key>variable</key>
     <param>
       <key>id</key>
-      <value>spb</value>
+      <value>spb_gen</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -923,11 +945,11 @@
     </param>
     <param>
       <key>value</key>
-      <value>4.1</value>
+      <value>4</value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(32, 842)</value>
+      <value>(119, 841)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -935,61 +957,109 @@
     </param>
   </block>
   <block>
-    <key>gr_add_xx</key>
+    <key>variable_slider</key>
     <param>
       <key>id</key>
-      <value>gr_add_xx_0</value>
+      <value>beta</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>type</key>
-      <value>float</value>
+      <key>label</key>
+      <value>Timing Beta</value>
     </param>
     <param>
-      <key>num_inputs</key>
-      <value>2</value>
+      <key>value</key>
+      <value>0</value>
     </param>
     <param>
-      <key>vlen</key>
-      <value>1</value>
+      <key>min</key>
+      <value>0.0</value>
+    </param>
+    <param>
+      <key>max</key>
+      <value>0.1</value>
+    </param>
+    <param>
+      <key>num_steps</key>
+      <value>1000</value>
+    </param>
+    <param>
+      <key>style</key>
+      <value>wx.SL_HORIZONTAL</value>
+    </param>
+    <param>
+      <key>converver</key>
+      <value>float_converter</value>
+    </param>
+    <param>
+      <key>grid_pos</key>
+      <value></value>
+    </param>
+    <param>
+      <key>notebook</key>
+      <value></value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(440, 167)</value>
+      <value>(668, 5)</value>
     </param>
     <param>
       <key>_rotation</key>
-      <value>0</value>
+      <value>180</value>
     </param>
   </block>
   <block>
-    <key>gr_add_xx</key>
+    <key>variable_slider</key>
     <param>
       <key>id</key>
-      <value>gr_add_xx_0_1</value>
+      <value>alpha</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>type</key>
-      <value>float</value>
+      <key>label</key>
+      <value>Timing Alpha</value>
     </param>
     <param>
-      <key>num_inputs</key>
-      <value>2</value>
+      <key>value</key>
+      <value>0</value>
     </param>
     <param>
-      <key>vlen</key>
+      <key>min</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>max</key>
       <value>1</value>
     </param>
+    <param>
+      <key>num_steps</key>
+      <value>1000</value>
+    </param>
+    <param>
+      <key>style</key>
+      <value>wx.SL_HORIZONTAL</value>
+    </param>
+    <param>
+      <key>converver</key>
+      <value>float_converter</value>
+    </param>
+    <param>
+      <key>grid_pos</key>
+      <value></value>
+    </param>
+    <param>
+      <key>notebook</key>
+      <value></value>
+    </param>
     <param>
       <key>_coordinate</key>
-      <value>(430, 330)</value>
+      <value>(552, 4)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -997,53 +1067,58 @@
     </param>
   </block>
   <block>
-    <key>blks2_pfb_arb_resampler_ccf</key>
+    <key>wxgui_scopesink2</key>
     <param>
       <key>id</key>
-      <value>blks2_pfb_arb_resampler_ccf_0</value>
+      <value>wxgui_scopesink2_0_0</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>rate</key>
-      <value>float(spb)/float(spb_gen)</value>
+      <key>type</key>
+      <value>float</value>
     </param>
     <param>
-      <key>taps</key>
-      <value>firdes.low_pass(128, 128, 0.45, 0.1)</value>
+      <key>title</key>
+      <value>Error</value>
     </param>
     <param>
-      <key>size</key>
-      <value>128</value>
+      <key>samp_rate</key>
+      <value>samp_rate</value>
     </param>
     <param>
-      <key>_coordinate</key>
-      <value>(617, 374)</value>
+      <key>v_scale</key>
+      <value>3</value>
     </param>
     <param>
-      <key>_rotation</key>
+      <key>t_scale</key>
       <value>0</value>
     </param>
-  </block>
-  <block>
-    <key>gr_float_to_complex</key>
     <param>
-      <key>id</key>
-      <value>gr_float_to_complex_0</value>
+      <key>ac_couple</key>
+      <value>False</value>
     </param>
     <param>
-      <key>_enabled</key>
-      <value>True</value>
+      <key>xy_mode</key>
+      <value>False</value>
     </param>
     <param>
-      <key>vlen</key>
+      <key>num_inputs</key>
       <value>1</value>
     </param>
+    <param>
+      <key>grid_pos</key>
+      <value></value>
+    </param>
+    <param>
+      <key>notebook</key>
+      <value>notebook_0,0</value>
+    </param>
     <param>
       <key>_coordinate</key>
-      <value>(590, 184)</value>
+      <value>(1110, 651)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -1094,7 +1169,7 @@
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(832, 157)</value>
+      <value>(834, 157)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -1102,58 +1177,61 @@
     </param>
   </block>
   <block>
-    <key>wxgui_scopesink2</key>
+    <key>blks2_pfb_arb_resampler_ccf</key>
     <param>
       <key>id</key>
-      <value>wxgui_scopesink2_0</value>
+      <value>blks2_pfb_arb_resampler_ccf_0</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>type</key>
-      <value>complex</value>
+      <key>rate</key>
+      <value>float(spb)/float(spb_gen)</value>
     </param>
     <param>
-      <key>title</key>
-      <value>Scope Plot</value>
+      <key>taps</key>
+      <value>firdes.low_pass(128, 128, 0.45, 0.1)</value>
     </param>
     <param>
-      <key>samp_rate</key>
-      <value>samp_rate</value>
+      <key>size</key>
+      <value>128</value>
     </param>
     <param>
-      <key>v_scale</key>
-      <value>0</value>
+      <key>_coordinate</key>
+      <value>(617, 374)</value>
     </param>
     <param>
-      <key>t_scale</key>
+      <key>_rotation</key>
       <value>0</value>
     </param>
+  </block>
+  <block>
+    <key>gr_multiply_const_vxx</key>
     <param>
-      <key>ac_couple</key>
-      <value>False</value>
+      <key>id</key>
+      <value>gr_multiply_const_vxx_0</value>
     </param>
     <param>
-      <key>xy_mode</key>
-      <value>False</value>
+      <key>_enabled</key>
+      <value>True</value>
     </param>
     <param>
-      <key>num_inputs</key>
-      <value>1</value>
+      <key>type</key>
+      <value>complex</value>
     </param>
     <param>
-      <key>grid_pos</key>
-      <value></value>
+      <key>const</key>
+      <value>sig_amp</value>
     </param>
     <param>
-      <key>notebook</key>
-      <value></value>
+      <key>vlen</key>
+      <value>1</value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(1116, 500)</value>
+      <value>(1096, 197)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -1164,7 +1242,7 @@
     <key>variable</key>
     <param>
       <key>id</key>
-      <value>nfilts</value>
+      <value>pam_amp</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -1172,11 +1250,11 @@
     </param>
     <param>
       <key>value</key>
-      <value>64</value>
+      <value>2</value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(435, 686)</value>
+      <value>(223, 9)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -1184,46 +1262,22 @@
     </param>
   </block>
   <block>
-    <key>gr_pfb_clock_sync_ccf</key>
+    <key>variable</key>
     <param>
       <key>id</key>
-      <value>gr_pfb_clock_sync_ccf_0</value>
+      <value>spb</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>sps</key>
-      <value>spb</value>
-    </param>
-    <param>
-      <key>alpha</key>
-      <value>alpha</value>
-    </param>
-    <param>
-      <key>beta</key>
-      <value>beta</value>
-    </param>
-    <param>
-      <key>taps</key>
-      <value>rrctaps</value>
-    </param>
-    <param>
-      <key>filter_size</key>
-      <value>nfilts</value>
-    </param>
-    <param>
-      <key>init_phase</key>
-      <value>16</value>
-    </param>
-    <param>
-      <key>max_dev</key>
-      <value>20</value>
+      <key>value</key>
+      <value>4.1</value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(512, 527)</value>
+      <value>(32, 842)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -1234,7 +1288,7 @@
     <key>variable</key>
     <param>
       <key>id</key>
-      <value>pam_amp</value>
+      <value>sig_amp</value>
     </param>
     <param>
       <key>_enabled</key>
@@ -1242,11 +1296,11 @@
     </param>
     <param>
       <key>value</key>
-      <value>2</value>
+      <value>1</value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(223, 9)</value>
+      <value>(315, 9)</value>
     </param>
     <param>
       <key>_rotation</key>
@@ -1357,6 +1411,12 @@
   </connection>
   <connection>
     <source_block_id>root_raised_cosine_filter_0</source_block_id>
+    <sink_block_id>gr_multiply_const_vxx_0</sink_block_id>
+    <source_key>0</source_key>
+    <sink_key>0</sink_key>
+  </connection>
+  <connection>
+    <source_block_id>gr_multiply_const_vxx_0</source_block_id>
     <sink_block_id>blks2_pfb_arb_resampler_ccf_0</sink_block_id>
     <source_key>0</source_key>
     <sink_key>0</sink_key>
-- 
cgit v1.2.3


From 6f6b022977a74596c19ae1b0748010a86abdfed2 Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Mon, 12 Oct 2009 18:36:55 -0400
Subject: Fixing initialization of timing gains. Alpha should be < 1, and beta
 should be << 1.

---
 gnuradio-core/src/python/gnuradio/blks2impl/dbpsk2.py | 13 ++++---------
 gnuradio-core/src/python/gnuradio/blks2impl/dqpsk2.py | 13 ++++---------
 2 files changed, 8 insertions(+), 18 deletions(-)

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/dbpsk2.py b/gnuradio-core/src/python/gnuradio/blks2impl/dbpsk2.py
index c56b598fab..4541b453b3 100644
--- a/gnuradio-core/src/python/gnuradio/blks2impl/dbpsk2.py
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/dbpsk2.py
@@ -39,8 +39,8 @@ _def_verbose = False
 _def_log = False
 
 _def_costas_alpha = 0.1
-_def_timing_alpha = None
-_def_timing_beta = None
+_def_timing_alpha = 0.100
+_def_timing_beta = 0.010
 _def_timing_max_dev = 1.5
 
 
@@ -220,7 +220,7 @@ class dbpsk2_demod(gr.hier_block2):
         self._excess_bw = excess_bw
         self._costas_alpha = costas_alpha
         self._timing_alpha = timing_alpha
-        self._timing_beta = _def_timing_alpha
+        self._timing_beta = _def_timing_beta
         self._timing_max_dev=timing_max_dev
         self._gray_code = gray_code
         
@@ -242,12 +242,7 @@ class dbpsk2_demod(gr.hier_block2):
                                              self._costas_beta,
                                              fmax, fmin, arity)
 
-        # symbol clock recovery
-        if not self._timing_alpha:
-            self._timing_alpha = 2
-            self._timing_beta = 0.020
-            
-        # RRC data filter
+        # symbol timing recovery with RRC data filter
         nfilts = 32
         ntaps = 11 * samples_per_symbol*nfilts
         taps = gr.firdes.root_raised_cosine(nfilts, nfilts, 1.0/float(self._samples_per_symbol), self._excess_bw, ntaps)
diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/dqpsk2.py b/gnuradio-core/src/python/gnuradio/blks2impl/dqpsk2.py
index 05363bf04c..9704ac98c5 100644
--- a/gnuradio-core/src/python/gnuradio/blks2impl/dqpsk2.py
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/dqpsk2.py
@@ -39,8 +39,8 @@ _def_verbose = False
 _def_log = False
 
 _def_costas_alpha = 0.01
-_def_timing_alpha = None
-_def_timing_beta = None
+_def_timing_alpha = 0.100
+_def_timing_beta = 0.010
 _def_timing_max_dev = 1.5
 
 
@@ -220,7 +220,7 @@ class dqpsk2_demod(gr.hier_block2):
         self._excess_bw = excess_bw
         self._costas_alpha = costas_alpha
         self._timing_alpha = timing_alpha
-        self._timing_beta = _def_timing_alpha
+        self._timing_beta = _def_timing_beta
         self._timing_max_dev=timing_max_dev
         self._gray_code = gray_code
 
@@ -242,12 +242,7 @@ class dqpsk2_demod(gr.hier_block2):
                                              self._costas_beta,
                                              fmax, fmin, arity)
 
-        # symbol clock recovery
-        if not self._timing_alpha:
-            self._timing_alpha = 2
-            self._timing_beta = 0.020
-            
-        # RRC data filter
+        # symbol timing recovery with RRC data filter
         nfilts = 32
         ntaps = 11 * samples_per_symbol*nfilts
         taps = gr.firdes.root_raised_cosine(nfilts, nfilts, 1.0/float(self._samples_per_symbol), self._excess_bw, ntaps)
-- 
cgit v1.2.3


From 3eeb2720664ec7cb67e60d4f8a01b933ddba0143 Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Mon, 12 Oct 2009 18:41:24 -0400
Subject: Reverting dqpsk to be mpsk_receiver based and not change its
 behavior.

---
 .../src/python/gnuradio/blks2impl/dqpsk.py         | 31 +++++-----------------
 1 file changed, 7 insertions(+), 24 deletions(-)

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/dqpsk.py b/gnuradio-core/src/python/gnuradio/blks2impl/dqpsk.py
index 34e6581bf7..edd3024a67 100644
--- a/gnuradio-core/src/python/gnuradio/blks2impl/dqpsk.py
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/dqpsk.py
@@ -258,28 +258,12 @@ class dqpsk_demod(gr.hier_block2):
         fmin = -0.25
         fmax = 0.25
         
-        #self.receiver=gr.mpsk_receiver_cc(arity, pi/4.0,
-        #                                  self._costas_alpha, self._costas_beta,
-        #                                  fmin, fmax,
-        #                                  self._mm_mu, self._mm_gain_mu,
-        #                                  self._mm_omega, self._mm_gain_omega,
-        #                                  self._mm_omega_relative_limit)
-        self.clock_recov = gr.costas_loop_cc(self._costas_alpha,
-                                             self._costas_beta,
-                                             fmax, fmin, arity)
-        if 0:
-            self.time_recov = gr.clock_recovery_mm_cc(self._mm_omega,
-                                                      self._mm_gain_omega,
-                                                      self._mm_mu,
-                                                      self._mm_gain_mu,
-                                                      self._mm_omega_relative_limit)
-        else:
-            ntaps = 32*ntaps
-            taps = gr.firdes.root_raised_cosine(
-                32, 1.0, 0.25/32.0, self._excess_bw, ntaps)
-            self.time_recov = gr.pfb_clock_sync_ccf(self._mm_omega,
-                                                    self._mm_gain_mu,
-                                                    taps)
+        self.receiver=gr.mpsk_receiver_cc(arity, pi/4.0,
+                                          self._costas_alpha, self._costas_beta,
+                                          fmin, fmax,
+                                          self._mm_mu, self._mm_gain_mu,
+                                          self._mm_omega, self._mm_gain_omega,
+                                          self._mm_omega_relative_limit)
         
         # Perform Differential decoding on the constellation
         self.diffdec = gr.diff_phasor_cc()
@@ -304,8 +288,7 @@ class dqpsk_demod(gr.hier_block2):
             self._setup_logging()
  
         # Connect & Initialize base class
-        self.connect(self, self.pre_scaler, self.agc, #self.rrc_filter, #self.receiver,
-                     self.clock_recov, self.time_recov,
+        self.connect(self, self.pre_scaler, self.agc, self.rrc_filter, #self.receiver,
                      self.diffdec, self.slicer, self.symbol_mapper, self.unpack, self)
 
     def samples_per_symbol(self):
-- 
cgit v1.2.3