[Top][All Lists]
[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:
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r6031 - gnuradio/branches/developers/trondeau/ofdm_mod/gnuradio-core/src/lib/general,
trondeau <=