[Top][All Lists]
[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);
+};
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r4602 - gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general,
trondeau <=