commit-gnuradio
[Top][All Lists]
Advanced

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

[Commit-gnuradio] r4218 - gnuradio/branches/developers/trondeau/digital-


From: trondeau
Subject: [Commit-gnuradio] r4218 - gnuradio/branches/developers/trondeau/digital-wip2/gnuradio-core/src/lib/general
Date: Tue, 2 Jan 2007 16:53:48 -0700 (MST)

Author: trondeau
Date: 2007-01-02 16:53:48 -0700 (Tue, 02 Jan 2007)
New Revision: 4218

Modified:
   
gnuradio/branches/developers/trondeau/digital-wip2/gnuradio-core/src/lib/general/gr_mpsk_receiver_cc.cc
   
gnuradio/branches/developers/trondeau/digital-wip2/gnuradio-core/src/lib/general/gr_mpsk_receiver_cc.h
Log:
updates to mpsk receiver to take care of some limit checking and other 
formatting issues

Modified: 
gnuradio/branches/developers/trondeau/digital-wip2/gnuradio-core/src/lib/general/gr_mpsk_receiver_cc.cc
===================================================================
--- 
gnuradio/branches/developers/trondeau/digital-wip2/gnuradio-core/src/lib/general/gr_mpsk_receiver_cc.cc
     2007-01-02 23:50:32 UTC (rev 4217)
+++ 
gnuradio/branches/developers/trondeau/digital-wip2/gnuradio-core/src/lib/general/gr_mpsk_receiver_cc.cc
     2007-01-02 23:53:48 UTC (rev 4218)
@@ -40,30 +40,30 @@
 
 gr_mpsk_receiver_cc_sptr 
 gr_make_mpsk_receiver_cc(unsigned int M, float theta,
-                                 float alpha, float beta,
-                                 float fmin, float fmax,
-                                 float mu, float gain_mu, 
-                                 float omega, float gain_omega, float 
omega_rel)
+                        float alpha, float beta,
+                        float fmin, float fmax,
+                        float mu, float gain_mu, 
+                        float omega, float gain_omega, float omega_rel)
 {
   return gr_mpsk_receiver_cc_sptr (new gr_mpsk_receiver_cc (M, theta, 
-                                                                             
alpha, beta,
-                                                                             
fmin, fmax,
-                                                                             
mu, gain_mu, 
-                                                                             
omega, gain_omega, omega_rel));
+                                                           alpha, beta,
+                                                           fmin, fmax,
+                                                           mu, gain_mu, 
+                                                           omega, gain_omega, 
omega_rel));
 }
 
 gr_mpsk_receiver_cc::gr_mpsk_receiver_cc (unsigned int M, float theta, 
-                                                           float alpha, float 
beta,
-                                                           float fmin, float 
fmax,
-                                                           float mu, float 
gain_mu, 
-                                                           float omega, float 
gain_omega, float omega_rel)
+                                         float alpha, float beta,
+                                         float fmin, float fmax,
+                                         float mu, float gain_mu, 
+                                         float omega, float gain_omega, float 
omega_rel)
   : gr_block ("mpsk_receiver_cc",
              gr_make_io_signature (1, 1, sizeof (gr_complex)),
              gr_make_io_signature (1, 1, sizeof (gr_complex))),
     d_M(M), d_theta(theta), 
-    d_alpha(alpha), d_beta(beta), d_freq(0), d_phase(0),
+    d_alpha(alpha), d_beta(beta), d_freq(0), d_max_freq(fmax), 
d_min_freq(fmin), d_phase(0),
     d_mu(mu), d_gain_mu(gain_mu), d_gain_omega(gain_omega), 
-    d_max_omega(omega+omega_rel), d_min_omega(omega-omega_rel),
+    d_omega_rel(omega_rel), d_max_omega(0), d_min_omega(0),
     d_p_2T(0), d_p_1T(0), d_p_0T(0), d_c_2T(0), d_c_1T(0), d_c_0T(0)
 {
   d_interp = new gri_mmse_fir_interpolator_cc();
@@ -71,6 +71,18 @@
 
   set_omega(omega);
 
+  if (omega <= 0.0)
+    throw std::out_of_range ("clock rate must be > 0");
+  if (gain_mu <  0  || gain_omega < 0)
+    throw std::out_of_range ("Gains must be non-negative");
+  
+  assert(d_interp->ntaps() <= DLLEN);
+  
+  // zero double length delay line.
+  for (unsigned int i = 0; i < 2 * DLLEN; i++)
+    d_dl[i] = gr_complex(0.0,0.0);
+
+
   // Select a phase detector and a decision maker for the modulation order
   switch(d_M) {
   case 2:  // optimized algorithms for BPSK
@@ -196,9 +208,9 @@
 
 int
 gr_mpsk_receiver_cc::general_work (int noutput_items,
-                                           gr_vector_int &ninput_items,
-                                           gr_vector_const_void_star 
&input_items,
-                                           gr_vector_void_star &output_items)
+                                  gr_vector_int &ninput_items,
+                                  gr_vector_const_void_star &input_items,
+                                  gr_vector_void_star &output_items)
 {
   const gr_complex *in = (const gr_complex *) input_items[0];
   gr_complex *out = (gr_complex *) output_items[0];
@@ -209,7 +221,6 @@
   int i=0, o=0;
 
   while(i < ninput_items[0]) {    
-   
     while((d_mu > 1) && (i < ninput_items[0]))  {
       d_mu--;             // skip a number of symbols between sampling
       d_phase += d_freq;  // increment the phase based on the frequency of the 
rotation
@@ -242,7 +253,7 @@
     
     if(i < ninput_items[0]) {
       gr_complex interp_sample = d_interp->interpolate(&d_dl[d_dl_idx], d_mu);
-      
+       
       // Make sample timing corrections
       d_p_2T = d_p_1T;
       d_p_1T = d_p_0T;
@@ -256,7 +267,7 @@
       y = (d_p_0T - d_p_2T) * conj(d_c_1T);
       u = y - x;
       mm_error = u.real();
-      
+
       // limit mm_val
       if (mm_error > 1.0)
        mm_error = 1.0;
@@ -281,12 +292,18 @@
       d_freq += d_beta*phase_error;
       d_phase += d_alpha*phase_error;
 
-      // FIXME: Add frequency clamping
+      while(d_phase>M_TWOPI)
+       d_phase -= M_TWOPI;
+      while(d_phase<-M_TWOPI)
+       d_phase += M_TWOPI;
 
-      out[o++] = d_p_0T; //interp_sample;
+      if (d_freq > d_max_freq)
+       d_freq = d_max_freq;
+      else if (d_freq < d_min_freq)
+       d_freq = d_min_freq;
+
+      out[o++] = d_p_0T;
     }
-
-    //printf("\t interpolated sample: %f+j*%f\n\n",  interp_sample.real(), 
interp_sample.imag());
   }
 
   consume_each(i);

Modified: 
gnuradio/branches/developers/trondeau/digital-wip2/gnuradio-core/src/lib/general/gr_mpsk_receiver_cc.h
===================================================================
--- 
gnuradio/branches/developers/trondeau/digital-wip2/gnuradio-core/src/lib/general/gr_mpsk_receiver_cc.h
      2007-01-02 23:50:32 UTC (rev 4217)
+++ 
gnuradio/branches/developers/trondeau/digital-wip2/gnuradio-core/src/lib/general/gr_mpsk_receiver_cc.h
      2007-01-02 23:53:48 UTC (rev 4218)
@@ -249,7 +249,7 @@
   // Members related to carrier and phase tracking
   float d_alpha;
   float d_beta;
-  float d_freq;
+  float d_freq, d_max_freq, d_min_freq;
   float d_phase;
 
 /*!





reply via email to

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