commit-gnuradio
[Top][All Lists]
Advanced

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

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


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

Author: trondeau
Date: 2007-02-22 22:01:20 -0700 (Thu, 22 Feb 2007)
New Revision: 4602

Added:
   
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
Modified:
   
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/Makefile.am
   
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/general.i
Log:
now properly correlates to pair of known symbols, does basic equalization


Modified: 
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/Makefile.am
===================================================================
--- 
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/Makefile.am
    2007-02-23 04:59:29 UTC (rev 4601)
+++ 
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/Makefile.am
    2007-02-23 05:01:20 UTC (rev 4602)
@@ -92,6 +92,7 @@
        gr_nop.cc                       \
        gr_null_sink.cc                 \
        gr_null_source.cc               \
+       gr_ofdm_correlator.cc           \
         gr_ofdm_cyclic_prefixer.cc      \
         gr_ofdm_demapper_vcb.cc         \
         gr_ofdm_mapper_bcv.cc           \
@@ -221,6 +222,7 @@
        gr_nop.h                        \
        gr_null_sink.h                  \
        gr_null_source.h                \
+       gr_ofdm_correlator.h            \
         gr_ofdm_cyclic_prefixer.h       \
         gr_ofdm_demapper_vcb.h          \
         gr_ofdm_mapper_bcv.h            \
@@ -351,6 +353,7 @@
        gr_nop.i                        \
        gr_null_sink.i                  \
        gr_null_source.i                \
+       gr_ofdm_correlator.i            \
         gr_ofdm_cyclic_prefixer.i       \
         gr_ofdm_demapper_vcb.i          \
         gr_ofdm_mapper_bcv.i            \

Modified: 
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/general.i
===================================================================
--- 
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/general.i  
    2007-02-23 04:59:29 UTC (rev 4601)
+++ 
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/general.i  
    2007-02-23 05:01:20 UTC (rev 4602)
@@ -88,6 +88,7 @@
 #include <gr_probe_avg_mag_sqrd_c.h>
 #include <gr_probe_avg_mag_sqrd_f.h>
 #include <gr_probe_signal_f.h>
+#include <gr_ofdm_correlator.h>
 #include <gr_ofdm_cyclic_prefixer.h>
 #include <gr_ofdm_bpsk_demapper.h>
 #include <gr_ofdm_bpsk_mapper.h>
@@ -182,6 +183,7 @@
 %include "gr_probe_avg_mag_sqrd_c.i"
 %include "gr_probe_avg_mag_sqrd_f.i"
 %include "gr_probe_signal_f.i"
+%include "gr_ofdm_correlator.i"
 %include "gr_ofdm_cyclic_prefixer.i"
 %include "gr_ofdm_bpsk_demapper.i"
 %include "gr_ofdm_bpsk_mapper.i"

Added: 
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
                          (rev 0)
+++ 
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_correlator.cc
  2007-02-23 05:01:20 UTC (rev 4602)
@@ -0,0 +1,173 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2006 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gr_ofdm_correlator.h>
+#include <gr_io_signature.h>
+
+gr_ofdm_correlator_sptr
+gr_make_ofdm_correlator (unsigned int occupied_carriers, unsigned int vlen,
+                        std::vector<gr_complex> known_symbol1, 
+                        std::vector<gr_complex> known_symbol2)
+{
+  return gr_ofdm_correlator_sptr (new gr_ofdm_correlator (occupied_carriers, 
vlen,
+                                                         known_symbol1, 
known_symbol2));
+}
+
+gr_ofdm_correlator::gr_ofdm_correlator (unsigned occupied_carriers, unsigned 
int vlen,
+                                       std::vector<gr_complex> known_symbol1, 
+                                       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)),
+    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());
+    i++;
+  }
+}
+
+gr_ofdm_correlator::~gr_ofdm_correlator(void)
+{
+}
+
+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)
+{
+  unsigned ninputs = ninput_items_required.size ();
+  for (unsigned i = 0; i < ninputs; i++)
+    ninput_items_required[i] = 2;
+}
+
+bool
+gr_ofdm_correlator::correlate(const gr_complex *in, int zeros_on_left)
+{
+  unsigned int i = 0;
+  bool found = false;
+
+  gr_complex h_sqrd = gr_complex(0.0,0.0);
+  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]; 
+  }
+
+  if(h_sqrd.real() > 0.75*power) {
+    found = true;
+  }
+  
+  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)); 
+
+  return found;
+}
+
+void
+gr_ofdm_correlator::calculate_equalizer(const gr_complex *in, 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;
+    
+    d_hestimate[i] = hesttemp;
+
+    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());
+  }
+  fprintf(stderr, "\n");
+}
+
+int
+gr_ofdm_correlator::general_work(int noutput_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];
+  
+  unsigned int i=0;
+
+  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);
+  if(corr) {
+    calculate_equalizer(in, 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];
+  }
+#else
+  memcpy(out,in,d_vlen*sizeof(gr_complex));
+#endif
+
+  consume_each(1);
+  return 1;
+}

Added: 
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
                           (rev 0)
+++ 
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_correlator.h
   2007-02-23 05:01:20 UTC (rev 4602)
@@ -0,0 +1,78 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2006 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef INCLUDED_GR_OFDM_CORRELATOR_H
+#define INCLUDED_GR_OFDM_CORRELATOR_H
+
+
+#include <gr_block.h>
+#include <vector>
+
+class gr_ofdm_correlator;
+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,
+                        std::vector<gr_complex> known_symbol1, 
+                        std::vector<gr_complex> known_symbol2);
+
+/*!
+ * \brief take a vector of complex constellation points in from an FFT
+ * and demodulate to a stream of bits. Simple BPSK version.
+ */
+
+class gr_ofdm_correlator : public gr_block
+{
+  friend gr_ofdm_correlator_sptr
+    gr_make_ofdm_correlator (unsigned int occupied_carriers, unsigned int vlen,
+                            std::vector<gr_complex> known_symbol1, 
+                            std::vector<gr_complex> known_symbol2);
+  
+ protected:
+  gr_ofdm_correlator (unsigned int occupied_carriers, unsigned int vlen,
+                     std::vector<gr_complex> known_symbol1, 
+                     std::vector<gr_complex> known_symbol2);
+  
+ 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);
+
+  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;
+
+  void forecast(int noutput_items, gr_vector_int &ninput_items_required);
+
+ public:
+  ~gr_ofdm_correlator(void);
+  int general_work(int noutput_items,
+                  gr_vector_int &ninput_items,
+                  gr_vector_const_void_star &input_items,
+                  gr_vector_void_star &output_items);
+};
+
+
+#endif

Added: 
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
                           (rev 0)
+++ 
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_correlator.i
   2007-02-23 05:01:20 UTC (rev 4602)
@@ -0,0 +1,49 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2006 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include <vector>
+
+GR_SWIG_BLOCK_MAGIC(gr,ofdm_correlator)
+
+gr_ofdm_correlator_sptr 
+gr_make_ofdm_correlator (unsigned int occupied_carriers, 
+                        unsigned int vlen,
+                        std::vector<gr_complex> known_symbol1, 
+                        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,
+                     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:
+  int general_work(int noutput_items,
+                  gr_vector_int &ninput_items,
+                  gr_vector_const_void_star &input_items,
+                  gr_vector_void_star &output_items);
+};





reply via email to

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