commit-gnuradio
[Top][All Lists]
Advanced

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

[Commit-gnuradio] r5703 - gnuradio/branches/features/ofdm/sync/gnuradio-


From: trondeau
Subject: [Commit-gnuradio] r5703 - gnuradio/branches/features/ofdm/sync/gnuradio-core/src/lib/general
Date: Tue, 5 Jun 2007 22:38:40 -0600 (MDT)

Author: trondeau
Date: 2007-06-05 22:38:39 -0600 (Tue, 05 Jun 2007)
New Revision: 5703

Modified:
   
gnuradio/branches/features/ofdm/sync/gnuradio-core/src/lib/general/gr_ofdm_correlator.cc
   
gnuradio/branches/features/ofdm/sync/gnuradio-core/src/lib/general/gr_ofdm_correlator.h
   
gnuradio/branches/features/ofdm/sync/gnuradio-core/src/lib/general/gr_ofdm_correlator.i
Log:
skipping bins in freq search with new sync block that looks +-1. Added look-up 
table to do frequency compensation to cut down on cycles spent calculating it 
at run-time.

Modified: 
gnuradio/branches/features/ofdm/sync/gnuradio-core/src/lib/general/gr_ofdm_correlator.cc
===================================================================
--- 
gnuradio/branches/features/ofdm/sync/gnuradio-core/src/lib/general/gr_ofdm_correlator.cc
    2007-06-06 03:43:51 UTC (rev 5702)
+++ 
gnuradio/branches/features/ofdm/sync/gnuradio-core/src/lib/general/gr_ofdm_correlator.cc
    2007-06-06 04:38:39 UTC (rev 5703)
@@ -30,28 +30,32 @@
 
 #define VERBOSE 0
 #define M_TWOPI (2*M_PI)
+#define MAX_NUM_SYMBOLS 1000
 
 gr_ofdm_correlator_sptr
 gr_make_ofdm_correlator (unsigned int occupied_carriers, unsigned int 
fft_length, 
                         unsigned int cplen,
                         const std::vector<gr_complex> &known_symbol1, 
-                        const std::vector<gr_complex> &known_symbol2)
+                        const std::vector<gr_complex> &known_symbol2,
+                        unsigned int max_fft_shift_len)
 {
   return gr_ofdm_correlator_sptr (new gr_ofdm_correlator (occupied_carriers, 
fft_length, cplen,
-                                                         known_symbol1, 
known_symbol2));
+                                                         known_symbol1, 
known_symbol2,
+                                                         max_fft_shift_len));
 }
 
 gr_ofdm_correlator::gr_ofdm_correlator (unsigned occupied_carriers, unsigned 
int fft_length, 
                                        unsigned int cplen,
                                        const std::vector<gr_complex> 
&known_symbol1, 
-                                       const std::vector<gr_complex> 
&known_symbol2)
+                                       const std::vector<gr_complex> 
&known_symbol2,
+                                       unsigned int max_fft_shift_len)
   : gr_block ("ofdm_correlator",
              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_fft_length(fft_length),
     d_cplen(cplen),
-    d_freq_shift_len(5),
+    d_freq_shift_len(max_fft_shift_len),
     d_known_symbol1(known_symbol1),
     d_known_symbol2(known_symbol2),
     d_coarse_freq(0),
@@ -62,16 +66,24 @@
 
   std::vector<gr_complex>::iterator i1, i2;
 
-  int i = 0;
+  unsigned int i = 0, j = 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++) {
     d_diff_corr_factor[i] = one / ((*i1) * conj(*i2));
     i++;
   }
+  
+  d_phase_lut = new gr_complex[(2*d_freq_shift_len+1) * MAX_NUM_SYMBOLS];
+  for(i = 0; i <= 2*d_freq_shift_len; i++) {
+    for(j = 0; j < MAX_NUM_SYMBOLS; j++) {
+      d_phase_lut[j + i*MAX_NUM_SYMBOLS] =  
gr_expj(-M_TWOPI*d_cplen/d_fft_length*(i-d_freq_shift_len)*j);
+    }
+  }
 }
 
 gr_ofdm_correlator::~gr_ofdm_correlator(void)
 {
+  delete [] d_phase_lut;
 }
 
 void
@@ -87,7 +99,12 @@
 {
   //  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);
+  //return gr_expj(-M_TWOPI*freq_delta*d_cplen/d_fft_length*symbol_count);
+
+  assert(d_freq_shift_len + freq_delta >= 0);
+  assert(symbol_count <= MAX_NUM_SYMBOLS);
+
+  return d_phase_lut[MAX_NUM_SYMBOLS * (d_freq_shift_len + freq_delta) + 
symbol_count];
 }
 
 bool
@@ -139,7 +156,7 @@
     }
     else {
       if(search_delta <= 0)
-       search_delta = (-search_delta) + 1;
+       search_delta = (-search_delta) + 2;
       else
        search_delta = -search_delta;
     }

Modified: 
gnuradio/branches/features/ofdm/sync/gnuradio-core/src/lib/general/gr_ofdm_correlator.h
===================================================================
--- 
gnuradio/branches/features/ofdm/sync/gnuradio-core/src/lib/general/gr_ofdm_correlator.h
     2007-06-06 03:43:51 UTC (rev 5702)
+++ 
gnuradio/branches/features/ofdm/sync/gnuradio-core/src/lib/general/gr_ofdm_correlator.h
     2007-06-06 04:38:39 UTC (rev 5703)
@@ -34,7 +34,8 @@
 gr_make_ofdm_correlator (unsigned int occupied_carriers, unsigned int 
fft_length,
                         unsigned int cplen,
                         const std::vector<gr_complex> &known_symbol1, 
-                        const std::vector<gr_complex> &known_symbol2);
+                        const std::vector<gr_complex> &known_symbol2,
+                        unsigned int max_fft_shift_len=4);
 
 /*!
  * \brief take a vector of complex constellation points in from an FFT
@@ -65,18 +66,21 @@
    *                            start of a frame after known_symbol1 (usually 
a BPSK PN sequence). 
    *                            Both of these start symbols are differentially 
correlated to compensate
    *                            for phase changes between symbols. 
+   * \param max_fft_shift_len   Set's the maximum distance you can look 
between bins for correlation
    */
   friend gr_ofdm_correlator_sptr
   gr_make_ofdm_correlator (unsigned int occupied_carriers, unsigned int 
fft_length,
                           unsigned int cplen,
                           const std::vector<gr_complex> &known_symbol1, 
-                          const std::vector<gr_complex> &known_symbol2);
+                          const std::vector<gr_complex> &known_symbol2,
+                          unsigned int max_fft_shift_len);
   
  protected:
   gr_ofdm_correlator (unsigned int occupied_carriers, unsigned int fft_length,
                      unsigned int cplen,
                      const std::vector<gr_complex> &known_symbol1, 
-                     const std::vector<gr_complex> &known_symbol2);
+                     const std::vector<gr_complex> &known_symbol2,
+                     unsigned int max_fft_shift_len);
   
  private:
   unsigned char slicer(gr_complex x);
@@ -96,6 +100,8 @@
   unsigned int d_phase_count;           // !< \brief accumulator for coarse 
freq correction
   float d_snr_est;                      // !< an estimation of the signal to 
noise ratio
 
+  gr_complex *d_phase_lut;  // !< look-up table for coarse frequency 
compensation
+
   void forecast(int noutput_items, gr_vector_int &ninput_items_required);
 
  public:

Modified: 
gnuradio/branches/features/ofdm/sync/gnuradio-core/src/lib/general/gr_ofdm_correlator.i
===================================================================
--- 
gnuradio/branches/features/ofdm/sync/gnuradio-core/src/lib/general/gr_ofdm_correlator.i
     2007-06-06 03:43:51 UTC (rev 5702)
+++ 
gnuradio/branches/features/ofdm/sync/gnuradio-core/src/lib/general/gr_ofdm_correlator.i
     2007-06-06 04:38:39 UTC (rev 5703)
@@ -29,7 +29,8 @@
                         unsigned int fft_length,
                         unsigned int cplen,
                         const std::vector<gr_complex> &known_symbol1, 
-                        const std::vector<gr_complex> &known_symbol2);
+                        const std::vector<gr_complex> &known_symbol2,
+                        unsigned int max_fft_shift_len=4);
 
 class gr_ofdm_correlator : public gr_sync_decimator
 {
@@ -38,7 +39,8 @@
                      unsigned int fft_length,
                      unsigned int cplen,
                      const std::vector<gr_complex> &known_symbol1, 
-                     const std::vector<gr_complex> &known_symbol2);
+                     const std::vector<gr_complex> &known_symbol2,
+                     unsigned int max_fft_shift_len);
 
  public:
   float snr() { return d_snr_est; }





reply via email to

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