commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] r6097 - gnuradio/branches/developers/trondeau/ofdm_mod


From: trondeau
Subject: [Commit-gnuradio] r6097 - gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general
Date: Wed, 1 Aug 2007 11:19:50 -0600 (MDT)

Author: trondeau
Date: 2007-08-01 11:19:50 -0600 (Wed, 01 Aug 2007)
New Revision: 6097

Modified:
   
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.cc
   
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.h
   
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.i
Log:
work in progress: generalizing OFDM demapper to match new general mapper. Works 
for BPSK and QPSK but will not work for other constellations yet.

Modified: 
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.cc
===================================================================
--- 
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.cc
  2007-08-01 17:17:27 UTC (rev 6096)
+++ 
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.cc
  2007-08-01 17:19:50 UTC (rev 6097)
@@ -74,52 +74,35 @@
            d_packetlen, d_packet_whitener_offset);
 }
 
-unsigned char gr_ofdm_frame_sink::bpsk_slicer(gr_complex x)
-{
-  return (unsigned char)(x.real() > 0 ? 0 : 1);
-}
 
-unsigned char gr_ofdm_frame_sink::qpsk_slicer(gr_complex x)
+unsigned char gr_ofdm_frame_sink::slicer(const gr_complex x)
 {
-  unsigned char i = (x.real() > 0 ? 0 : 1);
-  unsigned char q = (x.imag() > 0 ? 0 : 1);
-
-  return (q << 1) | i;
-}
-
-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++);
+  unsigned int table_size = d_sym_value_out.size();
+  unsigned int min_index = 0;
+  float min_euclid_dist = norm(x - d_sym_position[0]);
+  float euclid_dist = 0;
+  
+  for (unsigned int j = 1; j < table_size; j++){
+    euclid_dist = norm(x - d_sym_position[j]);
+    if (euclid_dist < min_euclid_dist){
+      min_euclid_dist = euclid_dist;
+      min_index = j;
     }
-
-    if(d_byte_offset == 8) {
-      out[bytes_produced++] = d_partial_byte;
-      d_byte_offset = 0;
-      d_partial_byte = 0;
-    }
   }
-
-  return bytes_produced;
+  
+  return d_sym_value_out[min_index];
 }
 
-unsigned int gr_ofdm_frame_sink::qpsk_demapper(const gr_complex *in,
-                                              unsigned char *out)
+unsigned int gr_ofdm_frame_sink::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 |= qpsk_slicer(in[i++]) << (d_byte_offset);
-      d_byte_offset += 2;
+      //fprintf(stderr, "%f+j%f  = %d\n", in[i].real(), in[i].imag(), 
slicer(in[i])); 
+      d_partial_byte |= slicer(in[i++]) << (d_byte_offset);
+      d_byte_offset += d_bits_per_carrier;
     }
 
     if(d_byte_offset == 8) {
@@ -132,16 +115,20 @@
   return bytes_produced;
 }
 
+
 gr_ofdm_frame_sink_sptr
-gr_make_ofdm_frame_sink(gr_msg_queue_sptr target_queue, unsigned int 
occupied_carriers,
-                       const std::string &mod)
+gr_make_ofdm_frame_sink(const std::vector<gr_complex> &sym_position, 
+                       const std::vector<unsigned char> &sym_value_out,
+                       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, mod));
+  return gr_ofdm_frame_sink_sptr(new gr_ofdm_frame_sink(sym_position, 
sym_value_out,
+                                                       target_queue, 
occupied_carriers));
 }
 
 
-gr_ofdm_frame_sink::gr_ofdm_frame_sink(gr_msg_queue_sptr target_queue, 
unsigned int occupied_carriers,
-                                      const std::string &mod)
+gr_ofdm_frame_sink::gr_ofdm_frame_sink(const std::vector<gr_complex> 
&sym_position, 
+                                      const std::vector<unsigned char> 
&sym_value_out,
+                                      gr_msg_queue_sptr target_queue, unsigned 
int occupied_carriers)
   : 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)),
@@ -150,15 +137,8 @@
 {
   d_bytes_out = new unsigned char[(int)ceil(d_occupied_carriers/4.0)];
 
-  if(mod == "qpsk") {
-    d_demapper = &gr_ofdm_frame_sink::qpsk_demapper;
-  }
-  else if(mod == "bpsk") {
-    d_demapper = &gr_ofdm_frame_sink::bpsk_demapper;
-  }
-  else {
-    throw std::invalid_argument("Modulation type must be BPSK or QPSK.");  
-  }
+  set_constellation(sym_position, sym_value_out);
+  d_demapper = &gr_ofdm_frame_sink::demapper;
 
   enter_search();
 }
@@ -168,6 +148,23 @@
   delete [] d_bytes_out;
 }
 
+bool
+gr_ofdm_frame_sink::set_constellation(const std::vector<gr_complex> 
&sym_position, 
+                                              const std::vector<unsigned char> 
&sym_value_out)
+{
+  if (sym_position.size() != sym_value_out.size())
+    return false;
+
+  if (sym_position.size()<1)
+    return false;
+
+  d_sym_position  = sym_position;
+  d_sym_value_out = sym_value_out;
+  d_bits_per_carrier = log10(sym_value_out.size()) / log10(2.0);       
+  return true;
+}
+
+
 int
 gr_ofdm_frame_sink::work (int noutput_items,
                          gr_vector_const_void_star &input_items,
@@ -183,7 +180,7 @@
   
   //bytes = bpsk_demapper(&in[0], d_bytes_out);
   bytes = (this->*d_demapper)(&in[0], d_bytes_out);  
-
+  
   switch(d_state) {
       
   case STATE_SYNC_SEARCH:    // Look for flag indicating beginning of pkt

Modified: 
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.h
===================================================================
--- 
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.h
   2007-08-01 17:17:27 UTC (rev 6096)
+++ 
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.h
   2007-08-01 17:19:50 UTC (rev 6097)
@@ -30,8 +30,9 @@
 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,
-                        const std::string &mod);
+gr_make_ofdm_frame_sink (const std::vector<gr_complex> &sym_position, 
+                        const std::vector<unsigned char> &sym_value_out,
+                        gr_msg_queue_sptr target_queue, unsigned int 
occupied_tones);
 
 /*!
  * \brief Takes an OFDM symbol in, demaps it into bits of 0's and 1's, packs
@@ -44,8 +45,9 @@
 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,
-                          const std::string &mod);
+  gr_make_ofdm_frame_sink (const std::vector<gr_complex> &sym_position, 
+                          const std::vector<unsigned char> &sym_value_out,
+                          gr_msg_queue_sptr target_queue, unsigned int 
occupied_tones);
 
  private:
   enum state_t {STATE_SYNC_SEARCH, STATE_HAVE_SYNC, STATE_HAVE_HEADER};
@@ -69,9 +71,14 @@
   int                d_packet_whitener_offset;  // offset into whitener string 
to use
   int               d_packetlen_cnt;           // how many so far
 
+  std::vector<gr_complex>    d_sym_position;
+  std::vector<unsigned char> d_sym_value_out;
+  unsigned int d_bits_per_carrier;
+
  protected:
-  gr_ofdm_frame_sink(gr_msg_queue_sptr target_queue, unsigned int 
occupied_tones,
-                    const std::string &mod);
+  gr_ofdm_frame_sink(const std::vector<gr_complex> &sym_position, 
+                    const std::vector<unsigned char> &sym_value_out,
+                    gr_msg_queue_sptr target_queue, unsigned int 
occupied_tones);
 
   void enter_search();
   void enter_have_sync();
@@ -82,15 +89,14 @@
     // confirm that two copies of header info are identical
     return ((d_header >> 16) ^ (d_header & 0xffff)) == 0;
   }
+  
+  unsigned char slicer(const gr_complex x);
+  unsigned int demapper(const gr_complex *in,
+                       unsigned char *out);
 
-  unsigned char bpsk_slicer(gr_complex x);
-  unsigned int bpsk_demapper(const gr_complex *in,
-                            unsigned char *out);  
+  bool set_constellation(const std::vector<gr_complex> &sym_position, 
+                        const std::vector<unsigned char> &sym_value_out);
 
-  unsigned char qpsk_slicer(gr_complex x);
-  unsigned int qpsk_demapper(const gr_complex *in,
-                            unsigned char *out);
-
   // pointer to mod-specific demapper
   unsigned int (gr_ofdm_frame_sink::*d_demapper)(const gr_complex *in, 
unsigned char *out);
 

Modified: 
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.i
===================================================================
--- 
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.i
   2007-08-01 17:17:27 UTC (rev 6096)
+++ 
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.i
   2007-08-01 17:19:50 UTC (rev 6097)
@@ -23,14 +23,16 @@
 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,
-                       const std::string &mod);
+gr_make_ofdm_frame_sink(const std::vector<gr_complex> &sym_position, 
+                       const std::vector<unsigned char> &sym_value_out,
+                       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,
-                    const std::string &mod);
+  gr_ofdm_frame_sink(const std::vector<gr_complex> &sym_position, 
+                    const std::vector<unsigned char> &sym_value_out,
+                    gr_msg_queue_sptr target_queue, unsigned int 
occupied_tones);
 
  public:
   ~gr_ofdm_frame_sink();





reply via email to

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