[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] r4603 - gnuradio/branches/developers/n4hy/ofdm/gnuradi
From: |
trondeau |
Subject: |
[Commit-gnuradio] r4603 - gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general |
Date: |
Thu, 22 Feb 2007 22:48:13 -0700 (MST) |
Author: trondeau
Date: 2007-02-22 22:48:13 -0700 (Thu, 22 Feb 2007)
New Revision: 4603
Modified:
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_bpsk_demapper.cc
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_bpsk_demapper.h
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_bpsk_demapper.i
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
Log:
clean-up of OFDM code. Equalizes multipath. Correlator to demapper is only
number of occupied tones now.
Modified:
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_bpsk_demapper.cc
===================================================================
---
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_bpsk_demapper.cc
2007-02-23 05:01:20 UTC (rev 4602)
+++
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_bpsk_demapper.cc
2007-02-23 05:48:13 UTC (rev 4603)
@@ -26,21 +26,19 @@
#include <gr_ofdm_bpsk_demapper.h>
#include <gr_io_signature.h>
-#include <vector>
gr_ofdm_bpsk_demapper_sptr
-gr_make_ofdm_bpsk_demapper (unsigned int occupied_carriers, unsigned int vlen)
+gr_make_ofdm_bpsk_demapper (unsigned int occupied_carriers)
{
- return gr_ofdm_bpsk_demapper_sptr (new gr_ofdm_bpsk_demapper
(occupied_carriers, vlen));
+ return gr_ofdm_bpsk_demapper_sptr (new gr_ofdm_bpsk_demapper
(occupied_carriers));
}
-gr_ofdm_bpsk_demapper::gr_ofdm_bpsk_demapper (unsigned occupied_carriers,
unsigned int vlen)
+gr_ofdm_bpsk_demapper::gr_ofdm_bpsk_demapper (unsigned occupied_carriers)
: gr_block ("ofdm_bpsk_demapper",
- gr_make_io_signature (1, 1, sizeof(gr_complex)*vlen),
+ gr_make_io_signature (1, 1, sizeof(gr_complex)*occupied_carriers),
gr_make_io_signature (1, 1, sizeof(unsigned char))),
d_occupied_carriers(occupied_carriers),
- d_vlen(vlen),
- d_byte_offset(0)
+ d_byte_offset(0), d_partial_byte(0)
{
}
@@ -72,14 +70,10 @@
unsigned int i=0, bytes_produced=0;
- int unoccupied_carriers = d_vlen - d_occupied_carriers;
- int zeros_on_left = (int)ceil(unoccupied_carriers/2.0);
- // int zeros_on_right = (int)unoccupied_carriers - zeros_on_left;
+ while(i < d_occupied_carriers) {
- i = zeros_on_left;
- while(i < zeros_on_left+d_occupied_carriers) {
-
- while((d_byte_offset < 8) && (i < zeros_on_left+d_occupied_carriers)) {
+ while((d_byte_offset < 8) && (i < d_occupied_carriers)) {
+ //fprintf(stderr, "%f+j%f\n", in[i].real(), in[i].imag());
d_partial_byte |= slicer(in[i++]) << (d_byte_offset++);
}
Modified:
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_bpsk_demapper.h
===================================================================
---
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_bpsk_demapper.h
2007-02-23 05:01:20 UTC (rev 4602)
+++
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_bpsk_demapper.h
2007-02-23 05:48:13 UTC (rev 4603)
@@ -25,12 +25,13 @@
#include <gr_block.h>
+#include <vector>
class gr_ofdm_bpsk_demapper;
typedef boost::shared_ptr<gr_ofdm_bpsk_demapper> gr_ofdm_bpsk_demapper_sptr;
gr_ofdm_bpsk_demapper_sptr
-gr_make_ofdm_bpsk_demapper (unsigned int occupied_carriers, unsigned int vlen);
+gr_make_ofdm_bpsk_demapper (unsigned int occupied_carriers);
/*!
@@ -41,16 +42,15 @@
class gr_ofdm_bpsk_demapper : public gr_block
{
friend gr_ofdm_bpsk_demapper_sptr
- gr_make_ofdm_bpsk_demapper (unsigned int occupied_carriers, unsigned int
vlen);
+ gr_make_ofdm_bpsk_demapper (unsigned int occupied_carriers);
protected:
- gr_ofdm_bpsk_demapper (unsigned int occupied_carriers, unsigned int vlen);
+ gr_ofdm_bpsk_demapper (unsigned int occupied_carriers);
private:
unsigned char slicer(gr_complex x);
unsigned int d_occupied_carriers;
- unsigned int d_vlen;
unsigned int d_byte_offset;
unsigned char d_partial_byte;
Modified:
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_bpsk_demapper.i
===================================================================
---
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_bpsk_demapper.i
2007-02-23 05:01:20 UTC (rev 4602)
+++
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_bpsk_demapper.i
2007-02-23 05:48:13 UTC (rev 4603)
@@ -20,17 +20,17 @@
* Boston, MA 02110-1301, USA.
*/
+#include <vector>
+
GR_SWIG_BLOCK_MAGIC(gr,ofdm_bpsk_demapper)
gr_ofdm_bpsk_demapper_sptr
-gr_make_ofdm_bpsk_demapper (unsigned int occupied_carriers,
- unsigned int vlen);
+gr_make_ofdm_bpsk_demapper (unsigned int occupied_carriers);
class gr_ofdm_bpsk_demapper : public gr_sync_decimator
{
protected:
- gr_ofdm_bpsk_demapper (unsigned int occupied_carriers,
- unsigned int vlen);
+ gr_ofdm_bpsk_demapper (unsigned int occupied_carriers);
public:
int general_work(int noutput_items,
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-23 05:01:20 UTC (rev 4602)
+++
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_correlator.cc
2007-02-23 05:48:13 UTC (rev 4603)
@@ -27,6 +27,8 @@
#include <gr_ofdm_correlator.h>
#include <gr_io_signature.h>
+#define VERBOSE 1
+
gr_ofdm_correlator_sptr
gr_make_ofdm_correlator (unsigned int occupied_carriers, unsigned int vlen,
std::vector<gr_complex> known_symbol1,
@@ -41,28 +43,21 @@
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)),
+ gr_make_io_signature (1, 1,
sizeof(gr_complex)*occupied_carriers)),
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());
+ d_diff_corr_factor[i] = one / ((*i1) * conj(*i2));
i++;
}
}
@@ -71,11 +66,6 @@
{
}
-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)
{
@@ -85,7 +75,8 @@
}
bool
-gr_ofdm_correlator::correlate(const gr_complex *in, int zeros_on_left)
+gr_ofdm_correlator::correlate(const gr_complex *previous, const gr_complex
*current,
+ int zeros_on_left)
{
unsigned int i = 0;
bool found = false;
@@ -94,49 +85,40 @@
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];
+ h_sqrd = h_sqrd + previous[i+zeros_on_left] *
conj(current[i+zeros_on_left]) * d_diff_corr_factor[i];
+ power = power + norm(current[i+zeros_on_left]);
}
if(h_sqrd.real() > 0.75*power) {
found = true;
}
-
+#if VERBOSE
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));
-
+#endif
return found;
}
void
-gr_ofdm_correlator::calculate_equalizer(const gr_complex *in, int
zeros_on_left)
+gr_ofdm_correlator::calculate_equalizer(const gr_complex *current, 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;
+ //hesttemp = d_known_symbol1[i] / previous[i+zeros_on_left];
+ hesttemp = d_known_symbol2[i] / current[i+zeros_on_left];
d_hestimate[i] = hesttemp;
+#if VERBOSE
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());
+#endif
}
+#if VERBOSE
fprintf(stderr, "\n");
+#endif
}
int
@@ -146,6 +128,9 @@
gr_vector_void_star &output_items)
{
const gr_complex *in = (const gr_complex *)input_items[0];
+ const gr_complex *previous = &in[0];
+ const gr_complex *current = &in[d_vlen];
+
gr_complex *out = (gr_complex *) output_items[0];
unsigned int i=0;
@@ -153,21 +138,15 @@
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);
+ bool corr = correlate(previous, current, zeros_on_left);
if(corr) {
- calculate_equalizer(in, zeros_on_left);
+ calculate_equalizer(current, 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];
+ out[i] = d_hestimate[i]*current[i+zeros_on_left];
}
-#else
- memcpy(out,in,d_vlen*sizeof(gr_complex));
-#endif
-
+
consume_each(1);
return 1;
}
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-23 05:01:20 UTC (rev 4602)
+++
gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general/gr_ofdm_correlator.h
2007-02-23 05:48:13 UTC (rev 4603)
@@ -54,13 +54,12 @@
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);
+ 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);
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;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r4603 - gnuradio/branches/developers/n4hy/ofdm/gnuradio-core/src/lib/general,
trondeau <=