commit-gnuradio
[Top][All Lists]
Advanced

[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)
 





reply via email to

[Prev in Thread] Current Thread [Next in Thread]