111 virtual void modulate(
const ivec& symbolnumbers,
Vec<T>& output)
const;
216 double N0, vec& soft_bits,
272 setup_done(false), k(0), M(0), bitmap(
""), bits2symbols(
""), symbols(
""),
278 set(symbols, bits2symbols);
285 "Modulator<T>::set(): Number of symbols and bits2symbols does not match");
287 "Modulator<T>::set(): Number of symbols needs to be even and non-zero");
288 it_assert((
max(in_bits2symbols) == in_bits2symbols.size() - 1)
289 && (
min(in_bits2symbols) == 0),
"Modulator<T>::set(): Improper bits2symbol vector");
290 symbols = in_symbols;
291 bits2symbols = in_bits2symbols;
292 M = bits2symbols.
size();
294 bitmap.set_size(M, k);
295 for (
int m = 0; m < M; m++) {
296 bitmap.set_row(bits2symbols(m),
dec2bin(k, m));
298 calculate_softbit_matrices();
306 it_assert_debug(setup_done,
"Modulator<T>::modulate(): Modulator not ready.");
307 output.
set_size(symbolnumbers.length());
308 for (
int i = 0; i < symbolnumbers.length(); i++)
309 output(i) = symbols(symbolnumbers(i));
315 Vec<T> output(symbolnumbers.length());
316 modulate(symbolnumbers, output);
324 it_assert_debug(setup_done,
"Modulator<T>::demodulate(): Modulator not ready.");
325 double dist, mindist;
327 output.set_size(signal.
size());
329 for (
int i = 0; i < signal.
size(); i++) {
330 mindist =
std::abs(symbols(0) - signal(i));
332 for (
int j = 1; j < M; j++) {
333 dist =
std::abs(symbols(j) - signal(i));
334 if (dist < mindist) {
346 ivec output(signal.
length());
347 demodulate(signal, output);
355 it_assert_debug(setup_done,
"Modulator<T>::modulate_bits(): Modulator not ready.");
358 if (bits.length() % k) {
359 it_warning(
"Modulator<T>::modulate_bits(): The number of input bits is not a multiple of k (number of bits per symbol). Remainder bits are not modulated.");
361 int no_symbols = bits.length() / k;
363 for (
int i = 0; i < no_symbols; i++) {
364 output(i) = symbols(bits2symbols(
bin2dec(bits.mid(i * k, k))));
372 modulate_bits(bits, output);
379 it_assert_debug(setup_done,
"Modulator<T>::demodulate_bist(): Modulator not ready.");
380 double dist, mindist;
382 bits.set_size(k*signal.
size());
384 for (
int i = 0; i < signal.
size(); i++) {
385 mindist =
std::abs(symbols(0) - signal(i));
387 for (
int j = 1; j < M; j++) {
388 dist =
std::abs(symbols(j) - signal(i));
389 if (dist < mindist) {
394 bits.replace_mid(i*k, bitmap.get_row(closest));
402 demodulate_bits(signal, bits);
412 it_assert_debug(setup_done,
"Modulator<T>::demodulate_soft_bits(): Modulator not ready.");
413 double P0, P1, d0min, d1min, temp;
416 soft_bits.set_size(k * rx_symbols.
size());
419 for (
int l = 0; l < rx_symbols.
size(); l++) {
420 for (
int j = 0; j < M; j++) {
421 metric(j) =
std::exp(-
sqr(rx_symbols(l) - symbols(j)) / N0);
423 for (
int i = 0; i < k; i++) {
425 for (
int j = 0; j < (M >> 1); j++) {
426 P0 += metric(S0(i, j));
427 P1 += metric(S1(i, j));
434 for (
int l = 0; l < rx_symbols.
size(); l++) {
435 for (
int j = 0; j < M; j++) {
436 metric(j) =
sqr(rx_symbols(l) - symbols(j));
438 for (
int i = 0; i < k; i++) {
440 for (
int j = 0; j < (M >> 1); j++) {
441 temp = metric(S0(i, j));
442 if (temp < d0min) { d0min = temp; }
443 temp = metric(S1(i, j));
444 if (temp < d1min) { d1min = temp; }
446 soft_bits(l*k + i) = (-d0min + d1min) / N0;
458 demodulate_soft_bits(rx_symbols, N0, output, method);
464 const Vec<T> &channel,
double N0,
468 it_assert_debug(setup_done,
"Modulator_2D::demodulate_soft_bits(): Modulator not ready.");
469 double P0, P1, d0min, d1min, temp;
472 soft_bits.set_size(k * rx_symbols.
size());
475 for (
int l = 0; l < rx_symbols.
size(); l++) {
476 for (
int j = 0; j < M; j++) {
477 metric(j) =
std::exp(-
sqr(rx_symbols(l) - channel(l) * symbols(j))
480 for (
int i = 0; i < k; i++) {
482 for (
int j = 0; j < (M >> 1); j++) {
483 P0 += metric(S0(i, j));
484 P1 += metric(S1(i, j));
491 for (
int l = 0; l < rx_symbols.
size(); l++) {
492 for (
int j = 0; j < M; j++) {
493 metric(j) =
sqr(rx_symbols(l) - channel(l) * symbols(j));
495 for (
int i = 0; i < k; i++) {
497 for (
int j = 0; j < (M >> 1); j++) {
498 temp = metric(S0(i, j));
499 if (temp < d0min) { d0min = temp; }
500 temp = metric(S1(i, j));
501 if (temp < d1min) { d1min = temp; }
503 soft_bits(l*k + i) = (-d0min + d1min) / N0;
516 demodulate_soft_bits(rx_symbols, channel, N0, output, method);
526 S0.set_size(k, M >> 1,
false);
527 S1.set_size(k, M >> 1,
false);
529 for (
int i = 0; i < k; i++) {
532 for (
int j = 0; j < M; j++) {
533 if (bitmap(j, i) ==
bin(0)) {
720 const cvec& channel,
double N0,
822 const cvec& channel,
double N0,
920 const vec& channel,
double N0,
1053 const cvec& channel,
double N0,
1058 const cvec& channel,
double N0,
1111 #endif // #ifndef MODULATOR_H