[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] r5703 - gnuradio/branches/features/ofdm/sync/gnuradio-
From: |
trondeau |
Subject: |
[Commit-gnuradio] r5703 - gnuradio/branches/features/ofdm/sync/gnuradio-core/src/lib/general |
Date: |
Tue, 5 Jun 2007 22:38:40 -0600 (MDT) |
Author: trondeau
Date: 2007-06-05 22:38:39 -0600 (Tue, 05 Jun 2007)
New Revision: 5703
Modified:
gnuradio/branches/features/ofdm/sync/gnuradio-core/src/lib/general/gr_ofdm_correlator.cc
gnuradio/branches/features/ofdm/sync/gnuradio-core/src/lib/general/gr_ofdm_correlator.h
gnuradio/branches/features/ofdm/sync/gnuradio-core/src/lib/general/gr_ofdm_correlator.i
Log:
skipping bins in freq search with new sync block that looks +-1. Added look-up
table to do frequency compensation to cut down on cycles spent calculating it
at run-time.
Modified:
gnuradio/branches/features/ofdm/sync/gnuradio-core/src/lib/general/gr_ofdm_correlator.cc
===================================================================
---
gnuradio/branches/features/ofdm/sync/gnuradio-core/src/lib/general/gr_ofdm_correlator.cc
2007-06-06 03:43:51 UTC (rev 5702)
+++
gnuradio/branches/features/ofdm/sync/gnuradio-core/src/lib/general/gr_ofdm_correlator.cc
2007-06-06 04:38:39 UTC (rev 5703)
@@ -30,28 +30,32 @@
#define VERBOSE 0
#define M_TWOPI (2*M_PI)
+#define MAX_NUM_SYMBOLS 1000
gr_ofdm_correlator_sptr
gr_make_ofdm_correlator (unsigned int occupied_carriers, unsigned int
fft_length,
unsigned int cplen,
const std::vector<gr_complex> &known_symbol1,
- const std::vector<gr_complex> &known_symbol2)
+ const std::vector<gr_complex> &known_symbol2,
+ unsigned int max_fft_shift_len)
{
return gr_ofdm_correlator_sptr (new gr_ofdm_correlator (occupied_carriers,
fft_length, cplen,
- known_symbol1,
known_symbol2));
+ known_symbol1,
known_symbol2,
+ max_fft_shift_len));
}
gr_ofdm_correlator::gr_ofdm_correlator (unsigned occupied_carriers, unsigned
int fft_length,
unsigned int cplen,
const std::vector<gr_complex>
&known_symbol1,
- const std::vector<gr_complex>
&known_symbol2)
+ const std::vector<gr_complex>
&known_symbol2,
+ unsigned int max_fft_shift_len)
: gr_block ("ofdm_correlator",
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_fft_length(fft_length),
d_cplen(cplen),
- d_freq_shift_len(5),
+ d_freq_shift_len(max_fft_shift_len),
d_known_symbol1(known_symbol1),
d_known_symbol2(known_symbol2),
d_coarse_freq(0),
@@ -62,16 +66,24 @@
std::vector<gr_complex>::iterator i1, i2;
- int i = 0;
+ unsigned int i = 0, j = 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++) {
d_diff_corr_factor[i] = one / ((*i1) * conj(*i2));
i++;
}
+
+ d_phase_lut = new gr_complex[(2*d_freq_shift_len+1) * MAX_NUM_SYMBOLS];
+ for(i = 0; i <= 2*d_freq_shift_len; i++) {
+ for(j = 0; j < MAX_NUM_SYMBOLS; j++) {
+ d_phase_lut[j + i*MAX_NUM_SYMBOLS] =
gr_expj(-M_TWOPI*d_cplen/d_fft_length*(i-d_freq_shift_len)*j);
+ }
+ }
}
gr_ofdm_correlator::~gr_ofdm_correlator(void)
{
+ delete [] d_phase_lut;
}
void
@@ -87,7 +99,12 @@
{
// 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);
+ //return gr_expj(-M_TWOPI*freq_delta*d_cplen/d_fft_length*symbol_count);
+
+ assert(d_freq_shift_len + freq_delta >= 0);
+ assert(symbol_count <= MAX_NUM_SYMBOLS);
+
+ return d_phase_lut[MAX_NUM_SYMBOLS * (d_freq_shift_len + freq_delta) +
symbol_count];
}
bool
@@ -139,7 +156,7 @@
}
else {
if(search_delta <= 0)
- search_delta = (-search_delta) + 1;
+ search_delta = (-search_delta) + 2;
else
search_delta = -search_delta;
}
Modified:
gnuradio/branches/features/ofdm/sync/gnuradio-core/src/lib/general/gr_ofdm_correlator.h
===================================================================
---
gnuradio/branches/features/ofdm/sync/gnuradio-core/src/lib/general/gr_ofdm_correlator.h
2007-06-06 03:43:51 UTC (rev 5702)
+++
gnuradio/branches/features/ofdm/sync/gnuradio-core/src/lib/general/gr_ofdm_correlator.h
2007-06-06 04:38:39 UTC (rev 5703)
@@ -34,7 +34,8 @@
gr_make_ofdm_correlator (unsigned int occupied_carriers, unsigned int
fft_length,
unsigned int cplen,
const std::vector<gr_complex> &known_symbol1,
- const std::vector<gr_complex> &known_symbol2);
+ const std::vector<gr_complex> &known_symbol2,
+ unsigned int max_fft_shift_len=4);
/*!
* \brief take a vector of complex constellation points in from an FFT
@@ -65,18 +66,21 @@
* start of a frame after known_symbol1 (usually
a BPSK PN sequence).
* Both of these start symbols are differentially
correlated to compensate
* for phase changes between symbols.
+ * \param max_fft_shift_len Set's the maximum distance you can look
between bins for correlation
*/
friend gr_ofdm_correlator_sptr
gr_make_ofdm_correlator (unsigned int occupied_carriers, unsigned int
fft_length,
unsigned int cplen,
const std::vector<gr_complex> &known_symbol1,
- const std::vector<gr_complex> &known_symbol2);
+ const std::vector<gr_complex> &known_symbol2,
+ unsigned int max_fft_shift_len);
protected:
gr_ofdm_correlator (unsigned int occupied_carriers, unsigned int fft_length,
unsigned int cplen,
const std::vector<gr_complex> &known_symbol1,
- const std::vector<gr_complex> &known_symbol2);
+ const std::vector<gr_complex> &known_symbol2,
+ unsigned int max_fft_shift_len);
private:
unsigned char slicer(gr_complex x);
@@ -96,6 +100,8 @@
unsigned int d_phase_count; // !< \brief accumulator for coarse
freq correction
float d_snr_est; // !< an estimation of the signal to
noise ratio
+ gr_complex *d_phase_lut; // !< look-up table for coarse frequency
compensation
+
void forecast(int noutput_items, gr_vector_int &ninput_items_required);
public:
Modified:
gnuradio/branches/features/ofdm/sync/gnuradio-core/src/lib/general/gr_ofdm_correlator.i
===================================================================
---
gnuradio/branches/features/ofdm/sync/gnuradio-core/src/lib/general/gr_ofdm_correlator.i
2007-06-06 03:43:51 UTC (rev 5702)
+++
gnuradio/branches/features/ofdm/sync/gnuradio-core/src/lib/general/gr_ofdm_correlator.i
2007-06-06 04:38:39 UTC (rev 5703)
@@ -29,7 +29,8 @@
unsigned int fft_length,
unsigned int cplen,
const std::vector<gr_complex> &known_symbol1,
- const std::vector<gr_complex> &known_symbol2);
+ const std::vector<gr_complex> &known_symbol2,
+ unsigned int max_fft_shift_len=4);
class gr_ofdm_correlator : public gr_sync_decimator
{
@@ -38,7 +39,8 @@
unsigned int fft_length,
unsigned int cplen,
const std::vector<gr_complex> &known_symbol1,
- const std::vector<gr_complex> &known_symbol2);
+ const std::vector<gr_complex> &known_symbol2,
+ unsigned int max_fft_shift_len);
public:
float snr() { return d_snr_est; }
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r5703 - gnuradio/branches/features/ofdm/sync/gnuradio-core/src/lib/general,
trondeau <=