[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] r5581 - in gnuradio/branches/features/ofdm/receiver: g
From: |
trondeau |
Subject: |
[Commit-gnuradio] r5581 - in gnuradio/branches/features/ofdm/receiver: gnuradio-core/src/lib/general gnuradio-core/src/python/gnuradio gnuradio-core/src/python/gnuradio/blksimpl gnuradio-examples/python/ofdm |
Date: |
Thu, 31 May 2007 07:19:21 -0600 (MDT) |
Author: trondeau
Date: 2007-05-31 07:19:20 -0600 (Thu, 31 May 2007)
New Revision: 5581
Added:
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.cc
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.h
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.i
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/python/gnuradio/blksimpl/ofdm_receiver.py
Modified:
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/Makefile.am
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/general.i
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_correlator.cc
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/python/gnuradio/blksimpl/ofdm_pkt.py
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/python/gnuradio/ofdm_packet_utils.py
gnuradio/branches/features/ofdm/receiver/gnuradio-examples/python/ofdm/benchmark_ofdm.py
gnuradio/branches/features/ofdm/receiver/gnuradio-examples/python/ofdm/ofdm.py
gnuradio/branches/features/ofdm/receiver/gnuradio-examples/python/ofdm/ofdm_receiver.py
gnuradio/branches/features/ofdm/receiver/gnuradio-examples/python/ofdm/receive_path.py
gnuradio/branches/features/ofdm/receiver/gnuradio-examples/python/ofdm/transmit_path.py
Log:
work in progress: reformatting ofdm receiver
Modified:
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/Makefile.am
===================================================================
---
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/Makefile.am
2007-05-31 04:25:05 UTC (rev 5580)
+++
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/Makefile.am
2007-05-31 13:19:20 UTC (rev 5581)
@@ -102,6 +102,7 @@
gr_ofdm_mapper_bcv.cc \
gr_ofdm_bpsk_demapper.cc \
gr_ofdm_bpsk_mapper.cc \
+ gr_ofdm_frame_sink.cc \
gr_ofdm_sampler.cc \
gr_pa_2x2_phase_combiner.cc \
gr_packet_sink.cc \
@@ -240,7 +241,8 @@
gr_ofdm_mapper_bcv.h \
gr_ofdm_bpsk_mapper.h \
gr_ofdm_bpsk_demapper.h \
- gr_ofdm_sampler.h \
+ gr_ofdm_frame_sink.h \
+ gr_ofdm_sampler.h \
gr_pa_2x2_phase_combiner.h \
gr_packet_sink.h \
gr_phase_modulator_fc.h \
@@ -379,7 +381,8 @@
gr_ofdm_mapper_bcv.i \
gr_ofdm_bpsk_demapper.i \
gr_ofdm_bpsk_mapper.i \
- gr_ofdm_sampler.i \
+ gr_ofdm_frame_sink.i \
+ gr_ofdm_sampler.i \
gr_pa_2x2_phase_combiner.i \
gr_packet_sink.i \
gr_phase_modulator_fc.i \
Modified:
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/general.i
===================================================================
---
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/general.i
2007-05-31 04:25:05 UTC (rev 5580)
+++
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/general.i
2007-05-31 13:19:20 UTC (rev 5581)
@@ -97,6 +97,7 @@
#include <gr_ofdm_cyclic_prefixer.h>
#include <gr_ofdm_bpsk_demapper.h>
#include <gr_ofdm_bpsk_mapper.h>
+#include <gr_ofdm_frame_sink.h>
#include <gr_ofdm_sampler.h>
#include <gr_costas_loop_cc.h>
#include <gr_pa_2x2_phase_combiner.h>
@@ -199,6 +200,7 @@
%include "gr_ofdm_cyclic_prefixer.i"
%include "gr_ofdm_bpsk_demapper.i"
%include "gr_ofdm_bpsk_mapper.i"
+%include "gr_ofdm_frame_sink.i"
%include "gr_ofdm_sampler.i"
%include "gr_costas_loop_cc.i"
%include "gr_pa_2x2_phase_combiner.i"
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-05-31 04:25:05 UTC (rev 5580)
+++
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_correlator.cc
2007-05-31 13:19:20 UTC (rev 5581)
@@ -115,11 +115,12 @@
search_delta, h_sqrd.real(), h_sqrd.imag(), power,
h_sqrd.real()/power, arg(h_sqrd));
#endif
- if(h_sqrd.real() > 0.75*power) {
+ if((h_sqrd.real() > 0.75*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(power/(power-h_sqrd.real()));
+ 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);
Added:
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.cc
===================================================================
---
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.cc
(rev 0)
+++
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.cc
2007-05-31 13:19:20 UTC (rev 5581)
@@ -0,0 +1,228 @@
+/* -*- 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gr_ofdm_frame_sink.h>
+#include <gr_io_signature.h>
+#include <cstdio>
+#include <stdexcept>
+
+#define VERBOSE 1
+
+inline void
+gr_ofdm_frame_sink::enter_search()
+{
+ if (VERBOSE)
+ fprintf(stderr, "@ enter_search\n");
+
+ d_state = STATE_SYNC_SEARCH;
+}
+
+inline void
+gr_ofdm_frame_sink::enter_have_sync()
+{
+ if (VERBOSE)
+ fprintf(stderr, "@ enter_have_sync\n");
+
+ d_state = STATE_HAVE_SYNC;
+ d_header = 0;
+ d_headerbitlen_cnt = 0;
+}
+
+inline void
+gr_ofdm_frame_sink::enter_have_header(int payload_len, int whitener_offset)
+{
+ if (VERBOSE)
+ fprintf(stderr, "@ enter_have_header (payload_len = %d) (offset = %d)\n",
payload_len, whitener_offset);
+
+ d_state = STATE_HAVE_HEADER;
+ d_packetlen = payload_len;
+ d_packet_whitener_offset = whitener_offset;
+ d_packetlen_cnt = 0;
+}
+
+unsigned char gr_ofdm_frame_sink::bpsk_slicer(gr_complex x)
+{
+ return (unsigned char)(x.real() > 0 ? 1 : 0);
+}
+
+unsigned int gr_ofdm_frame_sink::bpsk_demapper(const gr_complex *in,
+ unsigned char *out)
+{
+ unsigned int i=0, bytes_produced=0;
+
+ while(i < 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 |= bpsk_slicer(in[i++]) << (d_byte_offset++);
+ }
+
+ if(d_byte_offset == 8) {
+ out[bytes_produced++] = d_partial_byte;
+ d_byte_offset = 0;
+ d_partial_byte = 0;
+ }
+ }
+
+ return bytes_produced;
+}
+
+
+
+gr_ofdm_frame_sink_sptr
+gr_make_ofdm_frame_sink(gr_msg_queue_sptr target_queue, unsigned int
occupied_carriers)
+{
+ return gr_ofdm_frame_sink_sptr(new gr_ofdm_frame_sink(target_queue,
occupied_carriers));
+}
+
+
+gr_ofdm_frame_sink::gr_ofdm_frame_sink(gr_msg_queue_sptr target_queue,
unsigned int occupied_carriers)
+ : gr_sync_block ("ofdm_frame_sink",
+ gr_make_io_signature (1, 1,
sizeof(gr_complex)*occupied_carriers),
+ gr_make_io_signature (0, 0, 0)),
+ d_target_queue(target_queue), d_occupied_carriers(occupied_carriers),
+ d_byte_offset(0), d_partial_byte(0)
+{
+ enter_search();
+}
+
+gr_ofdm_frame_sink::~gr_ofdm_frame_sink ()
+{
+}
+
+int
+gr_ofdm_frame_sink::work (int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+{
+ const gr_complex *in = (const gr_complex *) input_items[0];
+ int count=0;
+ unsigned int j = 0;
+ unsigned int bytes=0;
+ unsigned char *bytes_out = new unsigned
char[(int)floor(d_occupied_carriers/8.0)];
+
+ if (VERBOSE)
+ fprintf(stderr,">>> Entering state machine\n");
+
+ while (count < noutput_items){
+ switch(d_state) {
+
+ case STATE_SYNC_SEARCH: // Look for flag indicating beginning of pkt
+ if (VERBOSE)
+ fprintf(stderr,"SYNC Search, noutput=%d\n", noutput_items);
+
+ while (count < noutput_items) {
+ //if (in[count] & 0x2){ // Found it, set up for header decode
+ // enter_have_sync();
+ // break;
+ //}
+ count++;
+ }
+ break;
+
+ case STATE_HAVE_SYNC:
+ if (VERBOSE)
+ fprintf(stderr,"Header Search bitcnt=%d, header=0x%08x\n",
+ d_headerbitlen_cnt, d_header);
+
+ while (count < noutput_items) { // Shift bits one at a time into header
+ bytes = bpsk_demapper(&in[count], bytes_out);
+ count += d_occupied_carriers;
+
+ j = 0;
+ while(j < bytes) {
+ d_header = (d_header << 8) | (bytes_out[j++] & 0x08);
+ if (++d_headerbitlen_cnt == HEADERBITLEN) {
+
+ if (VERBOSE)
+ fprintf(stderr, "got header: 0x%08x\n", d_header);
+
+ // we have a full header, check to see if it has been received
properly
+ if (header_ok()){
+ int payload_len;
+ int whitener_offset;
+ header_payload(&payload_len, &whitener_offset);
+ enter_have_header(payload_len, whitener_offset);
+
+ if (d_packetlen == 0){ // check for zero-length payload
+ // build a zero-length message
+ // NOTE: passing header field as arg1 is not scalable
+ gr_message_sptr msg =
+ gr_make_message(0, d_packet_whitener_offset, 0, 0);
+
+ d_target_queue->insert_tail(msg); // send it
+ msg.reset(); // free it up
+
+ enter_search();
+ }
+ }
+ else
+ enter_search(); // bad header
+ }
+ break; // we're in a new state
+ }
+ }
+ break;
+
+ case STATE_HAVE_HEADER:
+ if (VERBOSE)
+ fprintf(stderr,"Packet Build\n");
+
+ while (count < noutput_items) { // shift bits into bytes of packet one
at a time
+ bytes = bpsk_demapper(&in[count], bytes_out);
+ count += d_occupied_carriers;
+
+ j = 0;
+ while(j < bytes) {
+ d_packet[d_packetlen_cnt++] = bytes_out[j++];
+
+ if (d_packetlen_cnt == d_packetlen){ // packet is filled
+
+ // build a message
+ // NOTE: passing header field as arg1 is not scalable
+ gr_message_sptr msg =
+ gr_make_message(0, d_packet_whitener_offset, 0, d_packetlen_cnt);
+ memcpy(msg->msg(), d_packet, d_packetlen_cnt);
+
+ d_target_queue->insert_tail(msg); // send it
+ msg.reset(); // free it up
+
+ enter_search();
+ break;
+ }
+ }
+ }
+ break;
+
+ default:
+ assert(0);
+
+ } // switch
+
+ } // while
+
+ return noutput_items;
+}
Added:
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.h
===================================================================
---
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.h
(rev 0)
+++
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.h
2007-05-31 13:19:20 UTC (rev 5581)
@@ -0,0 +1,112 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2005,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_FRAME_SINK_H
+#define INCLUDED_GR_OFDM_FRAME_SINK_H
+
+#include <gr_sync_block.h>
+#include <gr_msg_queue.h>
+
+class gr_ofdm_frame_sink;
+typedef boost::shared_ptr<gr_ofdm_frame_sink> gr_ofdm_frame_sink_sptr;
+
+gr_ofdm_frame_sink_sptr
+gr_make_ofdm_frame_sink (gr_msg_queue_sptr target_queue, unsigned int
occupied_tones);
+
+/*!
+ * \brief Given a stream of bits and access_code flags, assemble packets.
+ * \ingroup sink
+ *
+ * input: stream of bytes from gr_correlate_access_code_bb
+ * output: none. Pushes assembled packet into target queue
+ *
+ * The framer expects a fixed length header of 2 16-bit shorts
+ * containing the payload length, followed by the payload. If the
+ * 2 16-bit shorts are not identical, this packet is ignored. Better
+ * algs are welcome.
+ *
+ * The input data consists of bytes that have two bits used.
+ * Bit 0, the LSB, contains the data bit.
+ * Bit 1 if set, indicates that the corresponding bit is the
+ * the first bit of the packet. That is, this bit is the first
+ * one after the access code.
+ */
+class gr_ofdm_frame_sink : public gr_sync_block
+{
+ friend gr_ofdm_frame_sink_sptr
+ gr_make_ofdm_frame_sink (gr_msg_queue_sptr target_queue, unsigned int
occupied_tones);
+
+ private:
+ enum state_t {STATE_SYNC_SEARCH, STATE_HAVE_SYNC, STATE_HAVE_HEADER};
+
+ static const int MAX_PKT_LEN = 4096;
+ static const int HEADERBITLEN = 32;
+
+ gr_msg_queue_sptr d_target_queue; // where to send the packet
when received
+ state_t d_state;
+ unsigned int d_header; // header bits
+ int d_headerbitlen_cnt; // how many so far
+
+ unsigned int d_occupied_carriers;
+ unsigned int d_byte_offset;
+ unsigned int d_partial_byte;
+
+ unsigned char d_packet[MAX_PKT_LEN]; // assembled payload
+ int d_packetlen; // length of packet
+ int d_packet_whitener_offset; // offset into whitener string
to use
+ int d_packetlen_cnt; // how many so far
+
+ protected:
+ gr_ofdm_frame_sink(gr_msg_queue_sptr target_queue, unsigned int
occupied_tones);
+
+ void enter_search();
+ void enter_have_sync();
+ void enter_have_header(int payload_len, int whitener_offset);
+
+ bool header_ok()
+ {
+ // confirm that two copies of header info are identical
+ return ((d_header >> 16) ^ (d_header & 0xffff)) == 0;
+ }
+
+ void header_payload(int *len, int *offset)
+ {
+ // header consists of two 16-bit shorts in network byte order
+ // payload length is lower 12 bits
+ // whitener offset is upper 4 bits
+ *len = (d_header >> 16) & 0x0fff;
+ *offset = (d_header >> 28) & 0x000f;
+ }
+
+ unsigned char bpsk_slicer(gr_complex x);
+ unsigned int bpsk_demapper(const gr_complex *in,
+ unsigned char *out);
+
+ public:
+ ~gr_ofdm_frame_sink();
+
+ int work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+};
+
+#endif /* INCLUDED_GR_OFDM_FRAME_SINK_H */
Added:
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.i
===================================================================
---
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.i
(rev 0)
+++
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.i
2007-05-31 13:19:20 UTC (rev 5581)
@@ -0,0 +1,35 @@
+/* -*- 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.
+ */
+
+GR_SWIG_BLOCK_MAGIC(gr,ofdm_frame_sink);
+
+gr_ofdm_frame_sink_sptr
+gr_make_ofdm_frame_sink(gr_msg_queue_sptr target_queue, unsigned int
occupied_tones);
+
+class gr_ofdm_frame_sink : public gr_sync_block
+{
+ protected:
+ gr_ofdm_frame_sink(gr_msg_queue_sptr target_queue, unsigned int
occupied_tones);
+
+ public:
+ ~gr_ofdm_frame_sink();
+};
Modified:
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/python/gnuradio/blksimpl/ofdm_pkt.py
===================================================================
---
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/python/gnuradio/blksimpl/ofdm_pkt.py
2007-05-31 04:25:05 UTC (rev 5580)
+++
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/python/gnuradio/blksimpl/ofdm_pkt.py
2007-05-31 13:19:20 UTC (rev 5581)
@@ -1,3 +1,4 @@
+
#
# Copyright 2005,2006,2007 Free Software Foundation, Inc.
#
@@ -23,7 +24,9 @@
from gnuradio import gr, ofdm_packet_utils
import gnuradio.gr.gr_threading as _threading
+from ofdm_receiver import ofdm_receiver
+
# /////////////////////////////////////////////////////////////////////////////
# mod/demod with packets as i/o
# /////////////////////////////////////////////////////////////////////////////
@@ -34,7 +37,7 @@
Send packets by calling send_pkt
"""
- def __init__(self, fg, modulator, access_code=None, msgq_limit=2,
pad_for_usrp=True):
+ def __init__(self, fg, modulator, msgq_limit=2, pad_for_usrp=True):
"""
Hierarchical block for sending packets
@@ -45,8 +48,6 @@
@type fg: flow graph
@param modulator: instance of modulator class (gr_block or hier_block)
@type modulator: complex baseband out
- @param access_code: AKA sync vector
- @type access_code: string of 1's and 0's between 1 and 64 long
@param msgq_limit: maximum number of messages in message queue
@type msgq_limit: int
@param pad_for_usrp: If true, packets are padded such that they end up
a multiple of 128 samples
@@ -56,12 +57,6 @@
self._modulator = modulator
self._pad_for_usrp = pad_for_usrp
- if access_code is None:
- access_code = ofdm_packet_utils.default_access_code
- if not ofdm_packet_utils.is_1_0_string(access_code):
- raise ValueError, "Invalid access_code %r. Must be string of 1's
and 0's" % (access_code,)
- self._access_code = access_code
-
# accepts messages from the outside world
self._pkt_input = gr.message_vector_source(self._modulator.mtu(),
msgq_limit)
fg.connect(self._pkt_input, self._modulator)
@@ -81,7 +76,6 @@
pkt = ofdm_packet_utils.make_packet(payload,
self._modulator.samples_per_symbol(),
self._modulator.bits_per_symbol(),
- self._access_code,
self._pad_for_usrp)
#print "pkt =", string_to_hex_list(pkt)
msg = gr.message_from_string(pkt)
@@ -97,7 +91,7 @@
app via the callback.
"""
- def __init__(self, fg, demodulator, access_code=None, callback=None,
threshold=-1):
+ def __init__(self, fg, options, callback=None):
"""
Hierarchical block for demodulating and deframing packets.
@@ -108,35 +102,22 @@
@type fg: flow graph
@param demodulator: instance of demodulator class (gr_block or
hier_block)
@type demodulator: complex baseband in
- @param access_code: AKA sync vector
- @type access_code: string of 1's and 0's
@param callback: function of two args: ok, payload
@type callback: ok: bool; payload: string
- @param threshold: detect access_code with up to threshold bits wrong
(-1 -> use default)
- @type threshold: int
"""
-
- self._demodulator = demodulator
- if access_code is None:
- access_code = ofdm_packet_utils.default_access_code
- if not ofdm_packet_utils.is_1_0_string(access_code):
- raise ValueError, "Invalid access_code %r. Must be string of 1's
and 0's" % (access_code,)
- self._access_code = access_code
-
- if threshold == -1:
- threshold = 12 # FIXME raise exception
-
self._rcvd_pktq = gr.msg_queue() # holds packets from the PHY
- self.bytes_to_bits = gr.packed_to_unpacked_bb(1, gr.GR_MSB_FIRST)
- self.correlator = gr.correlate_access_code_bb(access_code, threshold)
- self.framer_sink = gr.framer_sink_1(self._rcvd_pktq)
- fg.connect(self._demodulator, self.bytes_to_bits, self.correlator,
self.framer_sink)
-
- if 0:
- fg.connect(self.bytes_to_bits, gr.file_sink(gr.sizeof_char,
"received_bits.out"))
+ ks1 = known_symbols_200_1
+ ks2 = known_symbols_200_2
+ symbol_length = options.fft_length + options.cp_length
+ self.ofdm_recv = ofdm_receiver(fg, options.fft_length,
options.cp_length,
+ options.occupied_tones, options.snr,
ks1, ks2)
+ self.ofdm_demod = gr.ofdm_frame_sink(self._rcvd_pktq,
+ options.occupied_tones)
- gr.hier_block.__init__(self, fg, self._demodulator, None)
+ fg.connect(self.ofdm_recv, self.ofdm_demod)
+
+ gr.hier_block.__init__(self, fg, self.ofdm_recv, None)
self._watcher = _queue_watcher_thread(self._rcvd_pktq, callback)
@@ -156,3 +137,7 @@
ok, payload = ofdm_packet_utils.unmake_packet(msg.to_string())
if self.callback:
self.callback(ok, payload)
+
+known_symbols_200_1 = [1.0, 1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0,
-1.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0,
-1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0,
1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0,
1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0,
-1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0,
-1.0, 1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0,
-1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0,
-1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0,
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0,
-1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, -1.0,
1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, 1.0,
-1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, 1.0,
-1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0,
-1.0, 1.0, 1.0, -1.0]
+
+known_symbols_200_2 = [-1.0, -1.0, -1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, 1.0,
1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0,
1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0,
-1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
-1.0, 1.0, 1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0,
-1.0, 1.0, -1.0, 1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, 1.0, 1.0,
-1.0, 1.0, -1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, -1.0, -1.0, 1.0,
1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0,
-1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, 1.0, -1.0,
-1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0,
1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, -1.0, 1.0, 1.0, 1.0,
1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0,
1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, 1.0,
1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0,
1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0]
Added:
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/python/gnuradio/blksimpl/ofdm_receiver.py
===================================================================
---
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/python/gnuradio/blksimpl/ofdm_receiver.py
(rev 0)
+++
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/python/gnuradio/blksimpl/ofdm_receiver.py
2007-05-31 13:19:20 UTC (rev 5581)
@@ -0,0 +1,155 @@
+#!/usr/bin/env python
+#
+# Copyright 2004,2005,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.
+#
+
+import math
+from gnuradio import gr
+from gnuradio import audio
+from gnuradio.eng_option import eng_option
+from optparse import OptionParser
+
+class ofdm_receiver(gr.hier_block):
+ def __init__(self, fg, fft_length, cp_length, occupied_tones, snr, ks1,
ks2):
+ self.input = gr.add_const_cc(0) # Kluge that goes away with hier_block2
+
+ self.fg = fg
+
+ symbol_length = cp_length + fft_length;
+
+ SNR = 10.0**(snr/10.0)
+ rho = SNR / (SNR + 1.0)
+
+ # ML Sync
+
+ # Energy Detection from ML Sync
+
+ # Create a delay line
+ delayline = [0.0 for i in range(fft_length+1)]
+ delayline[fft_length] = 1.0
+ self.delay = gr.fir_filter_ccf(1,delayline)
+ self.fg.connect(self.input, self.delay)
+
+ # magnitude squared blocks
+ self.magsqrd1 = gr.complex_to_mag_squared()
+ self.magsqrd2 = gr.complex_to_mag_squared()
+ self.adder = gr.add_ff()
+
+ 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)
+
+
+ # Correlation from ML Sync
+ self.conjg = gr.conjugate_cc();
+ self.mixer = gr.multiply_cc();
+
+ movingsum2_taps = [1.0 for i in range(cp_length)]
+ self.movingsum2 = gr.fir_filter_ccf(1,movingsum2_taps)
+
+
+ # 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)
+
+ # 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))
+
+ #ML measurements input to sampler block and detect
+ nco_sensitivity = 1.0/fft_length
+ self.f2c = gr.float_to_complex()
+ self.sampler = gr.ofdm_sampler(fft_length,symbol_length)
+ self.pkt_detect = gr.peak_detector_ff(0.2, 0.25, 30, 0.0001)
+ self.dpll = gr.dpll_ff(float(symbol_length),0.01)
+ self.sample_and_hold = gr.sample_and_hold_ff()
+ self.nco = gr.frequency_modulator_fc(nco_sensitivity)
+ self.inv = gr.multiply_const_ff(-1)
+ 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))
+
+ sample_trigger = 0
+ if sample_trigger:
+ # for testing
+ peak_null = gr.null_sink(gr.sizeof_float)
+ data = 640*[0,]
+ data[639] = 1
+ peak_trigger = gr.vector_source_f(data, True)
+
+ self.fg.connect(self.pkt_detect, peak_null)
+ self.fg.connect(peak_trigger, self.f2c, (self.sampler,1))
+ self.fg.connect(peak_trigger, (self.sample_and_hold,1))
+
+ # use the sync loop values to set the sampler and the NCO
+ # self.diff = theta
+ # self.angle = epsilon
+
+ self.fg.connect(self.diff, self.pkt_detect)
+ use_dpll = 1
+ if not sample_trigger:
+ if use_dpll:
+ self.fg.connect(self.pkt_detect, self.dpll,self.f2c,
(self.sampler,1))
+ self.fg.connect(self.dpll, (self.sample_and_hold,1))
+ if not use_dpll:
+ self.fg.connect(self.pkt_detect, self.f2c, (self.sampler,1))
+ self.fg.connect(self.pkt_detect, (self.sample_and_hold,1))
+
+ self.fg.connect(self.angle, (self.sample_and_hold,0))
+ self.fg.connect(self.sample_and_hold, self.inv, self.nco)
+
+
+ if 1:
+ self.fg.connect(self.diff, gr.file_sink(gr.sizeof_float,
"theta_f.dat"))
+ self.fg.connect(self.angle, gr.file_sink(gr.sizeof_float,
"epsilon_f.dat"))
+ if use_dpll:
+ self.fg.connect(self.dpll, gr.file_sink(gr.sizeof_float,
"dpll_pulses.dat"))
+ if sample_trigger:
+ self.fg.connect(peak_trigger, gr.file_sink(gr.sizeof_float,
"peaks_f.dat"))
+ else:
+ self.fg.connect(self.pkt_detect, gr.file_sink(gr.sizeof_float,
"peaks_f.dat"))
+
+ self.fg.connect(self.sample_and_hold,
gr.file_sink(gr.sizeof_float, "sample_and_hold_f.dat"))
+ self.fg.connect(self.nco, gr.file_sink(gr.sizeof_gr_complex,
"nco_c.dat"))
+ self.fg.connect(self.input, gr.file_sink(gr.sizeof_gr_complex,
"input_c.dat"))
+ self.fg.connect(self.sigmix, gr.file_sink(gr.sizeof_gr_complex,
"output_c.dat"))
+
+
+ win = [1 for i in range(fft_length)]
+
+ self.fft_demod = gr.fft_vcc(fft_length, True, win, True)
+ self.ofdm_corr = gr.ofdm_correlator(occupied_tones, fft_length,
+ cp_length, ks1, ks2)
+
+ self.fg.connect(self.sampler, self.fft_demod, self.ofdm_corr)
+ gr.hier_block.__init__(self, fg, self.input, self.ofdm_corr)
Modified:
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/python/gnuradio/ofdm_packet_utils.py
===================================================================
---
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/python/gnuradio/ofdm_packet_utils.py
2007-05-31 04:25:05 UTC (rev 5580)
+++
gnuradio/branches/features/ofdm/receiver/gnuradio-core/src/python/gnuradio/ofdm_packet_utils.py
2007-05-31 13:19:20 UTC (rev 5581)
@@ -68,9 +68,6 @@
return (''.join(r), padded)
-default_access_code = \
- conv_packed_binary_string_to_1_0_string('\xAC\xDD\xA4\xE2\xF2\x8C\x20\xFC')
-
def is_1_0_string(s):
if not isinstance(s, str):
return False
@@ -99,8 +96,7 @@
return struct.pack('!HH', val, val)
def make_packet(payload, samples_per_symbol, bits_per_symbol,
- access_code=default_access_code, pad_for_usrp=True,
- whitener_offset=0):
+ pad_for_usrp=True, whitener_offset=0):
"""
Build a packet, given access code, payload, and whitener offset
@@ -109,20 +105,14 @@
@type samples_per_symbol: int
@param bits_per_symbol: (needed for padding calculation)
@type bits_per_symbol: int
- @param access_code: string of ascii 0's and 1's
@param whitener_offset offset into whitener string to use [0-16)
Packet will have access code at the beginning, followed by length, payload
and finally CRC-32.
"""
- if not is_1_0_string(access_code):
- raise ValueError, "access_code must be a string containing only 0's
and 1's (%r)" % (access_code,)
-
if not whitener_offset >=0 and whitener_offset < 16:
raise ValueError, "whitener_offset must be between 0 and 15, inclusive
(%i)" % (whitener_offset,)
- (packed_access_code, padded) =
conv_1_0_string_to_packed_binary_string(access_code)
-
payload_with_crc = gru.gen_and_append_crc32(payload)
#print "outbound crc =", string_to_hex_list(payload_with_crc[-4:])
@@ -131,9 +121,7 @@
if L > MAXLEN:
raise ValueError, "len(payload) must be in [0, %d]" % (MAXLEN,)
- #pkt = ''.join((packed_access_code, make_header(L, whitener_offset)),
- # whiten(payload_with_crc, whitener_offset), '\x55'))
- pkt_hd = ''.join((packed_access_code, make_header(L, whitener_offset)))
+ pkt_hd = make_header(L, whitener_offset)
pkt_dt = ''.join((payload_with_crc, '\x55'))
packet_length = len(pkt_hd) + len(pkt_dt)
Modified:
gnuradio/branches/features/ofdm/receiver/gnuradio-examples/python/ofdm/benchmark_ofdm.py
===================================================================
---
gnuradio/branches/features/ofdm/receiver/gnuradio-examples/python/ofdm/benchmark_ofdm.py
2007-05-31 04:25:05 UTC (rev 5580)
+++
gnuradio/branches/features/ofdm/receiver/gnuradio-examples/python/ofdm/benchmark_ofdm.py
2007-05-31 13:19:20 UTC (rev 5581)
@@ -83,8 +83,9 @@
if options.discontinuous:
z = 20000*[0,]
self.zeros = gr.vector_source_c(z, True)
- packet_size = 15*((4+8+4+1500+4) * 8)
- self.mux = gr.stream_mux(gr.sizeof_gr_complex, [packet_size-0,
int(10e5)])
+ packet_size = math.ceil(((4+8+4+options.size+4) * 8) /
options.occupied_tones)
+ sample_size = (packet_size+2) *
(options.fft_length+options.cp_length)
+ self.mux = gr.stream_mux(gr.sizeof_gr_complex,
[int(2*sample_size), int(10e4)])
# Connect components
self.connect(self.txpath, (self.mux,0))
Modified:
gnuradio/branches/features/ofdm/receiver/gnuradio-examples/python/ofdm/ofdm.py
===================================================================
---
gnuradio/branches/features/ofdm/receiver/gnuradio-examples/python/ofdm/ofdm.py
2007-05-31 04:25:05 UTC (rev 5580)
+++
gnuradio/branches/features/ofdm/receiver/gnuradio-examples/python/ofdm/ofdm.py
2007-05-31 13:19:20 UTC (rev 5581)
@@ -103,7 +103,6 @@
symbol_length = self._fft_length + self._cp_length
- win = [1 for i in range(self._fft_length)]
# hard-coded known symbol
ks1 = known_symbols_200_1
@@ -113,9 +112,6 @@
self.ofdm_sync = ofdm_receiver(self.fg, self._fft_length,
symbol_length, self._snr)
# OFDM Demod
- self.fft_demod = gr.fft_vcc(self._fft_length, True, win, True)
- self.ofdm_corr = gr.ofdm_correlator(self._occupied_tones,
self._fft_length,
- self._cp_length, ks1, ks2)
self.ofdm_demod = gr.ofdm_bpsk_demapper(self._occupied_tones)
Modified:
gnuradio/branches/features/ofdm/receiver/gnuradio-examples/python/ofdm/ofdm_receiver.py
===================================================================
---
gnuradio/branches/features/ofdm/receiver/gnuradio-examples/python/ofdm/ofdm_receiver.py
2007-05-31 04:25:05 UTC (rev 5580)
+++
gnuradio/branches/features/ofdm/receiver/gnuradio-examples/python/ofdm/ofdm_receiver.py
2007-05-31 13:19:20 UTC (rev 5581)
@@ -27,12 +27,12 @@
from optparse import OptionParser
class ofdm_receiver(gr.hier_block):
- def __init__(self, fg, fft_length, symbol_length, snr):
+ def __init__(self, fg, fft_length, cp_length, occupied_tones, snr, ks1,
ks2):
self.input = gr.add_const_cc(0) # Kluge that goes away with hier_block2
self.fg = fg
- cpsize = symbol_length - fft_length;
+ symbol_length = cp_length + fft_length;
SNR = 10.0**(snr/10.0)
rho = SNR / (SNR + 1.0)
@@ -52,7 +52,7 @@
self.magsqrd2 = gr.complex_to_mag_squared()
self.adder = gr.add_ff()
- moving_sum_taps = [rho/2 for i in range(cpsize)]
+ 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)
@@ -66,7 +66,7 @@
self.conjg = gr.conjugate_cc();
self.mixer = gr.multiply_cc();
- movingsum2_taps = [1.0 for i in range(cpsize)]
+ movingsum2_taps = [1.0 for i in range(cp_length)]
self.movingsum2 = gr.fir_filter_ccf(1,movingsum2_taps)
@@ -129,7 +129,7 @@
self.fg.connect(self.sample_and_hold, self.inv, self.nco)
- if 0:
+ if 1:
self.fg.connect(self.diff, gr.file_sink(gr.sizeof_float,
"theta_f.dat"))
self.fg.connect(self.angle, gr.file_sink(gr.sizeof_float,
"epsilon_f.dat"))
if use_dpll:
@@ -143,5 +143,13 @@
self.fg.connect(self.nco, gr.file_sink(gr.sizeof_gr_complex,
"nco_c.dat"))
self.fg.connect(self.input, gr.file_sink(gr.sizeof_gr_complex,
"input_c.dat"))
self.fg.connect(self.sigmix, gr.file_sink(gr.sizeof_gr_complex,
"output_c.dat"))
-
- gr.hier_block.__init__(self, fg, self.input, self.sampler)
+
+
+ win = [1 for i in range(fft_length)]
+
+ self.fft_demod = gr.fft_vcc(fft_length, True, win, True)
+ self.ofdm_corr = gr.ofdm_correlator(occupied_tones, fft_length,
+ cp_length, ks1, ks2)
+
+ self.fg.connect(self.sampler, self.fft_demod, self.ofdm_corr)
+ gr.hier_block.__init__(self, fg, self.input, self.ofdm_corr)
Modified:
gnuradio/branches/features/ofdm/receiver/gnuradio-examples/python/ofdm/receive_path.py
===================================================================
---
gnuradio/branches/features/ofdm/receiver/gnuradio-examples/python/ofdm/receive_path.py
2007-05-31 04:25:05 UTC (rev 5580)
+++
gnuradio/branches/features/ofdm/receiver/gnuradio-examples/python/ofdm/receive_path.py
2007-05-31 13:19:20 UTC (rev 5581)
@@ -54,15 +54,10 @@
chan_coeffs = [ 1.0, 0.0, 0 ]
self.chan_filt = gr.fft_filter_ccc(1, chan_coeffs)
- self.ofdm_demod = ofdm.ofdm_demod(fg, options)
-
# receiver
self.packet_receiver = \
- blks.demod_ofdm_pkts(fg,
- self.ofdm_demod,
- access_code=None,
- callback=self._rx_callback,
- threshold=-1)
+ blks.demod_ofdm_pkts(fg, options,
+ callback=self._rx_callback)
# Carrier Sensing Blocks
alpha = 0.001
Modified:
gnuradio/branches/features/ofdm/receiver/gnuradio-examples/python/ofdm/transmit_path.py
===================================================================
---
gnuradio/branches/features/ofdm/receiver/gnuradio-examples/python/ofdm/transmit_path.py
2007-05-31 04:25:05 UTC (rev 5580)
+++
gnuradio/branches/features/ofdm/receiver/gnuradio-examples/python/ofdm/transmit_path.py
2007-05-31 13:19:20 UTC (rev 5581)
@@ -48,7 +48,6 @@
self.packet_transmitter = \
blks.mod_ofdm_pkts(fg,
self.ofdm_mod,
- access_code=None,
msgq_limit=4,
pad_for_usrp=True)
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r5581 - in gnuradio/branches/features/ofdm/receiver: gnuradio-core/src/lib/general gnuradio-core/src/python/gnuradio gnuradio-core/src/python/gnuradio/blksimpl gnuradio-examples/python/ofdm,
trondeau <=