[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] r5603 - gnuradio/branches/features/ofdm/receiver/gnura
From: |
trondeau |
Subject: |
[Commit-gnuradio] r5603 - gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general |
Date: |
Sat, 2 Jun 2007 09:05:10 -0600 (MDT) |
Author: trondeau
Date: 2007-06-02 09:05:09 -0600 (Sat, 02 Jun 2007)
New Revision: 5603
Modified:
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_correlator.cc
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_correlator.h
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_correlator.i
Log:
cleaning up ofdm_correlator code
Modified:
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_correlator.cc
===================================================================
---
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_correlator.cc
2007-06-02 11:55:59 UTC (rev 5602)
+++
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_correlator.cc
2007-06-02 15:05:09 UTC (rev 5603)
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2006 Free Software Foundation, Inc.
+ * Copyright 2006, 2007 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -26,29 +26,30 @@
#include <gr_ofdm_correlator.h>
#include <gr_io_signature.h>
+#include <gr_expj.h>
#define VERBOSE 0
#define M_TWOPI (2*M_PI)
gr_ofdm_correlator_sptr
-gr_make_ofdm_correlator (unsigned int occupied_carriers, unsigned int vlen,
+gr_make_ofdm_correlator (unsigned int occupied_carriers, unsigned int
fft_length,
unsigned int cplen,
- std::vector<gr_complex> known_symbol1,
- std::vector<gr_complex> known_symbol2)
+ const std::vector<gr_complex> &known_symbol1,
+ const std::vector<gr_complex> &known_symbol2)
{
- return gr_ofdm_correlator_sptr (new gr_ofdm_correlator (occupied_carriers,
vlen, cplen,
+ return gr_ofdm_correlator_sptr (new gr_ofdm_correlator (occupied_carriers,
fft_length, cplen,
known_symbol1,
known_symbol2));
}
-gr_ofdm_correlator::gr_ofdm_correlator (unsigned occupied_carriers, unsigned
int vlen,
+gr_ofdm_correlator::gr_ofdm_correlator (unsigned occupied_carriers, unsigned
int fft_length,
unsigned int cplen,
- std::vector<gr_complex> known_symbol1,
- std::vector<gr_complex> known_symbol2)
+ const std::vector<gr_complex>
&known_symbol1,
+ const 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)*fft_length),
gr_make_io_signature2 (2, 2,
sizeof(gr_complex)*occupied_carriers, sizeof(char))),
d_occupied_carriers(occupied_carriers),
- d_vlen(vlen),
+ d_fft_length(fft_length),
d_cplen(cplen),
d_freq_shift_len(5),
d_known_symbol1(known_symbol1),
@@ -84,8 +85,9 @@
gr_complex
gr_ofdm_correlator::coarse_freq_comp(int freq_delta, int symbol_count)
{
- return gr_complex(cos(-M_TWOPI*freq_delta*d_cplen/d_vlen*symbol_count),
- sin(-M_TWOPI*freq_delta*d_cplen/d_vlen*symbol_count));
+ // 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);
}
bool
@@ -99,7 +101,7 @@
gr_complex h_sqrd = gr_complex(0.0,0.0);
float power = 0.0F;
- while(!found && (abs(search_delta) < d_freq_shift_len)) {
+ while(!found && ((unsigned)abs(search_delta) < d_freq_shift_len)) {
h_sqrd = gr_complex(0.0,0.0);
power = 0.0F;
@@ -115,13 +117,21 @@
search_delta, h_sqrd.real(), h_sqrd.imag(), power,
h_sqrd.real()/power, arg(h_sqrd));
#endif
+ // FIXME: Look at h_sqrd.read() > power
if((h_sqrd.real() > 0.82*power) && (h_sqrd.real() < 1.1 * power)) {
found = true;
d_coarse_freq = search_delta;
d_phase_count = 1;
//d_snr_est = 10*log10(power/(power-h_sqrd.real()));
- d_snr_est = 10*log10(fabs(h_sqrd.real()/h_sqrd.imag()));
+ // check for low noise power; sets maximum SNR at 100 dB
+ if(fabs(h_sqrd.imag()) <= 1e-12) {
+ d_snr_est = 100.0;
+ }
+ else {
+ d_snr_est = 10*log10(fabs(h_sqrd.real()/h_sqrd.imag()));
+ }
+
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);
@@ -169,14 +179,14 @@
{
const gr_complex *in = (const gr_complex *)input_items[0];
const gr_complex *previous = &in[0];
- const gr_complex *current = &in[d_vlen];
+ const gr_complex *current = &in[d_fft_length];
gr_complex *out = (gr_complex *) output_items[0];
char *sig = (char *) output_items[1];
unsigned int i=0;
- int unoccupied_carriers = d_vlen - d_occupied_carriers;
+ int unoccupied_carriers = d_fft_length - d_occupied_carriers;
int zeros_on_left = (int)ceil(unoccupied_carriers/2.0);
bool corr = correlate(previous, current, zeros_on_left);
@@ -190,8 +200,6 @@
for(i = 0; i < d_occupied_carriers; i++) {
out[i] =
d_hestimate[i]*coarse_freq_comp(d_coarse_freq,d_phase_count)*current[i+zeros_on_left+d_coarse_freq];
- //out[i] =
coarse_freq_comp(d_coarse_freq,d_phase_count)*current[i+zeros_on_left+d_coarse_freq];
- //out[i] = current[i+zeros_on_left+d_coarse_freq];
}
Modified:
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_correlator.h
===================================================================
---
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_correlator.h
2007-06-02 11:55:59 UTC (rev 5602)
+++
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_correlator.h
2007-06-02 15:05:09 UTC (rev 5603)
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2006 Free Software Foundation, Inc.
+ * Copyright 2006, 2007 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -31,10 +31,10 @@
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,
+gr_make_ofdm_correlator (unsigned int occupied_carriers, unsigned int
fft_length,
unsigned int cplen,
- std::vector<gr_complex> known_symbol1,
- std::vector<gr_complex> known_symbol2);
+ const std::vector<gr_complex> &known_symbol1,
+ const std::vector<gr_complex> &known_symbol2);
/*!
* \brief take a vector of complex constellation points in from an FFT
@@ -48,7 +48,7 @@
* been corrected and that the samples fall in the middle of one FFT bin.
*
* It then uses one of those known
- * symbosl to estimate the channel response overa all subcarriers and does a
simple
+ * symbols to estimate the channel response over all subcarriers and does a
simple
* 1-tap equalization on all subcarriers. This corrects for the phase and
amplitude
* distortion caused by the channel.
*/
@@ -58,7 +58,7 @@
/*!
* \brief Build an OFDM correlator and equalizer.
* \param occupied_carriers The number of subcarriers with data in the
received symbol
- * \param vlen The size of the FFT vector (occupied_carriers
+ unused carriers)
+ * \param fft_length The size of the FFT vector (occupied_carriers
+ unused carriers)
* \param known_symbol1 A vector of complex numbers representing a
known symbol at the
* start of a frame (usually a BPSK PN sequence)
* \param known_symbol2 A vector of complex numbers representing a
known symbol at the
@@ -67,16 +67,16 @@
* for phase changes between symbols.
*/
friend gr_ofdm_correlator_sptr
- gr_make_ofdm_correlator (unsigned int occupied_carriers, unsigned int vlen,
+ gr_make_ofdm_correlator (unsigned int occupied_carriers, unsigned int
fft_length,
unsigned int cplen,
- std::vector<gr_complex> known_symbol1,
- std::vector<gr_complex> known_symbol2);
+ const std::vector<gr_complex> &known_symbol1,
+ const std::vector<gr_complex> &known_symbol2);
protected:
- gr_ofdm_correlator (unsigned int occupied_carriers, unsigned int vlen,
+ gr_ofdm_correlator (unsigned int occupied_carriers, unsigned int fft_length,
unsigned int cplen,
- std::vector<gr_complex> known_symbol1,
- std::vector<gr_complex> known_symbol2);
+ const std::vector<gr_complex> &known_symbol1,
+ const std::vector<gr_complex> &known_symbol2);
private:
unsigned char slicer(gr_complex x);
@@ -86,15 +86,15 @@
gr_complex coarse_freq_comp(int freq_delta, int count);
unsigned int d_occupied_carriers; // !< \brief number of subcarriers with
data
- unsigned int d_vlen; // !< \brief length of FFT vector
+ unsigned int d_fft_length; // !< \brief length of FFT vector
unsigned int d_cplen; // !< \brief length of cyclic prefix in
samples
unsigned int d_freq_shift_len; // !< \brief number of surrounding bins
to look at for correlation
std::vector<gr_complex> d_known_symbol1, d_known_symbol2; // !< \brief known
symbols at start of frame
std::vector<gr_complex> d_diff_corr_factor; // !< \brief factor used in
correlation
- 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
+ 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);
Modified:
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_correlator.i
===================================================================
---
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_correlator.i
2007-06-02 11:55:59 UTC (rev 5602)
+++
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_correlator.i
2007-06-02 15:05:09 UTC (rev 5603)
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2004,2006 Free Software Foundation, Inc.
+ * Copyright 2006, 2007 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -22,23 +22,23 @@
#include <vector>
-GR_SWIG_BLOCK_MAGIC(gr,ofdm_correlator)
+GR_SWIG_BLOCK_MAGIC(gr,ofdm_correlator);
gr_ofdm_correlator_sptr
gr_make_ofdm_correlator (unsigned int occupied_carriers,
- unsigned int vlen,
+ unsigned int fft_length,
unsigned int cplen,
- std::vector<gr_complex> known_symbol1,
- std::vector<gr_complex> known_symbol2);
+ const std::vector<gr_complex> &known_symbol1,
+ const 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,
+ unsigned int fft_length,
unsigned int cplen,
- std::vector<gr_complex> known_symbol1,
- std::vector<gr_complex> known_symbol2);
+ const std::vector<gr_complex> &known_symbol1,
+ const std::vector<gr_complex> &known_symbol2);
public:
float snr() { return d_snr_est; }
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r5603 - gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general,
trondeau <=