commit-gnuradio
[Top][All Lists]
Advanced

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

[Commit-gnuradio] r4603 - gnuradio/branches/developers/n4hy/ofdm/gnuradi


From: trondeau
Subject: [Commit-gnuradio] r4603 - gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general
Date: Thu, 22 Feb 2007 22:48:13 -0700 (MST)

Author: trondeau
Date: 2007-02-22 22:48:13 -0700 (Thu, 22 Feb 2007)
New Revision: 4603

Modified:
   
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_bpsk_demapper.cc
   
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_bpsk_demapper.h
   
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_bpsk_demapper.i
   
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_correlator.cc
   
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_correlator.h
Log:
clean-up of OFDM code. Equalizes multipath. Correlator to demapper is only 
number of occupied tones now.



Modified: 
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_bpsk_demapper.cc
===================================================================
--- 
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_bpsk_demapper.cc
       2007-02-23 05:01:20 UTC (rev 4602)
+++ 
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_bpsk_demapper.cc
       2007-02-23 05:48:13 UTC (rev 4603)
@@ -26,21 +26,19 @@
 
 #include <gr_ofdm_bpsk_demapper.h>
 #include <gr_io_signature.h>
-#include <vector>
 
 gr_ofdm_bpsk_demapper_sptr
-gr_make_ofdm_bpsk_demapper (unsigned int occupied_carriers, unsigned int vlen)
+gr_make_ofdm_bpsk_demapper (unsigned int occupied_carriers)
 {
-  return gr_ofdm_bpsk_demapper_sptr (new gr_ofdm_bpsk_demapper 
(occupied_carriers, vlen));
+  return gr_ofdm_bpsk_demapper_sptr (new gr_ofdm_bpsk_demapper 
(occupied_carriers));
 }
 
-gr_ofdm_bpsk_demapper::gr_ofdm_bpsk_demapper (unsigned occupied_carriers, 
unsigned int vlen)
+gr_ofdm_bpsk_demapper::gr_ofdm_bpsk_demapper (unsigned occupied_carriers)
   : gr_block ("ofdm_bpsk_demapper",
-             gr_make_io_signature (1, 1, sizeof(gr_complex)*vlen),
+             gr_make_io_signature (1, 1, sizeof(gr_complex)*occupied_carriers),
              gr_make_io_signature (1, 1, sizeof(unsigned char))),
     d_occupied_carriers(occupied_carriers),
-    d_vlen(vlen),
-    d_byte_offset(0)
+    d_byte_offset(0), d_partial_byte(0)
 {
 }
 
@@ -72,14 +70,10 @@
   
   unsigned int i=0, bytes_produced=0;
 
-  int unoccupied_carriers = d_vlen - d_occupied_carriers;
-  int zeros_on_left = (int)ceil(unoccupied_carriers/2.0);
-  //  int zeros_on_right = (int)unoccupied_carriers - zeros_on_left;
+  while(i < d_occupied_carriers) {
 
-  i = zeros_on_left;
-  while(i < zeros_on_left+d_occupied_carriers) {
-
-    while((d_byte_offset < 8) && (i < zeros_on_left+d_occupied_carriers)) {
+    while((d_byte_offset < 8) && (i < d_occupied_carriers)) {
+      //fprintf(stderr, "%f+j%f\n", in[i].real(), in[i].imag()); 
       d_partial_byte |= slicer(in[i++]) << (d_byte_offset++);
     }
 

Modified: 
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_bpsk_demapper.h
===================================================================
--- 
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_bpsk_demapper.h
        2007-02-23 05:01:20 UTC (rev 4602)
+++ 
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_bpsk_demapper.h
        2007-02-23 05:48:13 UTC (rev 4603)
@@ -25,12 +25,13 @@
 
 
 #include <gr_block.h>
+#include <vector>
 
 class gr_ofdm_bpsk_demapper;
 typedef boost::shared_ptr<gr_ofdm_bpsk_demapper> gr_ofdm_bpsk_demapper_sptr;
 
 gr_ofdm_bpsk_demapper_sptr 
-gr_make_ofdm_bpsk_demapper (unsigned int occupied_carriers, unsigned int vlen);
+gr_make_ofdm_bpsk_demapper (unsigned int occupied_carriers);
 
 
 /*!
@@ -41,16 +42,15 @@
 class gr_ofdm_bpsk_demapper : public gr_block
 {
   friend gr_ofdm_bpsk_demapper_sptr
-    gr_make_ofdm_bpsk_demapper (unsigned int occupied_carriers, unsigned int 
vlen);
+    gr_make_ofdm_bpsk_demapper (unsigned int occupied_carriers);
   
  protected:
-  gr_ofdm_bpsk_demapper (unsigned int occupied_carriers, unsigned int vlen);
+  gr_ofdm_bpsk_demapper (unsigned int occupied_carriers);
   
  private:
   unsigned char slicer(gr_complex x);
 
   unsigned int d_occupied_carriers;
-  unsigned int d_vlen;
   unsigned int d_byte_offset;
   unsigned char d_partial_byte;
   

Modified: 
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_bpsk_demapper.i
===================================================================
--- 
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_bpsk_demapper.i
        2007-02-23 05:01:20 UTC (rev 4602)
+++ 
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_bpsk_demapper.i
        2007-02-23 05:48:13 UTC (rev 4603)
@@ -20,17 +20,17 @@
  * Boston, MA 02110-1301, USA.
  */
 
+#include <vector>
+
 GR_SWIG_BLOCK_MAGIC(gr,ofdm_bpsk_demapper)
 
 gr_ofdm_bpsk_demapper_sptr 
-gr_make_ofdm_bpsk_demapper (unsigned int occupied_carriers, 
-                           unsigned int vlen);
+gr_make_ofdm_bpsk_demapper (unsigned int occupied_carriers);
 
 class gr_ofdm_bpsk_demapper : public gr_sync_decimator
 {
  protected:
-  gr_ofdm_bpsk_demapper (unsigned int occupied_carriers,
-                        unsigned int vlen);
+  gr_ofdm_bpsk_demapper (unsigned int occupied_carriers);
 
  public:
   int general_work(int noutput_items,

Modified: 
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_correlator.cc
===================================================================
--- 
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_correlator.cc
  2007-02-23 05:01:20 UTC (rev 4602)
+++ 
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_correlator.cc
  2007-02-23 05:48:13 UTC (rev 4603)
@@ -27,6 +27,8 @@
 #include <gr_ofdm_correlator.h>
 #include <gr_io_signature.h>
 
+#define VERBOSE   1
+
 gr_ofdm_correlator_sptr
 gr_make_ofdm_correlator (unsigned int occupied_carriers, unsigned int vlen,
                         std::vector<gr_complex> known_symbol1, 
@@ -41,28 +43,21 @@
                                        std::vector<gr_complex> known_symbol2)
   : gr_block ("ofdm_correlator",
              gr_make_io_signature (1, 1, sizeof(gr_complex)*vlen),
-             gr_make_io_signature (1, 1, sizeof(gr_complex)*vlen)),
+             gr_make_io_signature (1, 1, 
sizeof(gr_complex)*occupied_carriers)),
     d_occupied_carriers(occupied_carriers),
     d_vlen(vlen),
     d_known_symbol1(known_symbol1),
     d_known_symbol2(known_symbol2)
 {
-  d_last_symbol.resize(d_vlen);
   d_diff_corr_factor.resize(d_occupied_carriers);
   d_hestimate.resize(d_occupied_carriers);
-  fill(d_last_symbol.begin(), d_last_symbol.end(), gr_complex(0,0));
 
   std::vector<gr_complex>::iterator i1, i2;
 
   int i = 0;
   gr_complex one(1.0, 0.0);
   for(i1 = d_known_symbol1.begin(), i2 = d_known_symbol2.begin(); i1 != 
d_known_symbol1.end(); i1++, i2++) {
-    gr_complex fact = one / ((*i1) * conj(*i2));
-    d_diff_corr_factor[i] = fact;
-
-    //printf("ks1: %f+j%f  ks2*: %f+j%f  Corr Factor: %f+j%f\n", 
-    //   (*i1).real(), (*i1).imag(), (conj(*i2)).real(), (conj(*i2)).imag(),
-    //   d_diff_corr_factor[i].real(), d_diff_corr_factor[i].imag());
+    d_diff_corr_factor[i] = one / ((*i1) * conj(*i2));
     i++;
   }
 }
@@ -71,11 +66,6 @@
 {
 }
 
-unsigned char gr_ofdm_correlator::slicer(gr_complex x)
-{
-  return (unsigned char)(x.real() > 0 ? 1 : 0);
-}
-
 void
 gr_ofdm_correlator::forecast (int noutput_items, gr_vector_int 
&ninput_items_required)
 {
@@ -85,7 +75,8 @@
 }
 
 bool
-gr_ofdm_correlator::correlate(const gr_complex *in, int zeros_on_left)
+gr_ofdm_correlator::correlate(const gr_complex *previous, const gr_complex 
*current, 
+                             int zeros_on_left)
 {
   unsigned int i = 0;
   bool found = false;
@@ -94,49 +85,40 @@
   float power = 0.0F;
 
   for(i = 0; i < d_occupied_carriers; i++) {
-    h_sqrd = h_sqrd + d_last_symbol[i+zeros_on_left] * 
conj(in[i+zeros_on_left]) * d_diff_corr_factor[i];
-    power = power + norm(in[i+zeros_on_left]);
-
-    //d_last_symbol[i+zeros_on_left] = in[i+zeros_on_left]; 
+    h_sqrd = h_sqrd + previous[i+zeros_on_left] * 
conj(current[i+zeros_on_left]) * d_diff_corr_factor[i];
+    power = power + norm(current[i+zeros_on_left]);
   }
 
   if(h_sqrd.real() > 0.75*power) {
     found = true;
   }
-  
+#if VERBOSE
   printf("h_sqrd = ( %f, %f )\t power = %f\t real(h)/p = %f\t angle = %f\n", 
         h_sqrd.real(), h_sqrd.imag(), power, h_sqrd.real()/power, 
arg(h_sqrd)); 
-
+#endif
   return found;
 }
 
 void
-gr_ofdm_correlator::calculate_equalizer(const gr_complex *in, int 
zeros_on_left)
+gr_ofdm_correlator::calculate_equalizer(const gr_complex *current, int 
zeros_on_left)
 {
   unsigned int i=0;
   gr_complex hesttemp;
-  //std::vector<gr_complex> hest1, hest2;
 
-  //hest1.resize(d_occupied_carriers);
-  //hest2.resize(d_occupied_carriers);
-
   for(i = 0; i < d_occupied_carriers; i++) {
     // FIXME possibly add small epsilon in divisor to protect from div 0
-    //hesttemp = d_known_symbol1[i] / d_last_symbol[i+zeros_on_left];
-    //hest1[i] = hesttemp;
-
-    hesttemp = d_known_symbol2[i] / in[i+zeros_on_left];
-    //hest2[i] = hesttemp;
+    //hesttemp = d_known_symbol1[i] / previous[i+zeros_on_left];
+    hesttemp = d_known_symbol2[i] / current[i+zeros_on_left];
     
     d_hestimate[i] = hesttemp;
 
+#if VERBOSE
     fprintf(stderr, "%f %f ", d_hestimate[i].real(), d_hestimate[i].imag());
-
-    //fprintf(stderr, "h1: %f+j%f   h2: %f+j%f  hest: %f+j%f\n", 
-    //hest1[i].real(), hest1[i].imag(), hest2[i].real(), hest2[i].imag(),
-    //d_hestimate[i].real(), d_hestimate[i].imag());
+#endif
   }
+#if VERBOSE
   fprintf(stderr, "\n");
+#endif
 }
 
 int
@@ -146,6 +128,9 @@
                                 gr_vector_void_star &output_items)
 {
   const gr_complex *in = (const gr_complex *)input_items[0];
+  const gr_complex *previous = &in[0];
+  const gr_complex *current = &in[d_vlen];
+
   gr_complex *out = (gr_complex *) output_items[0];
   
   unsigned int i=0;
@@ -153,21 +138,15 @@
   int unoccupied_carriers = d_vlen - d_occupied_carriers;
   int zeros_on_left = (int)ceil(unoccupied_carriers/2.0);
 
-  bool corr = correlate(in, zeros_on_left);
+  bool corr = correlate(previous, current, zeros_on_left);
   if(corr) {
-    calculate_equalizer(in, zeros_on_left);
+    calculate_equalizer(current, zeros_on_left);
   }
 
-#if 1
-  memset(out,0,d_vlen*sizeof(gr_complex)); // zero entire vector
   for(i = 0; i < d_occupied_carriers; i++) {
-    d_last_symbol[i+zeros_on_left] = in[i+zeros_on_left];
-    out[i+zeros_on_left] = d_hestimate[i]*in[i+zeros_on_left];
+    out[i] = d_hestimate[i]*current[i+zeros_on_left];
   }
-#else
-  memcpy(out,in,d_vlen*sizeof(gr_complex));
-#endif
-
+  
   consume_each(1);
   return 1;
 }

Modified: 
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_correlator.h
===================================================================
--- 
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_correlator.h
   2007-02-23 05:01:20 UTC (rev 4602)
+++ 
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_correlator.h
   2007-02-23 05:48:13 UTC (rev 4603)
@@ -54,13 +54,12 @@
   
  private:
   unsigned char slicer(gr_complex x);
-  bool correlate(const gr_complex *in, int zeros_on_left);
-  void calculate_equalizer(const gr_complex *in, int zeros_on_left);
+  bool correlate(const gr_complex *previous, const gr_complex *current, int 
zeros_on_left);
+  void calculate_equalizer(const gr_complex *current, int zeros_on_left);
 
   unsigned int d_occupied_carriers;
   unsigned int d_vlen;
   std::vector<gr_complex> d_known_symbol1, d_known_symbol2;
-  std::vector<gr_complex> d_last_symbol;
   std::vector<gr_complex> d_diff_corr_factor;
   std::vector<gr_complex> d_hestimate;
 





reply via email to

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