commit-gnuradio
[Top][All Lists]
Advanced

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

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


From: trondeau
Subject: [Commit-gnuradio] r6107 - gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general
Date: Fri, 3 Aug 2007 07:20:25 -0600 (MDT)

Author: trondeau
Date: 2007-08-03 07:20:24 -0600 (Fri, 03 Aug 2007)
New Revision: 6107

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_mapper_bcv.cc
   
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/gr_ofdm_mapper_bcv.h
Log:
working constellaton mapper/demapper. OFDM can now use bpsk, qpsk, 8psk, qam8, 
qam16, qam64, and qam256 (if you're daring).

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-03 11:00:58 UTC (rev 6106)
+++ 
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.cc
  2007-08-03 13:20:24 UTC (rev 6107)
@@ -89,7 +89,6 @@
       min_index = j;
     }
   }
-  
   return d_sym_value_out[min_index];
 }
 
@@ -99,13 +98,33 @@
   unsigned int i=0, bytes_produced=0;
 
   while(i < d_occupied_carriers) {
+    if(d_nresid > 0) {
+      d_partial_byte |= d_resid;
+      d_byte_offset += d_nresid;
+      d_nresid = 0;
+      d_resid = 0;
+    }
+
     while((d_byte_offset < 8) && (i < d_occupied_carriers)) {
       //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;
+      unsigned char bits = slicer(in[i++]);
+      if((8 - d_byte_offset) >= d_nbits) {
+       d_partial_byte |= bits << (d_byte_offset);
+       d_byte_offset += d_nbits;
+      }
+      else {
+       d_nresid = d_nbits-(8-d_byte_offset);
+       int mask = ((1<<(8-d_byte_offset))-1);
+       d_partial_byte |= (bits & mask) << d_byte_offset;
+       d_resid = bits >> (8-d_byte_offset);
+       d_byte_offset += (d_nbits - d_nresid);
+      }
+      //printf("demod symbol: %.4f + j%.4f   bits: %x   partial_byte: %x   
byte_offset: %d   resid: %x   nresid: %d\n", 
+      //     in[i-1].real(), in[i-1].imag(), bits, d_partial_byte, 
d_byte_offset, d_resid, d_nresid);
     }
 
     if(d_byte_offset == 8) {
+      //printf("demod byte: %x \n\n", d_partial_byte);
       out[bytes_produced++] = d_partial_byte;
       d_byte_offset = 0;
       d_partial_byte = 0;
@@ -133,13 +152,13 @@
                   gr_make_io_signature2 (2, 2, 
sizeof(gr_complex)*occupied_carriers, sizeof(char)),
                   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)
+    d_byte_offset(0), d_partial_byte(0),
+    d_resid(0), d_nresid(0)
 {
-  d_bytes_out = new unsigned char[(int)ceil(d_occupied_carriers/4.0)];
+  d_bytes_out = new unsigned char[d_occupied_carriers];
 
-  set_constellation(sym_position, sym_value_out);
-  d_demapper = &gr_ofdm_frame_sink::demapper;
-
+  set_sym_value_out(sym_position, sym_value_out);
+  
   enter_search();
 }
 
@@ -149,8 +168,8 @@
 }
 
 bool
-gr_ofdm_frame_sink::set_constellation(const std::vector<gr_complex> 
&sym_position, 
-                                              const std::vector<unsigned char> 
&sym_value_out)
+gr_ofdm_frame_sink::set_sym_value_out(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;
@@ -160,7 +179,8 @@
 
   d_sym_position  = sym_position;
   d_sym_value_out = sym_value_out;
-  d_bits_per_carrier = log10(sym_value_out.size()) / log10(2.0);       
+  d_nbits = (unsigned long)(log10(d_sym_value_out.size()) / log10(2));
+
   return true;
 }
 
@@ -178,8 +198,7 @@
   if (VERBOSE)
     fprintf(stderr,">>> Entering state machine\n");
   
-  //bytes = bpsk_demapper(&in[0], d_bytes_out);
-  bytes = (this->*d_demapper)(&in[0], d_bytes_out);  
+  bytes = demapper(&in[0], d_bytes_out);
   
   switch(d_state) {
       

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-03 11:00:58 UTC (rev 6106)
+++ 
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/gr_ofdm_frame_sink.h
   2007-08-03 13:20:24 UTC (rev 6107)
@@ -73,8 +73,11 @@
 
   std::vector<gr_complex>    d_sym_position;
   std::vector<unsigned char> d_sym_value_out;
-  unsigned int d_bits_per_carrier;
+  unsigned int d_nbits;
 
+  unsigned char d_resid;
+  unsigned int d_nresid;
+
  protected:
   gr_ofdm_frame_sink(const std::vector<gr_complex> &sym_position, 
                     const std::vector<unsigned char> &sym_value_out,
@@ -94,12 +97,9 @@
   unsigned int demapper(const gr_complex *in,
                        unsigned char *out);
 
-  bool set_constellation(const std::vector<gr_complex> &sym_position, 
+  bool set_sym_value_out(const std::vector<gr_complex> &sym_position, 
                         const std::vector<unsigned char> &sym_value_out);
 
-  // pointer to mod-specific demapper
-  unsigned int (gr_ofdm_frame_sink::*d_demapper)(const gr_complex *in, 
unsigned char *out);
-
  public:
   ~gr_ofdm_frame_sink();
 

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-08-03 11:00:58 UTC (rev 6106)
+++ 
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/gr_ofdm_mapper_bcv.cc
  2007-08-03 13:20:24 UTC (rev 6107)
@@ -48,23 +48,18 @@
     d_occupied_carriers(occupied_carriers),
     d_fft_length(fft_length),
     d_bit_offset(0),
-    d_pending_flag(0)
+    d_pending_flag(0),
+    d_resid(0),
+    d_nresid(0)
 {
   if (!(d_occupied_carriers <= d_fft_length))
     throw std::invalid_argument("gr_ofdm_mapper_bcv: occupied carriers must be 
<= fft_length");
 
-  // calculate the number of bits per symbol and the number of
-  // bytes we need to store to calculate the symbols
   d_nbits = (unsigned long)(log10(d_constellation.size()) / log10(2));
-  d_nbytes = 1;
-  while((8*d_nbytes % d_nbits) > 0)
-    d_nbytes++;
-  d_msgbytes = new unsigned char[d_nbytes];
 }
 
 gr_ofdm_mapper_bcv::~gr_ofdm_mapper_bcv(void)
 {
-  delete [] d_msgbytes;
 }
 
 int gr_ofdm_mapper_bcv::randsym()
@@ -79,7 +74,7 @@
 {
   gr_complex *out = (gr_complex *)output_items[0];
   
-  unsigned int i=0, k=0;
+  unsigned int i=0;
   unsigned int unoccupied_carriers = d_fft_length - d_occupied_carriers;
   unsigned int zeros_on_left = (unsigned)ceil(unoccupied_carriers/2.0);
 
@@ -111,34 +106,66 @@
   memset(out, 0, d_fft_length*sizeof(gr_complex));
   
   i = 0;
+  unsigned char bits = 0;
   while((d_msg_offset < d_msg->length()) && (i < d_occupied_carriers)) {
-    k = 0;
-      
+    
     // need new data to process
     if(d_bit_offset == 0) {
-      unsigned int n = std::min(d_nbytes, d_msg->length() - d_msg_offset);
-      memcpy(d_msgbytes, &d_msg->msg()[d_msg_offset], n);
-      d_msg_offset += n;
-      d_bit_offset = 0;
+      d_msgbytes = d_msg->msg()[d_msg_offset];
+      //printf("mod message byte: %x\n", d_msgbytes);
     }
-    
-    unsigned int bit = 0;
-    unsigned int byte_offset = (int)(d_bit_offset / 8);
-    while(k < d_nbits) {
-      bit |= ((d_msgbytes[byte_offset] >> (d_bit_offset - (8*byte_offset))) & 
0x01) << k;
-      d_bit_offset++;
-      k++;
+
+    if(d_nresid > 0) {
+      d_resid |= (((1 << d_nresid)-1) & d_msgbytes) << (d_nbits - d_nresid);
+      bits = d_resid;
+
+      out[i + zeros_on_left] = d_constellation[bits];
+      i++;
+
+      d_bit_offset += d_nresid;
+      d_nresid = 0;
+      d_resid = 0;
+      //printf("mod bit(r): %x   resid: %x   nresid: %d    bit_offset: %d\n", 
+      //     bits, d_resid, d_nresid, d_bit_offset);
     }
-    out[i + zeros_on_left] = d_constellation[bit];
-    i++;
-
-    if(d_bit_offset == 8*d_nbytes) {
+    else {
+      if((8 - d_bit_offset) >= d_nbits) {
+       bits = ((1 << d_nbits)-1) & (d_msgbytes >> d_bit_offset);
+       d_bit_offset += d_nbits;
+       
+       out[i + zeros_on_left] = d_constellation[bits];
+       i++;
+       
+       /*
+       printf("mod bit: %x  out: %.4f + j%.4f    resid: %x   nresid: %d    
bit_offset: %d\n", 
+              bits, out[i-1 + zeros_on_left].real(), out[i-1 + 
zeros_on_left].imag(), 
+              d_resid, d_nresid, d_bit_offset);
+       */
+      }
+      else {
+       unsigned int extra = 8-d_bit_offset;
+       d_resid = ((1 << extra)-1) & (d_msgbytes >> d_bit_offset);
+       d_bit_offset += extra;
+       d_nresid = d_nbits - extra;
+      }
+      
+    }
+            
+    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()) {
+    if(d_nresid > 0) {
+      d_resid |= 0x00;
+      bits = d_resid;
+      d_nresid = 0;
+      d_resid = 0;
+    }
+
     while(i < d_occupied_carriers) {   // finish filling out the symbol
       out[i + zeros_on_left] = d_constellation[randsym()];
       i++;
@@ -147,7 +174,7 @@
     if (d_msg->type() == 1)            // type == 1 sets EOF
       d_eof = true;
     d_msg.reset();                     // finished packet, free message
-    assert(d_bit_offset % d_nbits == 0);
+    assert(d_bit_offset == 0);
   }
 
   if (out_flag)

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-08-03 11:00:58 UTC (rev 6106)
+++ 
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/gr_ofdm_mapper_bcv.h
   2007-08-03 13:20:24 UTC (rev 6107)
@@ -63,8 +63,10 @@
   int                  d_pending_flag;
 
   unsigned long  d_nbits;
-  unsigned long  d_nbytes;
-  unsigned char *d_msgbytes;
+  unsigned char  d_msgbytes;
+  
+  unsigned char d_resid;
+  unsigned int d_nresid;
 
   int randsym();
 





reply via email to

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