commit-gnuradio
[Top][All Lists]
Advanced

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

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


From: trondeau
Subject: [Commit-gnuradio] r6031 - gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general
Date: Thu, 19 Jul 2007 16:13:40 -0600 (MDT)

Author: trondeau
Date: 2007-07-19 16:13:38 -0600 (Thu, 19 Jul 2007)
New Revision: 6031

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.h
Log:
new mapper for more generalized constellations. BPSK and QPSK work, 8PSK 
modulator looks good; will need to be fully tested when the demapper is written 
for it.

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-19 22:12:15 UTC (rev 6030)
+++ 
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/gr_ofdm_mapper_bcv.cc
  2007-07-19 22:13:38 UTC (rev 6031)
@@ -52,10 +52,19 @@
 {
   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()
@@ -98,24 +107,34 @@
   
 
   // 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)) {
+    k = 0;
+      
+    // need new data to process
+    if(d_bit_offset == 0) {
+      unsigned int n;
+      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;
+    }
+    
     unsigned int bit = 0;
-    for(k = 0; k < nbits; k++) {
-      bit |= ((d_msg->msg()[d_msg_offset] >> (d_bit_offset)) & 0x01) << k;
+    unsigned 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++;
     }
     out[i + zeros_on_left] = d_constellation[bit];
     i++;
-    if(d_bit_offset == 8) {
+
+    if(d_bit_offset == 8*d_nbytes) {
       d_bit_offset = 0;
-      d_msg_offset++;
     }
   }
 
@@ -129,7 +148,7 @@
     if (d_msg->type() == 1)            // type == 1 sets EOF
       d_eof = true;
     d_msg.reset();                     // finished packet, free message
-    assert(d_bit_offset == 0);
+    assert(d_bit_offset % d_nbits == 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-07-19 22:12:15 UTC (rev 6030)
+++ 
gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general/gr_ofdm_mapper_bcv.h
   2007-07-19 22:13:38 UTC (rev 6031)
@@ -62,6 +62,10 @@
   unsigned int                 d_bit_offset;
   int                  d_pending_flag;
 
+  unsigned long  d_nbits;
+  unsigned long  d_nbytes;
+  unsigned char *d_msgbytes;
+
   int randsym();
 
  public:





reply via email to

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