commit-gnuradio
[Top][All Lists]
Advanced

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

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


From: trondeau
Subject: [Commit-gnuradio] r4659 - gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general
Date: Tue, 27 Feb 2007 08:26:44 -0700 (MST)

Author: trondeau
Date: 2007-02-27 08:26:44 -0700 (Tue, 27 Feb 2007)
New Revision: 4659

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.h
   
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_correlator.i
Log:
updates correlator to use multiple signals and estimation of SNR

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-27 15:24:07 UTC (rev 4658)
+++ 
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_correlator.cc
  2007-02-27 15:26:44 UTC (rev 4659)
@@ -27,7 +27,7 @@
 #include <gr_ofdm_correlator.h>
 #include <gr_io_signature.h>
 
-#define VERBOSE   0
+#define VERBOSE 0
 #define M_TWOPI (2*M_PI)
 
 gr_ofdm_correlator_sptr
@@ -119,7 +119,11 @@
       found = true;
       d_coarse_freq = search_delta;
       d_phase_count = 1;
-      printf("found at search delta: %d\n", search_delta);
+      d_snr_est = 10*log10(power/(power-h_sqrd.real()));
+
+      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);
       break;
     }
     else {
@@ -133,18 +137,20 @@
 }
 
 void
-gr_ofdm_correlator::calculate_equalizer(const gr_complex *current, int 
zeros_on_left)
+gr_ofdm_correlator::calculate_equalizer(const gr_complex *previous, const 
gr_complex *current, 
+                                       int zeros_on_left)
 {
   unsigned int i=0;
-  gr_complex hesttemp;
 
   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] / previous[i+zeros_on_left];
-    hesttemp = d_known_symbol2[i] / 
(coarse_freq_comp(d_coarse_freq,1)*current[i+zeros_on_left+d_coarse_freq]);
+    //d_hestimate[i] = 0.5F * (d_known_symbol1[i] / previous[i+zeros_on_left] +
+    //                     d_known_symbol2[i] / 
(coarse_freq_comp(d_coarse_freq,1)*
+    //                                           
current[i+zeros_on_left+d_coarse_freq]));
+    d_hestimate[i] = 0.5F * (d_known_symbol1[i] / 
previous[i+zeros_on_left+d_coarse_freq] +
+                            d_known_symbol2[i] / 
(coarse_freq_comp(d_coarse_freq,1)*
+                                                  
current[i+zeros_on_left+d_coarse_freq]));
     
-    d_hestimate[i] = hesttemp;
-
 #if VERBOSE
     fprintf(stderr, "%f %f ", d_hestimate[i].real(), d_hestimate[i].imag());
 #endif
@@ -173,7 +179,7 @@
 
   bool corr = correlate(previous, current, zeros_on_left);
   if(corr) {
-    calculate_equalizer(current, zeros_on_left);
+    calculate_equalizer(previous, current, zeros_on_left);
   }
 
   for(i = 0; i < d_occupied_carriers; i++) {

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-27 15:24:07 UTC (rev 4658)
+++ 
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_correlator.h
   2007-02-27 15:26:44 UTC (rev 4659)
@@ -81,7 +81,8 @@
  private:
   unsigned char slicer(gr_complex x);
   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);
+  void calculate_equalizer(const gr_complex *previous, 
+                          const gr_complex *current, int zeros_on_left);
   gr_complex coarse_freq_comp(int freq_delta, int count);
   
   unsigned int d_occupied_carriers;  // !< \brief number of subcarriers with 
data
@@ -93,10 +94,16 @@
   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);
 
  public:
+  /*!
+   * \brief Return an estimate of the SNR of the channel
+   */
+  float snr() { return d_snr_est; }
+
   ~gr_ofdm_correlator(void);
   int general_work(int noutput_items,
                   gr_vector_int &ninput_items,

Modified: 
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_correlator.i
===================================================================
--- 
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_correlator.i
   2007-02-27 15:24:07 UTC (rev 4658)
+++ 
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_correlator.i
   2007-02-27 15:26:44 UTC (rev 4659)
@@ -40,10 +40,8 @@
                      std::vector<gr_complex> known_symbol1, 
                      std::vector<gr_complex> known_symbol2);
 
-  bool correlate(const gr_complex *in);
-  void equalize(const gr_complex *in);
-
  public:
+  float snr() { return d_snr_est; }
   int general_work(int noutput_items,
                   gr_vector_int &ninput_items,
                   gr_vector_const_void_star &input_items,





reply via email to

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