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