[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] r7105 - in gnuradio/branches/developers/trondeau/ofdm2
From: |
trondeau |
Subject: |
[Commit-gnuradio] r7105 - in gnuradio/branches/developers/trondeau/ofdm2: gnuradio-core/src/lib/general gnuradio-core/src/lib/gengen gnuradio-core/src/python/gnuradio/blks2impl gnuradio-examples/python/ofdm |
Date: |
Tue, 11 Dec 2007 13:49:42 -0700 (MST) |
Author: trondeau
Date: 2007-12-11 13:49:38 -0700 (Tue, 11 Dec 2007)
New Revision: 7105
Modified:
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.cc
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.h
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/lib/gengen/gr_threshold_detector_XX.cc.t
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/lib/gengen/gr_threshold_detector_XX.h.t
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/lib/gengen/gr_threshold_detector_XX.i.t
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/python/gnuradio/blks2impl/Makefile.am
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/python/gnuradio/blks2impl/ofdm.py
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/python/gnuradio/blks2impl/ofdm_receiver.py
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/python/gnuradio/blks2impl/ofdm_sync_ml.py
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/python/gnuradio/blks2impl/ofdm_sync_pnac.py
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-examples/python/ofdm/benchmark_ofdm_rx.py
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-examples/python/ofdm/benchmark_ofdm_tx.py
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-examples/python/ofdm/plot_ofdm.m
Log:
I think this finishes the conversion to heir_block2 structures, though the tx
and rx scripts need testing with a USRP. Should complete ticket:188. Also adds
an output from the ofdm frame sink of the derotated symbols.
Modified:
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.cc
===================================================================
---
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.cc
2007-12-11 16:21:51 UTC (rev 7104)
+++
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.cc
2007-12-11 20:49:38 UTC (rev 7105)
@@ -116,6 +116,16 @@
while((d_byte_offset < 8) && (i < d_occupied_carriers)) {
gr_complex sigrot = in[i]*carrier*d_dfe[i];
+ if(d_derotated_output != NULL){
+ *d_derotated_output = sigrot;
+
+ if (VERBOSE)
+ fprintf(stderr, "Sigrot: %.4f + j%.4f => output: %.4f + j%.4f\n",
+ sigrot.real(), sigrot.imag(), (*d_derotated_output).real(),
(*d_derotated_output).imag());
+
+ d_derotated_output++;
+ }
+
//fprintf(stderr, "%f+j%f = %d\n", sigrot.real(), sigrot.imag(),
slicer(in[i]));
//unsigned char bits = slicer(in[i++]);
unsigned char bits = slicer(sigrot);
@@ -161,7 +171,9 @@
if (d_phase >= 2*M_PI) d_phase -= 2*M_PI;
if (d_phase <0) d_phase += 2*M_PI;
- std::cerr << angle << "\t" << d_freq << "\t" << d_phase << "\t" << std::endl;
+ if(VERBOSE)
+ std::cerr << angle << "\t" << d_freq << "\t" << d_phase << "\t" <<
std::endl;
+
return bytes_produced;
}
@@ -184,7 +196,7 @@
float phase_gain, float freq_gain)
: gr_sync_block ("ofdm_frame_sink",
gr_make_io_signature2 (2, 2,
sizeof(gr_complex)*occupied_carriers, sizeof(char)),
- gr_make_io_signature (0, 0, 0)),
+ gr_make_io_signature (1, 1, sizeof(gr_complex))),
d_target_queue(target_queue), d_occupied_carriers(occupied_carriers),
d_byte_offset(0), d_partial_byte(0),
d_resid(0),
d_nresid(0),d_phase(0),d_freq(0),d_phase_gain(phase_gain),d_freq_gain(freq_gain),
@@ -216,7 +228,7 @@
d_sym_position = sym_position;
d_sym_value_out = sym_value_out;
- d_nbits = (unsigned long)ceil(log10(d_sym_value_out.size()) / log10(2));
+ d_nbits = (unsigned long)ceil(log10(d_sym_value_out.size()) / log10(2.0));
return true;
}
@@ -231,6 +243,12 @@
const char *sig = (const char *) input_items[1];
unsigned int j = 0;
unsigned int bytes=0;
+
+ // If the output is connected, send it the derotated symbols
+ if(output_items.size() >= 1)
+ d_derotated_output = (gr_complex *)output_items[0];
+ else
+ d_derotated_output = NULL;
if (VERBOSE)
fprintf(stderr,">>> Entering state machine\n");
Modified:
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.h
===================================================================
---
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.h
2007-12-11 16:21:51 UTC (rev 7104)
+++
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.h
2007-12-11 20:49:38 UTC (rev 7105)
@@ -73,6 +73,8 @@
int d_packet_whitener_offset; // offset into whitener string
to use
int d_packetlen_cnt; // how many so far
+ gr_complex * d_derotated_output; // Pointer to output stream to send
deroated symbols out
+
std::vector<gr_complex> d_sym_position;
std::vector<unsigned char> d_sym_value_out;
std::vector<gr_complex> d_dfe;
Modified:
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/lib/gengen/gr_threshold_detector_XX.cc.t
===================================================================
---
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/lib/gengen/gr_threshold_detector_XX.cc.t
2007-12-11 16:21:51 UTC (rev 7104)
+++
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/lib/gengen/gr_threshold_detector_XX.cc.t
2007-12-11 20:49:38 UTC (rev 7105)
@@ -30,17 +30,18 @@
#include <gr_io_signature.h>
@SPTR_NAME@
address@hidden@ (float threshold)
address@hidden@ (float threshold, bool rising_edge)
{
- return @SPTR_NAME@ (new @NAME@ (threshold));
+ return @SPTR_NAME@ (new @NAME@ (threshold, rising_edge));
}
address@hidden@::@NAME@ (float threshold)
address@hidden@::@NAME@ (float threshold, bool rising_edge)
: gr_sync_block ("@BASE_NAME@",
gr_make_io_signature (1, 1, sizeof (@I_TYPE@)),
gr_make_io_signature (1, 1, sizeof (char))),
- d_threshold(threshold), d_found(0)
+ d_threshold(threshold), d_rising_edge(rising_edge), d_found(0)
{
+ set_history(2);
}
int
@@ -55,9 +56,17 @@
memset(optr, 0, noutput_items*sizeof(char));
while(i < noutput_items) {
- if(iptr[i] > d_threshold) {
- optr[i];
+ if(d_rising_edge) {
+ if((iptr[i-1] < d_threshold) && (iptr[i] >= d_threshold)) {
+ optr[i] = 1;
+ }
}
+ else {
+ if((iptr[i-1] > d_threshold) && (iptr[i] <= d_threshold)) {
+ optr[i] = 1;
+ }
+ }
+
i++;
}
return noutput_items;
Modified:
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/lib/gengen/gr_threshold_detector_XX.h.t
===================================================================
---
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/lib/gengen/gr_threshold_detector_XX.h.t
2007-12-11 16:21:51 UTC (rev 7104)
+++
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/lib/gengen/gr_threshold_detector_XX.h.t
2007-12-11 20:49:38 UTC (rev 7105)
@@ -30,7 +30,7 @@
class @NAME@;
typedef boost::shared_ptr<@NAME@> @SPTR_NAME@;
address@hidden@ address@hidden@ (float threshold = 0.25);
address@hidden@ address@hidden@ (float threshold=0.25, bool rising_edge=true);
/*!
* \brief Detect the peak of a signal
@@ -40,16 +40,19 @@
* or it outputs 0's.
*
* \param threshold threshold above which the detector is signaled
+ * \param rising_edge sets detector to output a 1 when the rising edge is see
if True
+ * or when the falling edge is seen when false.
*/
class @NAME@ : public gr_sync_block
{
- friend @SPTR_NAME@ address@hidden@ (float threshold);
+ friend @SPTR_NAME@ address@hidden@ (float threshold, bool rising_edge);
- @NAME@ (float threshold);
+ @NAME@ (float threshold, bool rising_edge);
private:
float d_threshold;
- unsigned char d_found;
+ bool d_rising_edge;
+ bool d_found;
public:
@@ -58,11 +61,21 @@
*/
void set_threshold(float thr) { d_threshold = thr; }
+ /*! \brief Set which edge to trigger off of
+ * \param edge Bool value; True=rising edge, False=falling edge
+ */
+ void set_rising_edge(bool edge) { d_rising_edge = edge; }
+
/*! \brief Get the threshold value
* \return threshold factor
*/
float threshold() { return d_threshold; }
+ /*! \brief Get which edge is being used to trigger
+ * \return True=rising edge, False=falling edge
+ */
+ bool rising_edge() { return d_threshold; }
+
int work (int noutput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items);
Modified:
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/lib/gengen/gr_threshold_detector_XX.i.t
===================================================================
---
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/lib/gengen/gr_threshold_detector_XX.i.t
2007-12-11 16:21:51 UTC (rev 7104)
+++
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/lib/gengen/gr_threshold_detector_XX.i.t
2007-12-11 20:49:38 UTC (rev 7105)
@@ -24,14 +24,16 @@
GR_SWIG_BLOCK_MAGIC(gr,@BASE_NAME@)
address@hidden@ address@hidden@ (float threshold = 0.25);
address@hidden@ address@hidden@ (float threshold=0.25, bool rising_edge=true);
class @NAME@ : public gr_sync_block
{
private:
- @NAME@ (float threshold);
+ @NAME@ (float threshold, bool rising_edge);
public:
void set_threshold(float thr) { d_threshold = thr; }
+ void set_rising_edge(float edge) { d_rising_edge = edge; }
float threshold() { return d_threshold; }
+ bool rising_edge() { return d_rising_edge; }
};
Modified:
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/python/gnuradio/blks2impl/Makefile.am
===================================================================
---
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/python/gnuradio/blks2impl/Makefile.am
2007-12-11 16:21:51 UTC (rev 7104)
+++
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/python/gnuradio/blks2impl/Makefile.am
2007-12-11 20:49:38 UTC (rev 7105)
@@ -43,6 +43,8 @@
ofdm.py \
ofdm_receiver.py \
ofdm_sync_pn.py \
+ ofdm_sync_pnac.py \
+ ofdm_sync_ml.py \
pkt.py \
psk.py \
qam.py \
Modified:
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/python/gnuradio/blks2impl/ofdm.py
===================================================================
---
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/python/gnuradio/blks2impl/ofdm.py
2007-12-11 16:21:51 UTC (rev 7104)
+++
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/python/gnuradio/blks2impl/ofdm.py
2007-12-11 20:49:38 UTC (rev 7105)
@@ -76,7 +76,7 @@
preambles = (ksfreq,
known_symbols_4512_1[0:self._occupied_tones],
known_symbols_4512_2[0:self._occupied_tones])
-
+
padded_preambles = list()
for pre in preambles:
padded = self._fft_length*[0,]
@@ -142,7 +142,7 @@
Adds OFDM-specific options to the Options Parser
"""
normal.add_option("-m", "--modulation", type="string", default="bpsk",
- help="set modulation type (bpsk or qpsk)
[default=%default]")
+ help="set modulation type (bpsk, qpsk, 8psk,
qam{16,64}) [default=%default]")
expert.add_option("", "--fft-length", type="intx", default=512,
help="set the number of FFT bins [default=%default]")
expert.add_option("", "--occupied-tones", type="intx", default=200,
@@ -248,6 +248,11 @@
# thing to export, anyway
self.connect(self.ofdm_recv.chan_filt, self)
+ if options.log:
+ self.connect(self.ofdm_demod, gr.file_sink(gr.sizeof_gr_complex,
"ofdm_frame_sink_c.dat"))
+ else:
+ self.connect(self.ofdm_demod, gr.null_sink(gr.sizeof_gr_complex))
+
if options.verbose:
self._print_verbage()
Modified:
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/python/gnuradio/blks2impl/ofdm_receiver.py
===================================================================
---
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/python/gnuradio/blks2impl/ofdm_receiver.py
2007-12-11 16:21:51 UTC (rev 7104)
+++
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/python/gnuradio/blks2impl/ofdm_receiver.py
2007-12-11 20:49:38 UTC (rev 7105)
@@ -22,9 +22,9 @@
import math
from gnuradio import gr
-#from gnuradio.blks2impl.ofdm_sync_ml import ofdm_sync_ml
+from gnuradio.blks2impl.ofdm_sync_ml import ofdm_sync_ml
from gnuradio.blks2impl.ofdm_sync_pn import ofdm_sync_pn
-#from gnuradio.blks2impl.ofdm_sync_pnac import ofdm_sync_pnac
+from gnuradio.blks2impl.ofdm_sync_pnac import ofdm_sync_pnac
class ofdm_receiver(gr.hier_block2):
"""
@@ -72,15 +72,14 @@
win = [1 for i in range(fft_length)]
- SYNC = "pn"
- #if SYNC == "ml":
- # self.ofdm_sync = ofdm_sync_ml(fg, fft_length, cp_length, snr,
logging)
- #elif SYNC == "pn":
- # self.ofdm_sync = ofdm_sync_pn(fg, fft_length, cp_length, logging)
- #elif SYNC == "pnac":
- # self.ofdm_sync = ofdm_sync_pnac(fg, fft_length, cp_length, ks[0])
- self.ofdm_sync = ofdm_sync_pn(fft_length, cp_length, logging)
-
+ SYNC = "ml"
+ if SYNC == "ml":
+ self.ofdm_sync = ofdm_sync_ml(fft_length, cp_length, snr, logging)
+ elif SYNC == "pn":
+ self.ofdm_sync = ofdm_sync_pn(fft_length, cp_length, logging)
+ elif SYNC == "pnac":
+ self.ofdm_sync = ofdm_sync_pnac(fft_length, cp_length, ks[0])
+
self.fft_demod = gr.fft_vcc(fft_length, True, win, True)
self.ofdm_corr = gr.ofdm_correlator(occupied_tones, fft_length,
cp_length, ks[1], ks[2])
Modified:
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/python/gnuradio/blks2impl/ofdm_sync_ml.py
===================================================================
---
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/python/gnuradio/blks2impl/ofdm_sync_ml.py
2007-12-11 16:21:51 UTC (rev 7104)
+++
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/python/gnuradio/blks2impl/ofdm_sync_ml.py
2007-12-11 20:49:38 UTC (rev 7105)
@@ -23,20 +23,23 @@
import math
from gnuradio import gr
-class ofdm_sync_ml(gr.hier_block):
- def __init__(self, fg, fft_length, cp_length, snr, logging):
+class ofdm_sync_ml(gr.hier_block2):
+ def __init__(self, fft_length, cp_length, snr, logging):
''' Maximum Likelihood OFDM synchronizer:
J. van de Beek, M. Sandell, and P. O. Borjesson, "ML Estimation
of Time and Frequency Offset in OFDM Systems," IEEE Trans.
Signal Processing, vol. 45, no. 7, pp. 1800-1805, 1997.
'''
- self.fg = fg
-
- # FIXME: when converting to hier_block2's, the output signature
+ # FIXME: change the output signature
# should be the output of the divider (the normalized peaks) and
# the angle value out of the sample and hold block
+ # move sampler out of this block
+ gr.hier_block2.__init__(self, "ofdm_sync_ml",
+ gr.io_signature(1, 1, gr.sizeof_gr_complex), #
Input signature
+ gr.io_signature(1, 1,
gr.sizeof_gr_complex*fft_length)) # Output signature
+
self.input = gr.add_const_cc(0)
SNR = 10.0**(snr/10.0)
@@ -47,9 +50,11 @@
# Energy Detection from ML Sync
+ self.connect(self, self.input)
+
# Create a delay line
self.delay = gr.delay(gr.sizeof_gr_complex, fft_length)
- self.fg.connect(self.input, self.delay)
+ self.connect(self.input, self.delay)
# magnitude squared blocks
self.magsqrd1 = gr.complex_to_mag_squared()
@@ -59,11 +64,11 @@
moving_sum_taps = [rho/2 for i in range(cp_length)]
self.moving_sum_filter = gr.fir_filter_fff(1,moving_sum_taps)
- self.fg.connect(self.input,self.magsqrd1)
- self.fg.connect(self.delay,self.magsqrd2)
- self.fg.connect(self.magsqrd1,(self.adder,0))
- self.fg.connect(self.magsqrd2,(self.adder,1))
- self.fg.connect(self.adder,self.moving_sum_filter)
+ self.connect(self.input,self.magsqrd1)
+ self.connect(self.delay,self.magsqrd2)
+ self.connect(self.magsqrd1,(self.adder,0))
+ self.connect(self.magsqrd2,(self.adder,1))
+ self.connect(self.adder,self.moving_sum_filter)
# Correlation from ML Sync
@@ -76,15 +81,15 @@
# Correlator data handler
self.c2mag = gr.complex_to_mag()
self.angle = gr.complex_to_arg()
- self.fg.connect(self.input,(self.mixer,1))
- self.fg.connect(self.delay,self.conjg,(self.mixer,0))
- self.fg.connect(self.mixer,self.movingsum2,self.c2mag)
- self.fg.connect(self.movingsum2,self.angle)
+ self.connect(self.input,(self.mixer,1))
+ self.connect(self.delay,self.conjg,(self.mixer,0))
+ self.connect(self.mixer,self.movingsum2,self.c2mag)
+ self.connect(self.movingsum2,self.angle)
# ML Sync output arg, need to find maximum point of this
self.diff = gr.sub_ff()
- self.fg.connect(self.c2mag,(self.diff,0))
- self.fg.connect(self.moving_sum_filter,(self.diff,1))
+ self.connect(self.c2mag,(self.diff,0))
+ self.connect(self.moving_sum_filter,(self.diff,1))
#ML measurements input to sampler block and detect
nco_sensitivity = -1.0/fft_length
@@ -96,40 +101,41 @@
self.sigmix = gr.multiply_cc()
# Mix the signal with an NCO controlled by the sync loop
- self.fg.connect(self.input, (self.sigmix,0))
- self.fg.connect(self.nco, (self.sigmix,1))
- self.fg.connect(self.sigmix, (self.sampler,0))
+ self.connect(self.input, (self.sigmix,0))
+ self.connect(self.nco, (self.sigmix,1))
+ self.connect(self.sigmix, (self.sampler,0))
# use the sync loop values to set the sampler and the NCO
# self.diff = theta
# self.angle = epsilon
- self.fg.connect(self.diff, self.pk_detect)
+ self.connect(self.diff, self.pk_detect)
use_dpll = 1
if use_dpll:
self.dpll = gr.dpll_bb(float(symbol_length),0.01)
- self.fg.connect(self.pk_detect, self.dpll)
- self.fg.connect(self.dpll, (self.sampler,1))
- self.fg.connect(self.dpll, (self.sample_and_hold,1))
+ self.connect(self.pk_detect, self.dpll)
+ self.connect(self.dpll, (self.sampler,1))
+ self.connect(self.dpll, (self.sample_and_hold,1))
else:
- self.fg.connect(self.pk_detect, (self.sampler,1))
- self.fg.connect(self.pk_detect, (self.sample_and_hold,1))
+ self.connect(self.pk_detect, (self.sampler,1))
+ self.connect(self.pk_detect, (self.sample_and_hold,1))
- self.fg.connect(self.angle, (self.sample_and_hold,0))
- self.fg.connect(self.sample_and_hold, self.nco)
+ self.connect(self.angle, (self.sample_and_hold,0))
+ self.connect(self.sample_and_hold, self.nco)
+ self.connect(self.sampler, self)
+
if logging:
- self.fg.connect(self.diff, gr.file_sink(gr.sizeof_float,
"ofdm_sync_ml-theta_f.dat"))
- self.fg.connect(self.angle, gr.file_sink(gr.sizeof_float,
"ofdm_sync_ml-epsilon_f.dat"))
- self.fg.connect(self.pk_detect, gr.file_sink(gr.sizeof_char,
"ofdm_sync_ml-peaks_b.dat"))
+ self.connect(self.diff, gr.file_sink(gr.sizeof_float,
"ofdm_sync_ml-theta_f.dat"))
+ self.connect(self.angle, gr.file_sink(gr.sizeof_float,
"ofdm_sync_ml-epsilon_f.dat"))
+ self.connect(self.pk_detect, gr.file_sink(gr.sizeof_char,
"ofdm_sync_ml-peaks_b.dat"))
if use_dpll:
- self.fg.connect(self.dpll, gr.file_sink(gr.sizeof_char,
"ofdm_sync_ml-dpll_b.dat"))
+ self.connect(self.dpll, gr.file_sink(gr.sizeof_char,
"ofdm_sync_ml-dpll_b.dat"))
- self.fg.connect(self.sigmix, gr.file_sink(gr.sizeof_gr_complex,
"ofdm_sync_ml-sigmix_c.dat"))
- self.fg.connect(self.sampler,
gr.file_sink(gr.sizeof_gr_complex*fft_length, "ofdm_sync_ml-sampler_c.dat"))
- self.fg.connect(self.sample_and_hold,
gr.file_sink(gr.sizeof_float, "ofdm_sync_ml-sample_and_hold_f.dat"))
- self.fg.connect(self.nco, gr.file_sink(gr.sizeof_gr_complex,
"ofdm_sync_ml-nco_c.dat"))
- self.fg.connect(self.input, gr.file_sink(gr.sizeof_gr_complex,
"ofdm_sync_ml-input_c.dat"))
+ self.connect(self.sigmix, gr.file_sink(gr.sizeof_gr_complex,
"ofdm_sync_ml-sigmix_c.dat"))
+ self.connect(self.sampler,
gr.file_sink(gr.sizeof_gr_complex*fft_length, "ofdm_sync_ml-sampler_c.dat"))
+ self.connect(self.sample_and_hold, gr.file_sink(gr.sizeof_float,
"ofdm_sync_ml-sample_and_hold_f.dat"))
+ self.connect(self.nco, gr.file_sink(gr.sizeof_gr_complex,
"ofdm_sync_ml-nco_c.dat"))
+ self.connect(self.input, gr.file_sink(gr.sizeof_gr_complex,
"ofdm_sync_ml-input_c.dat"))
- gr.hier_block.__init__(self, fg, self.input, self.sampler)
Modified:
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/python/gnuradio/blks2impl/ofdm_sync_pnac.py
===================================================================
---
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/python/gnuradio/blks2impl/ofdm_sync_pnac.py
2007-12-11 16:21:51 UTC (rev 7104)
+++
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-core/src/python/gnuradio/blks2impl/ofdm_sync_pnac.py
2007-12-11 20:49:38 UTC (rev 7105)
@@ -24,13 +24,18 @@
from numpy import fft
from gnuradio import gr
-class ofdm_sync_pnac(gr.hier_block):
- def __init__(self, fg, fft_length, cp_length, ks):
- self.fg = fg
-
- # FIXME: when converting to hier_block2's, the output signature
+class ofdm_sync_pnac(gr.hier_block2):
+ def __init__(self, fft_length, cp_length, ks):
+
+ # FIXME: change the output signature
# should be the output of the divider (the normalized peaks) and
# the angle value out of the sample and hold block
+ # move sampler out of this block
+
+ gr.hier_block2.__init__(self, "ofdm_sync_pnac",
+ gr.io_signature(1, 1, gr.sizeof_gr_complex), #
Input signature
+ gr.io_signature(1, 1,
gr.sizeof_gr_complex*fft_length)) # Output signature
+
self.input = gr.add_const_cc(0)
@@ -42,7 +47,7 @@
ks = ks[0:fft_length//2]
ks.reverse()
self.crosscorr_filter = gr.fir_filter_ccc(1, ks)
- self.fg.connect(self.crosscorr_filter,
gr.file_sink(gr.sizeof_gr_complex, "crosscorr.dat"))
+ self.connect(self.crosscorr_filter, gr.file_sink(gr.sizeof_gr_complex,
"crosscorr.dat"))
# Create a delay line
self.delay = gr.delay(gr.sizeof_gr_complex, fft_length/2)
@@ -78,49 +83,49 @@
self.pk_detect = gr.peak_detector_fb(0.2, 0.25, 30, 0.0005)
self.sampler = gr.ofdm_sampler(fft_length,symbol_length)
-
- self.fg.connect(self.input, self.crosscorr_filter)
- self.fg.connect(self.crosscorr_filter, self.delay)
- self.fg.connect(self.crosscorr_filter, (self.corr,0))
- self.fg.connect(self.delay, self.conjg)
- self.fg.connect(self.conjg, (self.corr,1))
- self.fg.connect(self.corr, self.moving_sum_filter)
- self.fg.connect(self.moving_sum_filter, self.c2mag)
- self.fg.connect(self.moving_sum_filter, self.angle)
- self.fg.connect(self.angle, (self.sample_and_hold,0))
- self.fg.connect(self.sample_and_hold, self.nco)
- self.fg.connect(self.input, (self.sigmix,0))
- self.fg.connect(self.nco, (self.sigmix,1))
- self.fg.connect(self.sigmix, (self.sampler,0))
+ self.connect(self, self.input)
+ self.connect(self.input, self.crosscorr_filter)
+ self.connect(self.crosscorr_filter, self.delay)
+ self.connect(self.crosscorr_filter, (self.corr,0))
+ self.connect(self.delay, self.conjg)
+ self.connect(self.conjg, (self.corr,1))
+ self.connect(self.corr, self.moving_sum_filter)
+ self.connect(self.moving_sum_filter, self.c2mag)
+ self.connect(self.moving_sum_filter, self.angle)
+ self.connect(self.angle, (self.sample_and_hold,0))
+ self.connect(self.sample_and_hold, self.nco)
- self.fg.connect(self.input, self.inputmag2, self.inputmovingsum)
- self.fg.connect(self.inputmovingsum, (self.square,0))
- self.fg.connect(self.inputmovingsum, (self.square,1))
- self.fg.connect(self.square, (self.normalize,1))
- self.fg.connect(self.c2mag, (self.normalize,0))
- self.fg.connect(self.normalize, self.sub1, self.pk_detect)
+ self.connect(self.input, (self.sigmix,0))
+ self.connect(self.nco, (self.sigmix,1))
+ self.connect(self.sigmix, (self.sampler,0))
- self.fg.connect(self.pk_detect, (self.sampler,1))
- self.fg.connect(self.pk_detect, (self.sample_and_hold,1))
+ self.connect(self.input, self.inputmag2, self.inputmovingsum)
+ self.connect(self.inputmovingsum, (self.square,0))
+ self.connect(self.inputmovingsum, (self.square,1))
+ self.connect(self.square, (self.normalize,1))
+ self.connect(self.c2mag, (self.normalize,0))
+ self.connect(self.normalize, self.sub1, self.pk_detect)
+
+ self.connect(self.pk_detect, (self.sampler,1))
+ self.connect(self.pk_detect, (self.sample_and_hold,1))
+ self.connect(self.sampler, self)
if 1:
- self.fg.connect(self.normalize, gr.file_sink(gr.sizeof_float,
-
"ofdm_sync_pnac-theta_f.dat"))
- self.fg.connect(self.angle, gr.file_sink(gr.sizeof_float,
-
"ofdm_sync_pnac-epsilon_f.dat"))
- self.fg.connect(self.pk_detect, gr.file_sink(gr.sizeof_char,
-
"ofdm_sync_pnac-peaks_b.dat"))
- self.fg.connect(self.sigmix, gr.file_sink(gr.sizeof_gr_complex,
-
"ofdm_sync_pnac-sigmix_c.dat"))
- self.fg.connect(self.sampler,
gr.file_sink(gr.sizeof_gr_complex*fft_length,
-
"ofdm_sync_pnac-sampler_c.dat"))
- self.fg.connect(self.sample_and_hold, gr.file_sink(gr.sizeof_float,
-
"ofdm_sync_pnac-sample_and_hold_f.dat"))
- self.fg.connect(self.nco, gr.file_sink(gr.sizeof_gr_complex,
- "ofdm_sync_pnac-nco_c.dat"))
- self.fg.connect(self.input, gr.file_sink(gr.sizeof_gr_complex,
-
"ofdm_sync_pnac-input_c.dat"))
-
- gr.hier_block.__init__(self, fg, self.input, self.sampler)
+ self.connect(self.normalize, gr.file_sink(gr.sizeof_float,
+
"ofdm_sync_pnac-theta_f.dat"))
+ self.connect(self.angle, gr.file_sink(gr.sizeof_float,
+
"ofdm_sync_pnac-epsilon_f.dat"))
+ self.connect(self.pk_detect, gr.file_sink(gr.sizeof_char,
+
"ofdm_sync_pnac-peaks_b.dat"))
+ self.connect(self.sigmix, gr.file_sink(gr.sizeof_gr_complex,
+
"ofdm_sync_pnac-sigmix_c.dat"))
+ self.connect(self.sampler,
gr.file_sink(gr.sizeof_gr_complex*fft_length,
+
"ofdm_sync_pnac-sampler_c.dat"))
+ self.connect(self.sample_and_hold, gr.file_sink(gr.sizeof_float,
+
"ofdm_sync_pnac-sample_and_hold_f.dat"))
+ self.connect(self.nco, gr.file_sink(gr.sizeof_gr_complex,
+ "ofdm_sync_pnac-nco_c.dat"))
+ self.connect(self.input, gr.file_sink(gr.sizeof_gr_complex,
+
"ofdm_sync_pnac-input_c.dat"))
Modified:
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-examples/python/ofdm/benchmark_ofdm_rx.py
===================================================================
---
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-examples/python/ofdm/benchmark_ofdm_rx.py
2007-12-11 16:21:51 UTC (rev 7104)
+++
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-examples/python/ofdm/benchmark_ofdm_rx.py
2007-12-11 20:49:38 UTC (rev 7105)
@@ -20,21 +20,21 @@
# Boston, MA 02110-1301, USA.
#
-from gnuradio import gr, blks
+from gnuradio import gr, blks2
from gnuradio import usrp
from gnuradio import eng_notation
from gnuradio.eng_option import eng_option
from optparse import OptionParser
-import random, time, struct, sys
+import struct, sys
# from current dir
from receive_path import receive_path
import fusb_options
-class usrp_graph(gr.flow_graph):
+class my_top_block(gr.top_block):
def __init__(self, callback, options):
- gr.flow_graph.__init__(self)
+ gr.top_block.__init__(self)
self._rx_freq = options.rx_freq # receiver's center
frequency
self._rx_gain = options.rx_gain # receiver's gain
@@ -61,10 +61,10 @@
self.set_auto_tr(True) # enable Auto Transmit/Receive
switching
# Set up receive path
- self.rxpath = receive_path(self, callback, options)
+ self.rxpath = receive_path(callback, options)
self.connect(self.u, self.rxpath)
-
+
def _setup_usrp_source(self):
self.u = usrp.source_c (fusb_block_size=self._fusb_block_size,
fusb_nblocks=self._fusb_nblocks)
@@ -187,23 +187,23 @@
parser.add_option("","--discontinuous", action="store_true", default=False,
help="enable discontinuous")
- usrp_graph.add_options(parser, expert_grp)
+ my_top_block.add_options(parser, expert_grp)
receive_path.add_options(parser, expert_grp)
- blks.ofdm_mod.add_options(parser, expert_grp)
- blks.ofdm_demod.add_options(parser, expert_grp)
+ blks2.ofdm_mod.add_options(parser, expert_grp)
+ blks2.ofdm_demod.add_options(parser, expert_grp)
fusb_options.add_options(expert_grp)
(options, args) = parser.parse_args ()
# build the graph
- fg = usrp_graph(rx_callback, options)
+ tb = my_top_block(rx_callback, options)
r = gr.enable_realtime_scheduling()
if r != gr.RT_OK:
print "Warning: failed to enable realtime scheduling"
- fg.start() # start flow graph
- fg.wait() # wait for it to finish
+ tb.start() # start flow graph
+ tb.wait() # wait for it to finish
if __name__ == '__main__':
try:
Modified:
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-examples/python/ofdm/benchmark_ofdm_tx.py
===================================================================
---
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-examples/python/ofdm/benchmark_ofdm_tx.py
2007-12-11 16:21:51 UTC (rev 7104)
+++
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-examples/python/ofdm/benchmark_ofdm_tx.py
2007-12-11 20:49:38 UTC (rev 7105)
@@ -20,7 +20,7 @@
# Boston, MA 02110-1301, USA.
#
-from gnuradio import gr, blks
+from gnuradio import gr, blks2
from gnuradio import usrp
from gnuradio import eng_notation
from gnuradio.eng_option import eng_option
@@ -33,9 +33,9 @@
from pick_bitrate import pick_tx_bitrate
import fusb_options
-class usrp_graph(gr.flow_graph):
+class my_top_block(gr.top_block):
def __init__(self, options):
- gr.flow_graph.__init__(self)
+ gr.top_block.__init__(self)
self._tx_freq = options.tx_freq # tranmitter's
center frequency
self._tx_subdev_spec = options.tx_subdev_spec # daughterboard to
use
@@ -53,10 +53,10 @@
# copy the final answers back into options for use by modulator
#options.bitrate = self._bitrate
- self.txpath = transmit_path(self, options)
+ self.txpath = transmit_path(options)
self.connect(self.txpath, self.u)
-
+
def _setup_usrp_sink(self):
"""
Creates a USRP sink, determines the settings for best bitrate,
@@ -167,7 +167,7 @@
def main():
def send_pkt(payload='', eof=False):
- return fg.txpath.send_pkt(payload, eof)
+ return tb.txpath.send_pkt(payload, eof)
parser = OptionParser(option_class=eng_option, conflict_handler="resolve")
expert_grp = parser.add_option_group("Expert")
@@ -178,23 +178,23 @@
parser.add_option("","--discontinuous", action="store_true", default=False,
help="enable discontinuous mode")
- usrp_graph.add_options(parser, expert_grp)
+ my_top_block.add_options(parser, expert_grp)
transmit_path.add_options(parser, expert_grp)
- blks.ofdm_mod.add_options(parser, expert_grp)
- blks.ofdm_demod.add_options(parser, expert_grp)
+ blks2.ofdm_mod.add_options(parser, expert_grp)
+ blks2.ofdm_demod.add_options(parser, expert_grp)
fusb_options.add_options(expert_grp)
(options, args) = parser.parse_args ()
# build the graph
- fg = usrp_graph(options)
-
+ tb = my_top_block(options)
+
r = gr.enable_realtime_scheduling()
if r != gr.RT_OK:
print "Warning: failed to enable realtime scheduling"
- fg.start() # start flow graph
-
+ tb.start() # start flow graph
+
# generate and send packets
nbytes = int(1e6 * options.megabytes)
n = 0
@@ -210,7 +210,7 @@
pktno += 1
send_pkt(eof=True)
- fg.wait() # wait for it to finish
+ tb.wait() # wait for it to finish
if __name__ == '__main__':
try:
Modified:
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-examples/python/ofdm/plot_ofdm.m
===================================================================
---
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-examples/python/ofdm/plot_ofdm.m
2007-12-11 16:21:51 UTC (rev 7104)
+++
gnuradio/branches/developers/trondeau/ofdm2/gnuradio-examples/python/ofdm/plot_ofdm.m
2007-12-11 20:49:38 UTC (rev 7105)
@@ -3,9 +3,18 @@
ofdm = read_complex_binary('ofdm_corr_out_c.dat');
ofdm_split = split_vect(ofdm, occ_tones);
+ofdm_derot = read_complex_binary('ofdm_frame_sink_c.dat');
+ofdm_derot_split = split_vect(ofdm_derot, occ_tones);
+
fftc = read_complex_binary('fft_out_c.dat');
fftc_split = split_vect(fftc, fft_size);
+size(ofdm_split)
+size(ofdm_derot_split)
+disp "DEROTATED SPLIT"
+ofdm_derot(1:100)
+
+
figure(1)
#set(gcf, 'Position', [50 50 1000 600]);
@@ -19,28 +28,28 @@
maxcount = a(1);
end
-for i = 1:20000
+for i = 1:size(ofdm_split)[0]
x = ofdm_split(i,:);
y = fftc_split(i+1,:);
- subplot(2,2,1)
- plot(real(x), imag(x), 'bo')
+ subplot(2,2,1);
+ plot(real(x), imag(x), 'bo');
#set(gca, 'FontSize', 30, 'FontWeight', 'Bold');
axis([-1.5, 1.5, -1.5, 1.5])
#title('I&Q Constellation', 'FontSize', 36);
#xlabel('Inphase', 'FontSize', 32);
#ylabel('Quadrature', 'FontSize', 32);
- subplot(2,2,3)
- plot(angle(x*j), 'bo')
+ subplot(2,2,3);
+ plot(angle(x*j), 'bo');
#set(gca, 'FontSize', 30, 'FontWeight', 'Bold');
axis([0, occ_tones, -3.5, 3.5])
#title('Equalized Symbol Angle', 'FontSize', 36);
#xlabel('Bin Number (Occ. Tones)', 'FontSize', 32);
#ylabel('Symbol Angle', 'FontSize', 32);
- subplot(2,2,2)
- plot(angle(y*j), 'bo')
+ subplot(2,2,2);
+ plot(angle(y*j), 'bo');
#set(gca, 'FontSize', 30, 'FontWeight', 'Bold');
axis([0, fft_size, -3.5, 3.5])
#title('Unequalized Symbol Angle', 'FontSize', 36);
@@ -48,18 +57,18 @@
#ylabel('Symbol Angle', 'FontSize', 32);
Y = 20*log10(abs(y) ./ max(abs(y)));
- subplot(2,2,4)
- plot(Y, 'b-')
+ subplot(2,2,4);
+ plot(Y, 'b-');
#set(gca, 'FontSize', 30, 'FontWeight', 'Bold');
axis([0, fft_size, -50, 1]);
#title('Frequency Domain of Unequalized Rx', 'FontSize', 36);
#xlabel('Bin Number (FFT Size)', 'FontSize', 32);
#ylabel('Power (dB)', 'FontSize', 32);
- % N = 20*log10(var(abs(x)-1))
+ #N = 20*log10(var(abs(x)-1));
disp(sprintf('Symbol Number: %d\n', i))
-% disp(sprintf('\tFreq Error: %f\n', anglesh_pn(1+(i-1)*fft_size)))
+ #disp(sprintf('\tFreq Error: %f\n', anglesh_pn(1+(i-1)*fft_size)))
pause
end
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r7105 - in gnuradio/branches/developers/trondeau/ofdm2: gnuradio-core/src/lib/general gnuradio-core/src/lib/gengen gnuradio-core/src/python/gnuradio/blks2impl gnuradio-examples/python/ofdm,
trondeau <=