[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] r5969 - in gnuradio/branches/developers/trondeau/ofdm_
From: |
trondeau |
Subject: |
[Commit-gnuradio] r5969 - in gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src: lib/general python/gnuradio/blksimpl |
Date: |
Sun, 15 Jul 2007 16:01:20 -0600 (MDT) |
Author: trondeau
Date: 2007-07-15 16:01:19 -0600 (Sun, 15 Jul 2007)
New Revision: 5969
Modified:
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/general.i
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/gr_ofdm_mapper_bcv.cc
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/gr_ofdm_mapper_bcv.h
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/gr_ofdm_mapper_bcv.i
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/python/gnuradio/blksimpl/ofdm.py
Log:
progress towards generalized constellation mapping. Need to work on
representation a bit more and look at warnings being generated.
Modified:
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/general.i
===================================================================
---
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/general.i
2007-07-15 18:21:23 UTC (rev 5968)
+++
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/general.i
2007-07-15 22:01:19 UTC (rev 5969)
@@ -96,6 +96,7 @@
#include <gr_ofdm_correlator.h>
#include <gr_ofdm_cyclic_prefixer.h>
#include <gr_ofdm_bpsk_demapper.h>
+#include <gr_ofdm_mapper_bcv.h>
#include <gr_ofdm_bpsk_mapper.h>
#include <gr_ofdm_qpsk_mapper.h>
#include <gr_ofdm_qam_mapper.h>
@@ -203,6 +204,7 @@
%include "gr_ofdm_correlator.i"
%include "gr_ofdm_cyclic_prefixer.i"
%include "gr_ofdm_bpsk_demapper.i"
+%include "gr_ofdm_mapper_bcv.i"
%include "gr_ofdm_bpsk_mapper.i"
%include "gr_ofdm_qpsk_mapper.i"
%include "gr_ofdm_qam_mapper.i"
Modified:
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/gr_ofdm_mapper_bcv.cc
===================================================================
---
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/gr_ofdm_mapper_bcv.cc
2007-07-15 18:21:23 UTC (rev 5968)
+++
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/gr_ofdm_mapper_bcv.cc
2007-07-15 22:01:19 UTC (rev 5969)
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2004,2005 Free Software Foundation, Inc.
+ * Copyright 2006,2007 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -20,22 +20,121 @@
* Boston, MA 02110-1301, USA.
*/
+
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <gr_ofdm_mapper_bcv.h>
#include <gr_io_signature.h>
+#include <stdexcept>
+gr_ofdm_mapper_bcv_sptr
+gr_make_ofdm_mapper_bcv (const std::vector<gr_complex> &constellation,
unsigned int msgq_limit,
+ unsigned int occupied_carriers, unsigned int
fft_length)
+{
+ return gr_ofdm_mapper_bcv_sptr (new gr_ofdm_mapper_bcv (constellation,
msgq_limit,
+ occupied_carriers,
fft_length));
+}
+
+// Consumes 1 packet and produces as many OFDM symbols of fft_length to hold
the full packet
+gr_ofdm_mapper_bcv::gr_ofdm_mapper_bcv (const std::vector<gr_complex>
&constellation, unsigned int msgq_limit,
+ unsigned int occupied_carriers,
unsigned int fft_length)
+ : gr_sync_block ("ofdm_mapper_bcv",
+ gr_make_io_signature (0, 0, 0),
+ gr_make_io_signature2 (1, 2, sizeof(gr_complex)*fft_length,
sizeof(char))),
+ d_constellation(constellation),
+ d_msgq(gr_make_msg_queue(msgq_limit)), d_msg_offset(0), d_eof(false),
+ d_occupied_carriers(occupied_carriers),
+ d_fft_length(fft_length),
+ d_bit_offset(0),
+ d_pending_flag(0)
+{
+ if (!(d_occupied_carriers <= d_fft_length))
+ throw std::invalid_argument("gr_ofdm_mapper_bcv: occupied carriers must be
<= fft_length");
+}
+
gr_ofdm_mapper_bcv::~gr_ofdm_mapper_bcv(void)
{
}
-gr_ofdm_mapper_bcv::gr_ofdm_mapper_bcv (unsigned bits_per_symbol,unsigned int
vlen)
- : gr_sync_decimator ("ofdm_mapper_bcv",
- gr_make_io_signature (1, 1, sizeof(unsigned char)),
- gr_make_io_signature (1, 1, sizeof(gr_complex)*vlen),
- bits_per_symbol)
+int gr_ofdm_mapper_bcv::randsym()
{
+ return (rand() % d_constellation.size());
}
+int
+gr_ofdm_mapper_bcv::work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+{
+ gr_complex *out = (gr_complex *)output_items[0];
+
+ unsigned int i=0, k=0;
+ unsigned int unoccupied_carriers = d_fft_length - d_occupied_carriers;
+ unsigned int zeros_on_left = (unsigned)ceil(unoccupied_carriers/2.0);
+
+ //printf("OFDM BPSK Mapper: ninput_items: %d noutput_items: %d\n",
ninput_items[0], noutput_items);
+
+ if(d_eof) {
+ return -1;
+ }
+
+ if(!d_msg) {
+ d_msg = d_msgq->delete_head(); // block, waiting for a message
+ d_msg_offset = 0;
+ d_bit_offset = 0;
+ d_pending_flag = 1; // new packet, write start
of packet flag
+
+ if((d_msg->length() == 0) && (d_msg->type() == 1)) {
+ d_msg.reset();
+ return -1; // We're done; no more messages coming.
+ }
+ }
+
+ char *out_flag = 0;
+ if(output_items.size() == 2)
+ out_flag = (char *) output_items[1];
+
+
+ // Build a single symbol:
+
+ unsigned int nbits = log10(d_constellation.size()) / log10(2);
+
+ // Initialize all bins to 0 to set unused carriers
+ memset(out, 0, d_fft_length*sizeof(gr_complex));
+
+ i = 0;
+ while((d_msg_offset < d_msg->length()) && (i < d_occupied_carriers)) {
+ unsigned int bit = 0;
+ for(k = 0; k < nbits; k++) {
+ bit |= ((d_msg->msg()[d_msg_offset] >> (d_bit_offset)) & 0x01) << k;
+ d_bit_offset++;
+ }
+ out[i + zeros_on_left] = d_constellation[bit];
+ i++;
+ if(d_bit_offset == 8) {
+ d_bit_offset = 0;
+ d_msg_offset++;
+ }
+ }
+
+ // Ran out of data to put in symbol
+ if (d_msg_offset == d_msg->length()) {
+ while(i < d_occupied_carriers) { // finish filling out the symbol
+ out[i + zeros_on_left] = d_constellation[randsym()];
+ i++;
+ }
+
+ if (d_msg->type() == 1) // type == 1 sets EOF
+ d_eof = true;
+ d_msg.reset(); // finished packet, free message
+ assert(d_bit_offset == 0);
+ }
+
+ if (out_flag)
+ out_flag[0] = d_pending_flag;
+ d_pending_flag = 0;
+
+ return 1; // produced symbol
+}
Modified:
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/gr_ofdm_mapper_bcv.h
===================================================================
---
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/gr_ofdm_mapper_bcv.h
2007-07-15 18:21:23 UTC (rev 5968)
+++
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/gr_ofdm_mapper_bcv.h
2007-07-15 22:01:19 UTC (rev 5969)
@@ -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
*
@@ -23,15 +23,17 @@
#ifndef INCLUDED_GR_OFDM_MAPPER_BCV_H
#define INCLUDED_GR_OFDM_MAPPER_BCV_H
-#include <gr_sync_decimator.h>
+#include <gr_sync_block.h>
+#include <gr_message.h>
+#include <gr_msg_queue.h>
class gr_ofdm_mapper_bcv;
typedef boost::shared_ptr<gr_ofdm_mapper_bcv> gr_ofdm_mapper_bcv_sptr;
gr_ofdm_mapper_bcv_sptr
-gr_make_ofdm_mapper_bcv (unsigned int bits_per_symbol, unsigned int vlen);
+gr_make_ofdm_mapper_bcv (const std::vector<gr_complex> &constellation,
unsigned msgq_limit,
+ unsigned occupied_carriers, unsigned int fft_length);
-
/*!
* \brief take a stream of bytes in and map to a vector of complex
* constellation points suitable for IFFT input to be used in an ofdm
@@ -39,18 +41,38 @@
*
*/
-class gr_ofdm_mapper_bcv : public gr_sync_decimator
+class gr_ofdm_mapper_bcv : public gr_sync_block
{
friend gr_ofdm_mapper_bcv_sptr
- gr_make_ofdm_mapper_bcv (unsigned int bits_per_symbol, unsigned int vlen);
+ gr_make_ofdm_mapper_bcv (const std::vector<gr_complex> &constellation,
unsigned msgq_limit,
+ unsigned occupied_carriers, unsigned int fft_length);
+ protected:
+ gr_ofdm_mapper_bcv (const std::vector<gr_complex> &constellation, unsigned
msgq_limit,
+ unsigned occupied_carriers, unsigned int fft_length);
-protected:
- gr_ofdm_mapper_bcv (unsigned int bits_per_symbol, unsigned int vlen);
+ private:
+ std::vector<gr_complex> d_constellation;
+ gr_msg_queue_sptr d_msgq;
+ gr_message_sptr d_msg;
+ unsigned d_msg_offset;
+ bool d_eof;
+
+ unsigned int d_occupied_carriers;
+ unsigned int d_fft_length;
+ unsigned int d_bit_offset;
+ int d_pending_flag;
-public:
+ int randsym();
+
+ public:
~gr_ofdm_mapper_bcv(void);
-};
+ gr_msg_queue_sptr msgq() const { return d_msgq; }
+ int work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+};
+
#endif
Modified:
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/gr_ofdm_mapper_bcv.i
===================================================================
---
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/gr_ofdm_mapper_bcv.i
2007-07-15 18:21:23 UTC (rev 5968)
+++
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/gr_ofdm_mapper_bcv.i
2007-07-15 22:01:19 UTC (rev 5969)
@@ -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
*
@@ -20,17 +20,27 @@
* Boston, MA 02110-1301, USA.
*/
-GR_SWIG_BLOCK_MAGIC(gr,ofdm_mapper_bcv)
+GR_SWIG_BLOCK_MAGIC(gr,ofdm_mapper_bcv);
gr_ofdm_mapper_bcv_sptr
-gr_make_ofdm_mapper_bcv (unsigned int bits_per_symbol,
- unsigned int vlen);
+gr_make_ofdm_mapper_bcv (const std::vector<gr_complex> &constellation,
+ unsigned int msgq_limit,
+ unsigned int bits_per_symbol,
+ unsigned int fft_length);
-class gr_ofdm_mapper_bcv : public gr_sync_decimator
+
+class gr_ofdm_mapper_bcv : public gr_sync_block
{
protected:
- gr_ofdm_mapper_bcv (unsigned int bits_per_symbol,
- unsigned int vlen);
-
+ gr_ofdm_mapper_bcv (const std::vector<gr_complex> &constellation,
+ unsigned int msgq_limit,
+ unsigned int bits_per_symbol,
+ unsigned int fft_length);
+
public:
+ gr_msg_queue_sptr msgq();
+
+ int work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
};
Modified:
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/python/gnuradio/blksimpl/ofdm.py
===================================================================
---
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/python/gnuradio/blksimpl/ofdm.py
2007-07-15 18:21:23 UTC (rev 5968)
+++
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/python/gnuradio/blksimpl/ofdm.py
2007-07-15 22:01:19 UTC (rev 5969)
@@ -24,6 +24,7 @@
from numpy import fft
from gnuradio import gr, ofdm_packet_utils
import gnuradio.gr.gr_threading as _threading
+import psk, qam
from gnuradio.blksimpl.ofdm_receiver import ofdm_receiver
@@ -82,14 +83,15 @@
symbol_length = options.fft_length + options.cp_length
- # The next step will all us to pass a constellation into a generic
mapper function instead
- # of using these hard-coded versions
- if self._modulation == "bpsk":
- self._pkt_input = gr.ofdm_bpsk_mapper(msgq_limit,
options.occupied_tones, options.fft_length)
- elif self._modulation == "qpsk":
- self._pkt_input = gr.ofdm_qpsk_mapper(msgq_limit,
options.occupied_tones, options.fft_length)
- else:
- print "Modulation type not supported (must be \"bpsk\" or \"qpsk\""
+ mods = {"bpsk": 2, "qpsk": 4, "8psk": 8}
+ order = mods[self._modulation]
+
+ const = list()
+ for c in psk.constellation[order]:
+ const.append(-1*c)
+ print const
+ self._pkt_input = gr.ofdm_mapper_bcv(const, msgq_limit,
+ options.occupied_tones,
options.fft_length)
self.preambles = gr.ofdm_insert_preamble(self._fft_length,
padded_preambles)
self.ifft = gr.fft_vcc(self._fft_length, False, win, True)
@@ -104,7 +106,8 @@
self._print_verbage()
if options.log:
- fg.connect(self._pkt_input,
gr.file_sink(gr.sizeof_gr_complex*options.fft_length, "ofdm_mapper_c.dat"))
+ fg.connect(self._pkt_input,
gr.file_sink(gr.sizeof_gr_complex*options.fft_length,
+ "ofdm_mapper_c.dat"))
gr.hier_block.__init__(self, fg, None, self.scale)
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r5969 - in gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src: lib/general python/gnuradio/blksimpl,
trondeau <=