48 "QAM::set_M(): M = " <<
M <<
" is not an even power of 2");
51 double average_energy = (
M - 1) * 2.0 / 3.0;
60 for (
int i = 0; i <
L; i++) {
61 for (
int j = 0; j <
L; j++) {
65 gray_code.get_row(j)));
79 out.set_size(
k*signal.size(),
false);
81 int temp_real, temp_imag;
83 for (
int i = 0; i < signal.size(); i++) {
90 else if (temp_real > (
L - 1))
94 else if (temp_imag > (
L - 1))
96 out.replace_mid(
k*i,
bitmap.get_row(temp_imag *
L + temp_real));
123 double epsilon = delta / 10000.0;
124 std::complex<double> symb;
125 for (
int i = 0; i <
M; i++) {
126 symb = std::complex<double>(std::polar(1.0, delta * i));
127 if (std::fabs(
std::real(symb)) < epsilon) {
130 else if (std::fabs(
std::imag(symb)) < epsilon) {
152 out.set_size(
k*signal.size(),
false);
154 for (
int i = 0; i < signal.size(); i++) {
156 temp = (ang < 0) ? (
m_2pi + ang) : ang;
158 out.replace_mid(i*
k,
bitmap.get_row(est_symbol));
177 soft_bits.set_size(
k * rx_symbols.size());
178 std::complex<double> temp;
180 std::complex<double> exp_pi4 = std::complex<double>(
std::cos(
pi / 4),
182 for (
int i = 0; i < rx_symbols.size(); i++) {
183 temp = rx_symbols(i) * exp_pi4;
184 soft_bits((i << 1) + 1) =
std::real(temp) * factor;
185 soft_bits(i << 1) =
std::imag(temp) * factor;
199 double N0, vec &soft_bits,
202 soft_bits.set_size(2*rx_symbols.size(),
false);
203 std::complex<double> temp;
205 std::complex<double> exp_pi4 = std::complex<double>(
std::cos(
pi / 4),
207 for (
int i = 0; i < rx_symbols.size(); i++) {
208 temp = rx_symbols(i) *
std::conj(channel(i)) * exp_pi4;
209 soft_bits((i << 1) + 1) =
std::real(temp) * factor;
210 soft_bits(i << 1) =
std::imag(temp) * factor;
229 out.set_size(bits.size(),
false);
230 for (
int i = 0; i < bits.size(); i++) {
231 out(i) = (bits(i) == 0 ? 1.0 : -1.0);
237 cvec out(bits.size());
245 out.set_size(signal.size(),
false);
246 for (
int i = 0; i < signal.length(); i++) {
253 bvec out(signal.size());
262 double factor = 4 / N0;
263 soft_bits.set_size(rx_symbols.size(),
false);
265 for (
int i = 0; i < rx_symbols.size(); i++) {
266 soft_bits(i) = factor *
std::real(rx_symbols(i));
281 double N0, vec &soft_bits,
284 double factor = 4 / N0;
285 soft_bits.set_size(rx_symbols.size(),
false);
287 for (
int i = 0; i < rx_symbols.size(); i++) {
307 out.set_size(bits.size(),
false);
308 for (
int i = 0; i < bits.size(); i++) {
309 out(i) = (bits(i) == 0 ? 1.0 : -1.0);
315 vec out(bits.size());
323 out.set_size(signal.size(),
false);
324 for (
int i = 0; i < signal.length(); i++) {
325 out(i) = (signal(i) > 0) ?
bin(0) :
bin(1);
331 bvec out(signal.size());
340 double factor = 4 / N0;
341 soft_bits.set_size(rx_symbols.size(),
false);
343 for (
int i = 0; i < rx_symbols.size(); i++) {
344 soft_bits(i) = factor * rx_symbols(i);
358 double N0, vec &soft_bits,
361 double factor = 4 / N0;
362 soft_bits.set_size(rx_symbols.size(),
false);
364 for (
int i = 0; i < rx_symbols.size(); i++) {
365 soft_bits(i) = factor * (rx_symbols(i) * channel(i));
391 double average_energy = (
sqr(
M) - 1) / 3.0;
394 for (
int i = 0; i <
M; i++) {
409 out.set_size(
k*signal.size(),
false);
411 for (
int i = 0; i < signal.size(); i++) {
416 else if (est_symbol > (
M - 1))
418 out.replace_mid(i*
k,
bitmap.get_row(est_symbol));
424 bvec temp(signal.size());
434 double P0, P1, d0min, d1min, temp;
437 soft_bits.set_size(
k * rx_symbols.size());
440 for (
int l = 0; l < rx_symbols.size(); l++) {
441 for (
int j = 0; j <
M; j++) {
445 for (
int i = 0; i <
k; i++) {
447 for (
int j = 0; j < (M >> 1); j++) {
448 P0 += metric(
S0(i, j));
449 P1 += metric(
S1(i, j));
456 for (
int l = 0; l < rx_symbols.size(); l++) {
457 for (
int j = 0; j <
M; j++) {
460 for (
int i = 0; i <
k; i++) {
462 for (
int j = 0; j < (M >> 1); j++) {
463 temp = metric(
S0(i, j));
464 if (temp < d0min) { d0min = temp; }
465 temp = metric(
S1(i, j));
466 if (temp < d1min) { d1min = temp; }
468 soft_bits(l*k + i) = (-d0min + d1min) / N0;
484 double N0, vec &soft_bits,
488 double P0, P1, d0min, d1min, temp;
491 soft_bits.set_size(
k * rx_symbols.size());
494 for (
int l = 0; l < rx_symbols.size(); l++) {
495 for (
int j = 0; j <
M; j++) {
497 - channel(l) *
symbols(j))) / N0);
499 for (
int i = 0; i <
k; i++) {
501 for (
int j = 0; j < (M >> 1); j++) {
502 P0 += metric(
S0(i, j));
503 P1 += metric(
S1(i, j));
510 for (
int l = 0; l < rx_symbols.size(); l++) {
511 for (
int j = 0; j <
M; j++) {
514 for (
int i = 0; i <
k; i++) {
516 for (
int j = 0; j < (M >> 1); j++) {
517 temp = metric(
S0(i, j));
518 if (temp < d0min) { d0min = temp; }
519 temp = metric(
S1(i, j));
520 if (temp < d1min) { d1min = temp; }
522 soft_bits(l*k + i) = (-d0min + d1min) / N0;
550 double average_energy = (
sqr(
M) - 1) / 3.0;
553 for (
int i = 0; i <
M; i++) {
568 out.set_size(
k*signal.size(),
false);
570 for (
int i = 0; i < signal.size(); i++) {
574 else if (est_symbol > (
M - 1))
576 out.replace_mid(i*
k,
bitmap.get_row(est_symbol));
582 bvec temp(signal.size());