10 #include <arpa/inet.h>
11 #include <boost/crc.hpp>
38 int num_symbols = std::ceil(
39 double((16 + 8 * (length + 4 ) + 6 )) /
40 double(rate_params.
dbps));
53 int length = payload.size();
54 int num_symbols = std::ceil(
55 double((16 + 8 * (length + 4 ) + 6 )) /
56 double(rate_params.
dbps));
67 std::vector<std::complex<double> > header_samples =
encoder_header();
68 std::vector<std::complex<double> > payload_samples =
encode_data();
69 std::vector<std::complex<double> > ppdu_samples = std::vector<std::complex<double> >(header_samples.size() + payload_samples.size());
70 memcpy(&ppdu_samples[0], &header_samples[0], header_samples.size() *
sizeof(std::complex<double>));
71 memcpy(&ppdu_samples[48], payload_samples.data(), payload_samples.size() *
sizeof(std::complex<double>));
85 unsigned int header_field = 0;
89 if(
parity(header_field) == 1) header_field |= 131072;
93 unsigned char header_bytes[4];
94 unsigned int h = htonl(header_field) >> 8;
95 memcpy(header_bytes, &h, 3);
98 std::vector<unsigned char> header_symbols(48 );
100 v.
conv_encode(header_bytes, &header_symbols[0], 18 );
118 int num_symbols = std::ceil(
119 double((16 + 8 * (
payload.size() + 4 ) + 6 )) /
120 double(rate_params.
dbps));
123 int num_data_bits = num_symbols * rate_params.
dbps;
124 int num_data_bytes = num_data_bits / 8;
126 unsigned short service_field = 0;
129 std::vector<unsigned char> data(num_data_bytes+1, 0);
130 memcpy(&data[0], &service_field, 2);
134 boost::crc_32_type crc;
135 crc.process_bytes(&data[0], 2 +
payload.size());
136 unsigned int calculated_crc = crc.checksum();
137 memcpy(&data[2 +
payload.size()], &calculated_crc, 4);
140 std::vector<unsigned char> scrambled(num_data_bytes+1, 0);
141 int state = 93, feedback = 0;
142 for(
int x = 0; x < num_data_bytes; x++)
144 feedback = (!!(state & 64)) ^ (!!(state & 8));
145 scrambled[x] = feedback ^ data[x];
146 state = ((state << 1) & 0x7E) | feedback;
148 data.swap(scrambled);
151 std::vector<unsigned char> data_encoded(num_data_bits * 2, 0);
153 v.
conv_encode(&data[0], data_encoded.data(), num_data_bits-6);
164 return data_modulated;
170 assert(samples.size() == 48);
179 std::vector<unsigned char> header_bytes(4);
181 v.
conv_decode(deinterleaved.data(), header_bytes.data(), 18 );
184 unsigned int header_field;
185 memcpy(&header_field, &header_bytes[0], 3);
186 header_field = htonl(header_field) >> 8;
187 int par =
parity(header_field);
194 unsigned char rate_field = ((header_field >> 19) & 0xF);
195 unsigned int length = ((header_field >> 6) & 0xFFF);
198 bool valid_rate =
false;
207 int num_symbols = std::ceil(
208 double((16 + 8 * (length + 4 ) + 6 )) /
209 double(rate_params.
dbps));
229 int num_symbols = std::ceil(
231 double(rate_params.
dbps));
234 int num_data_bits = num_symbols * rate_params.
dbps;
235 int num_data_bytes = num_data_bits / 8;
248 int data_bytes = data_bits / 8 + 1;
249 data_bits = num_data_bits - 6;
250 data_bytes = num_data_bytes;
251 std::vector<unsigned char> decoded(data_bytes);
253 v.
conv_decode(&depunctured[0], &decoded[0], data_bits);
256 std::vector<unsigned char> descrambled(num_data_bytes+1, 0);
257 int state = 93, feedback = 0;
258 for(
int x = 0; x < num_data_bytes; x++)
260 feedback = (!!(state & 64)) ^ (!!(state & 8));
261 descrambled[x] = feedback ^ decoded[x];
262 state = ((state << 1) & 0x7E) | feedback;
264 decoded.swap(descrambled);
267 boost::crc_32_type crc;
269 unsigned int calculated_crc = crc.checksum();
270 unsigned int given_crc = 0;
274 if(given_crc != calculated_crc)
276 std::cerr <<
"Invalid CRC (length " <<
header.
length <<
")" << std::endl;