commit-gnuradio
[Top][All Lists]
Advanced

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

[Commit-gnuradio] r5603 - gnuradio/branches/features/ofdm/receiver/gnura


From: trondeau
Subject: [Commit-gnuradio] r5603 - gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general
Date: Sat, 2 Jun 2007 09:05:10 -0600 (MDT)

Author: trondeau
Date: 2007-06-02 09:05:09 -0600 (Sat, 02 Jun 2007)
New Revision: 5603

Modified:
   
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_correlator.cc
   
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_correlator.h
   
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_correlator.i
Log:
cleaning up ofdm_correlator code

Modified: 
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_correlator.cc
===================================================================
--- 
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_correlator.cc
        2007-06-02 11:55:59 UTC (rev 5602)
+++ 
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_correlator.cc
        2007-06-02 15:05:09 UTC (rev 5603)
@@ -1,6 +1,6 @@
 /* -*- c++ -*- */
 /*
- * Copyright 2006 Free Software Foundation, Inc.
+ * Copyright 2006, 2007 Free Software Foundation, Inc.
  * 
  * This file is part of GNU Radio
  * 
@@ -26,29 +26,30 @@
 
 #include <gr_ofdm_correlator.h>
 #include <gr_io_signature.h>
+#include <gr_expj.h>
 
 #define VERBOSE 0
 #define M_TWOPI (2*M_PI)
 
 gr_ofdm_correlator_sptr
-gr_make_ofdm_correlator (unsigned int occupied_carriers, unsigned int vlen, 
+gr_make_ofdm_correlator (unsigned int occupied_carriers, unsigned int 
fft_length, 
                         unsigned int cplen,
-                        std::vector<gr_complex> known_symbol1, 
-                        std::vector<gr_complex> known_symbol2)
+                        const std::vector<gr_complex> &known_symbol1, 
+                        const std::vector<gr_complex> &known_symbol2)
 {
-  return gr_ofdm_correlator_sptr (new gr_ofdm_correlator (occupied_carriers, 
vlen, cplen,
+  return gr_ofdm_correlator_sptr (new gr_ofdm_correlator (occupied_carriers, 
fft_length, cplen,
                                                          known_symbol1, 
known_symbol2));
 }
 
-gr_ofdm_correlator::gr_ofdm_correlator (unsigned occupied_carriers, unsigned 
int vlen, 
+gr_ofdm_correlator::gr_ofdm_correlator (unsigned occupied_carriers, unsigned 
int fft_length, 
                                        unsigned int cplen,
-                                       std::vector<gr_complex> known_symbol1, 
-                                       std::vector<gr_complex> known_symbol2)
+                                       const std::vector<gr_complex> 
&known_symbol1, 
+                                       const 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)*fft_length),
              gr_make_io_signature2 (2, 2, 
sizeof(gr_complex)*occupied_carriers, sizeof(char))),
     d_occupied_carriers(occupied_carriers),
-    d_vlen(vlen),
+    d_fft_length(fft_length),
     d_cplen(cplen),
     d_freq_shift_len(5),
     d_known_symbol1(known_symbol1),
@@ -84,8 +85,9 @@
 gr_complex
 gr_ofdm_correlator::coarse_freq_comp(int freq_delta, int symbol_count)
 {
-  return gr_complex(cos(-M_TWOPI*freq_delta*d_cplen/d_vlen*symbol_count),
-                   sin(-M_TWOPI*freq_delta*d_cplen/d_vlen*symbol_count));
+  //  return 
gr_complex(cos(-M_TWOPI*freq_delta*d_cplen/d_fft_length*symbol_count),
+  //       sin(-M_TWOPI*freq_delta*d_cplen/d_fft_length*symbol_count));
+  return gr_expj(-M_TWOPI*freq_delta*d_cplen/d_fft_length*symbol_count);
 }
 
 bool
@@ -99,7 +101,7 @@
   gr_complex h_sqrd = gr_complex(0.0,0.0);
   float power = 0.0F;
 
-  while(!found && (abs(search_delta) < d_freq_shift_len)) {
+  while(!found && ((unsigned)abs(search_delta) < d_freq_shift_len)) {
     h_sqrd = gr_complex(0.0,0.0);
     power = 0.0F;
 
@@ -115,13 +117,21 @@
             search_delta, h_sqrd.real(), h_sqrd.imag(), power, 
h_sqrd.real()/power, arg(h_sqrd)); 
 #endif
 
+      // FIXME: Look at h_sqrd.read() > power
     if((h_sqrd.real() > 0.82*power)  && (h_sqrd.real() < 1.1 * power)) {
       found = true;
       d_coarse_freq = search_delta;
       d_phase_count = 1;
       //d_snr_est = 10*log10(power/(power-h_sqrd.real()));
-      d_snr_est = 10*log10(fabs(h_sqrd.real()/h_sqrd.imag()));
 
+      // check for low noise power; sets maximum SNR at 100 dB
+      if(fabs(h_sqrd.imag()) <= 1e-12) {
+       d_snr_est = 100.0;
+      }
+      else {
+       d_snr_est = 10*log10(fabs(h_sqrd.real()/h_sqrd.imag()));
+      }
+
       printf("CORR: Found, bin %d\tSNR Est %f dB\tcorr power fraction %f\n", 
              search_delta, d_snr_est, h_sqrd.real()/power);
       // 
search_delta,10*log10(h_sqrd.real()/fabs(h_sqrd.imag())),h_sqrd.real()/power);
@@ -169,14 +179,14 @@
 {
   const gr_complex *in = (const gr_complex *)input_items[0];
   const gr_complex *previous = &in[0];
-  const gr_complex *current = &in[d_vlen];
+  const gr_complex *current = &in[d_fft_length];
 
   gr_complex *out = (gr_complex *) output_items[0];
   char *sig = (char *) output_items[1];
   
   unsigned int i=0;
 
-  int unoccupied_carriers = d_vlen - d_occupied_carriers;
+  int unoccupied_carriers = d_fft_length - d_occupied_carriers;
   int zeros_on_left = (int)ceil(unoccupied_carriers/2.0);
 
   bool corr = correlate(previous, current, zeros_on_left);
@@ -190,8 +200,6 @@
 
   for(i = 0; i < d_occupied_carriers; i++) {
     out[i] = 
d_hestimate[i]*coarse_freq_comp(d_coarse_freq,d_phase_count)*current[i+zeros_on_left+d_coarse_freq];
-    //out[i] = 
coarse_freq_comp(d_coarse_freq,d_phase_count)*current[i+zeros_on_left+d_coarse_freq];
-    //out[i] = current[i+zeros_on_left+d_coarse_freq];
   }
   
 

Modified: 
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_correlator.h
===================================================================
--- 
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_correlator.h
 2007-06-02 11:55:59 UTC (rev 5602)
+++ 
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_correlator.h
 2007-06-02 15:05:09 UTC (rev 5603)
@@ -1,6 +1,6 @@
 /* -*- c++ -*- */
 /*
- * Copyright 2006 Free Software Foundation, Inc.
+ * Copyright 2006, 2007 Free Software Foundation, Inc.
  * 
  * This file is part of GNU Radio
  * 
@@ -31,10 +31,10 @@
 typedef boost::shared_ptr<gr_ofdm_correlator> gr_ofdm_correlator_sptr;
 
 gr_ofdm_correlator_sptr 
-gr_make_ofdm_correlator (unsigned int occupied_carriers, unsigned int vlen,
+gr_make_ofdm_correlator (unsigned int occupied_carriers, unsigned int 
fft_length,
                         unsigned int cplen,
-                        std::vector<gr_complex> known_symbol1, 
-                        std::vector<gr_complex> known_symbol2);
+                        const std::vector<gr_complex> &known_symbol1, 
+                        const std::vector<gr_complex> &known_symbol2);
 
 /*!
  * \brief take a vector of complex constellation points in from an FFT
@@ -48,7 +48,7 @@
  * been corrected and that the samples fall in the middle of one FFT bin.
  *
  * It then uses one of those known
- * symbosl to estimate the channel response overa all subcarriers and does a 
simple 
+ * symbols to estimate the channel response over all subcarriers and does a 
simple 
  * 1-tap equalization on all subcarriers. This corrects for the phase and 
amplitude
  * distortion caused by the channel.
  */
@@ -58,7 +58,7 @@
   /*! 
    * \brief Build an OFDM correlator and equalizer.
    * \param occupied_carriers   The number of subcarriers with data in the 
received symbol
-   * \param vlen                The size of the FFT vector (occupied_carriers 
+ unused carriers)
+   * \param fft_length          The size of the FFT vector (occupied_carriers 
+ unused carriers)
    * \param known_symbol1       A vector of complex numbers representing a 
known symbol at the
    *                            start of a frame (usually a BPSK PN sequence)
    * \param known_symbol2       A vector of complex numbers representing a 
known symbol at the
@@ -67,16 +67,16 @@
    *                            for phase changes between symbols. 
    */
   friend gr_ofdm_correlator_sptr
-  gr_make_ofdm_correlator (unsigned int occupied_carriers, unsigned int vlen,
+  gr_make_ofdm_correlator (unsigned int occupied_carriers, unsigned int 
fft_length,
                           unsigned int cplen,
-                          std::vector<gr_complex> known_symbol1, 
-                          std::vector<gr_complex> known_symbol2);
+                          const std::vector<gr_complex> &known_symbol1, 
+                          const std::vector<gr_complex> &known_symbol2);
   
  protected:
-  gr_ofdm_correlator (unsigned int occupied_carriers, unsigned int vlen,
+  gr_ofdm_correlator (unsigned int occupied_carriers, unsigned int fft_length,
                      unsigned int cplen,
-                     std::vector<gr_complex> known_symbol1, 
-                     std::vector<gr_complex> known_symbol2);
+                     const std::vector<gr_complex> &known_symbol1, 
+                     const std::vector<gr_complex> &known_symbol2);
   
  private:
   unsigned char slicer(gr_complex x);
@@ -86,15 +86,15 @@
   gr_complex coarse_freq_comp(int freq_delta, int count);
   
   unsigned int d_occupied_carriers;  // !< \brief number of subcarriers with 
data
-  unsigned int d_vlen;               // !< \brief length of FFT vector
+  unsigned int d_fft_length;         // !< \brief length of FFT vector
   unsigned int d_cplen;              // !< \brief length of cyclic prefix in 
samples
   unsigned int d_freq_shift_len;     // !< \brief number of surrounding bins 
to look at for correlation
   std::vector<gr_complex> d_known_symbol1, d_known_symbol2; // !< \brief known 
symbols at start of frame
   std::vector<gr_complex> d_diff_corr_factor; // !< \brief factor used in 
correlation
-  std::vector<gr_complex> d_hestimate; // !< channel estimate
-  signed int d_coarse_freq; // !< \brief search distance in number of bins
-  unsigned int d_phase_count;        // !< \brief accumulator for coarse freq 
correction
-  float d_snr_est;  // !< an estimation of the signal to noise ratio
+  std::vector<gr_complex> d_hestimate;  // !< channel estimate
+  signed int d_coarse_freq;             // !< \brief search distance in number 
of bins
+  unsigned int d_phase_count;           // !< \brief accumulator for coarse 
freq correction
+  float d_snr_est;                      // !< an estimation of the signal to 
noise ratio
 
   void forecast(int noutput_items, gr_vector_int &ninput_items_required);
 

Modified: 
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_correlator.i
===================================================================
--- 
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_correlator.i
 2007-06-02 11:55:59 UTC (rev 5602)
+++ 
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_correlator.i
 2007-06-02 15:05:09 UTC (rev 5603)
@@ -1,6 +1,6 @@
 /* -*- c++ -*- */
 /*
- * Copyright 2004,2006 Free Software Foundation, Inc.
+ * Copyright 2006, 2007 Free Software Foundation, Inc.
  * 
  * This file is part of GNU Radio
  * 
@@ -22,23 +22,23 @@
 
 #include <vector>
 
-GR_SWIG_BLOCK_MAGIC(gr,ofdm_correlator)
+GR_SWIG_BLOCK_MAGIC(gr,ofdm_correlator);
 
 gr_ofdm_correlator_sptr 
 gr_make_ofdm_correlator (unsigned int occupied_carriers, 
-                        unsigned int vlen,
+                        unsigned int fft_length,
                         unsigned int cplen,
-                        std::vector<gr_complex> known_symbol1, 
-                        std::vector<gr_complex> known_symbol2);
+                        const std::vector<gr_complex> &known_symbol1, 
+                        const std::vector<gr_complex> &known_symbol2);
 
 class gr_ofdm_correlator : public gr_sync_decimator
 {
  protected:
   gr_ofdm_correlator (unsigned int occupied_carriers,
-                     unsigned int vlen,
+                     unsigned int fft_length,
                      unsigned int cplen,
-                     std::vector<gr_complex> known_symbol1, 
-                     std::vector<gr_complex> known_symbol2);
+                     const std::vector<gr_complex> &known_symbol1, 
+                     const std::vector<gr_complex> &known_symbol2);
 
  public:
   float snr() { return d_snr_est; }





reply via email to

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