mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-09-10 07:06:34 -04:00
238 lines
9.4 KiB
C++
238 lines
9.4 KiB
C++
///////////////////////////////////////////////////////////////////////////////////////
|
|
// Copyright (C) 2021 Edouard Griffiths, F4EXB <f4exb06@gmail.com> //
|
|
// //
|
|
// This program is free software; you can redistribute it and/or modify //
|
|
// it under the terms of the GNU General Public License as published by //
|
|
// the Free Software Foundation as version 3 of the License, or //
|
|
// (at your option) any later version. //
|
|
// //
|
|
// This program is distributed in the hope that it will be useful, //
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
|
|
// GNU General Public License V3 for more details. //
|
|
// //
|
|
// You should have received a copy of the GNU General Public License //
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
|
/*
|
|
LDPC interleavers handler
|
|
|
|
Copyright 2018 Ahmet Inan <xdsopl@gmail.com>
|
|
*/
|
|
|
|
#include <iostream>
|
|
#include <cstring>
|
|
#include "testbench.h"
|
|
#include "interleaver.h"
|
|
|
|
namespace ldpctool {
|
|
|
|
Interleaver<code_type> *create_interleaver(char *modulation, char *standard, char prefix, int number)
|
|
{
|
|
if (!strcmp(standard, "S2")) {
|
|
if (!strcmp(modulation, "8PSK")) {
|
|
typedef MUX3<code_type, 0, 1, 2> _012;
|
|
typedef MUX3<code_type, 2, 1, 0> _210;
|
|
if (prefix == 'B') {
|
|
switch (number) {
|
|
case 5:
|
|
return new BITL<code_type, PITL0<code_type, 64800>, _210>();
|
|
default:
|
|
return new BITL<code_type, PITL0<code_type, 64800>, _012>();
|
|
}
|
|
}
|
|
if (prefix == 'C') {
|
|
switch (number) {
|
|
case 5:
|
|
return new BITL<code_type, PITL0<code_type, 16200>, _210>();
|
|
default:
|
|
return new BITL<code_type, PITL0<code_type, 16200>, _012>();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (!strcmp(standard, "S2X")) {
|
|
if (!strcmp(modulation, "8PSK")) {
|
|
typedef MUX3<code_type, 0, 1, 2> _012;
|
|
typedef MUX3<code_type, 1, 0, 2> _102;
|
|
if (prefix == 'B') {
|
|
switch (number) {
|
|
case 7:
|
|
case 8:
|
|
case 9:
|
|
return new BITL<code_type, PITL0<code_type, 64800>, _102>();
|
|
default:
|
|
return new BITL<code_type, PITL0<code_type, 64800>, _012>();
|
|
}
|
|
}
|
|
if (prefix == 'C') {
|
|
switch (number) {
|
|
case 4:
|
|
case 5:
|
|
case 6:
|
|
case 7:
|
|
return new BITL<code_type, PITL0<code_type, 16200>, _102>();
|
|
default:
|
|
return new BITL<code_type, PITL0<code_type, 16200>, _012>();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (!strcmp(standard, "T2")) {
|
|
if (!strcmp(modulation, "QPSK")) {
|
|
if (prefix == 'B') {
|
|
switch (number) {
|
|
case 8:
|
|
return new BITL<code_type, PITL<code_type, 16200, 30>, MUX0<code_type>>();
|
|
case 9:
|
|
return new BITL<code_type, PITL<code_type, 16200, 27>, MUX0<code_type>>();
|
|
}
|
|
}
|
|
}
|
|
if (!strcmp(modulation, "QAM16")) {
|
|
typedef MUX8<code_type, 7, 1, 4, 2, 5, 3, 6, 0> _71425360;
|
|
if (prefix == 'A') {
|
|
typedef MUX8<code_type, 0, 5, 1, 2, 4, 7, 3, 6> _05124736;
|
|
typedef CT8<code_type, 0, 0, 2, 4, 4, 5, 7, 7> CT;
|
|
switch (number) {
|
|
case 1:
|
|
return new BITL<code_type, PCTITL<code_type, 64800, 90, CT>, _71425360>();
|
|
case 2:
|
|
return new BITL<code_type, PCTITL<code_type, 64800, 72, CT>, _05124736>();
|
|
case 3:
|
|
return new BITL<code_type, PCTITL<code_type, 64800, 60, CT>, _71425360>();
|
|
case 4:
|
|
return new BITL<code_type, PCTITL<code_type, 64800, 45, CT>, _71425360>();
|
|
case 5:
|
|
return new BITL<code_type, PCTITL<code_type, 64800, 36, CT>, _71425360>();
|
|
case 6:
|
|
return new BITL<code_type, PCTITL<code_type, 64800, 30, CT>, _71425360>();
|
|
}
|
|
}
|
|
if (prefix == 'B') {
|
|
typedef MUX8<code_type, 6, 0, 3, 4, 5, 2, 1, 7> _60345217;
|
|
typedef MUX8<code_type, 7, 5, 4, 0, 3, 1, 2, 6> _75403126;
|
|
typedef CT8<code_type, 0, 0, 0, 1, 7, 20, 20, 21> CT;
|
|
switch (number) {
|
|
case 1:
|
|
return new BITL<code_type, PCTITL<code_type, 16200, 36, CT>, _71425360>();
|
|
case 2:
|
|
return new BITL<code_type, PCTITL<code_type, 16200, 25, CT>, _71425360>();
|
|
case 3:
|
|
return new BITL<code_type, PCTITL<code_type, 16200, 18, CT>, _71425360>();
|
|
case 4:
|
|
return new BITL<code_type, PCTITL<code_type, 16200, 15, CT>, _71425360>();
|
|
case 5:
|
|
return new BITL<code_type, PCTITL<code_type, 16200, 12, CT>, _71425360>();
|
|
case 6:
|
|
return new BITL<code_type, PCTITL<code_type, 16200, 10, CT>, _71425360>();
|
|
case 7:
|
|
return new BITL<code_type, PCTITL<code_type, 16200, 8, CT>, _71425360>();
|
|
case 8:
|
|
return new BITL<code_type, PCTITL<code_type, 16200, 30, CT>, _60345217>();
|
|
case 9:
|
|
return new BITL<code_type, PCTITL<code_type, 16200, 27, CT>, _75403126>();
|
|
}
|
|
}
|
|
}
|
|
if (!strcmp(modulation, "QAM64")) {
|
|
typedef MUX12<code_type, 11, 7, 3, 10, 6, 2, 9, 5, 1, 8, 4, 0> _11731062951840;
|
|
if (prefix == 'A') {
|
|
typedef MUX12<code_type, 2, 7, 6, 9, 0, 3, 1, 8, 4, 11, 5, 10> _27690318411510;
|
|
typedef CT12<code_type, 0, 0, 2, 2, 3, 4, 4, 5, 5, 7, 8, 9> CT;
|
|
switch (number) {
|
|
case 1:
|
|
return new BITL<code_type, PCTITL<code_type, 64800, 90, CT>, _11731062951840>();
|
|
case 2:
|
|
return new BITL<code_type, PCTITL<code_type, 64800, 72, CT>, _27690318411510>();
|
|
case 3:
|
|
return new BITL<code_type, PCTITL<code_type, 64800, 60, CT>, _11731062951840>();
|
|
case 4:
|
|
return new BITL<code_type, PCTITL<code_type, 64800, 45, CT>, _11731062951840>();
|
|
case 5:
|
|
return new BITL<code_type, PCTITL<code_type, 64800, 36, CT>, _11731062951840>();
|
|
case 6:
|
|
return new BITL<code_type, PCTITL<code_type, 64800, 30, CT>, _11731062951840>();
|
|
}
|
|
}
|
|
if (prefix == 'B') {
|
|
typedef MUX12<code_type, 4, 2, 0, 5, 6, 1, 3, 7, 8, 9, 10, 11> _42056137891011;
|
|
typedef MUX12<code_type, 4, 0, 1, 6, 2, 3, 5, 8, 7, 10, 9, 11> _40162358710911;
|
|
typedef CT12<code_type, 0, 0, 0, 2, 2, 2, 3, 3, 3, 6, 7, 7> CT;
|
|
switch (number) {
|
|
case 1:
|
|
return new BITL<code_type, PCTITL<code_type, 16200, 36, CT>, _11731062951840>();
|
|
case 2:
|
|
return new BITL<code_type, PCTITL<code_type, 16200, 25, CT>, _11731062951840>();
|
|
case 3:
|
|
return new BITL<code_type, PCTITL<code_type, 16200, 18, CT>, _11731062951840>();
|
|
case 4:
|
|
return new BITL<code_type, PCTITL<code_type, 16200, 15, CT>, _11731062951840>();
|
|
case 5:
|
|
return new BITL<code_type, PCTITL<code_type, 16200, 12, CT>, _11731062951840>();
|
|
case 6:
|
|
return new BITL<code_type, PCTITL<code_type, 16200, 10, CT>, _11731062951840>();
|
|
case 7:
|
|
return new BITL<code_type, PCTITL<code_type, 16200, 8, CT>, _11731062951840>();
|
|
case 8:
|
|
return new BITL<code_type, PCTITL<code_type, 16200, 30, CT>, _42056137891011>();
|
|
case 9:
|
|
return new BITL<code_type, PCTITL<code_type, 16200, 27, CT>, _40162358710911>();
|
|
}
|
|
}
|
|
}
|
|
if (!strcmp(modulation, "QAM256")) {
|
|
if (prefix == 'A') {
|
|
typedef MUX16<code_type, 15, 1, 13, 3, 8, 11, 9, 5, 10, 6, 4, 7, 12, 2, 14, 0> _1511338119510647122140;
|
|
typedef MUX16<code_type, 2, 11, 3, 4, 0, 9, 1, 8, 10, 13, 7, 14, 6, 15, 5, 12> _2113409181013714615512;
|
|
typedef MUX16<code_type, 7, 2, 9, 0, 4, 6, 13, 3, 14, 10, 15, 5, 8, 12, 11, 1> _7290461331410155812111;
|
|
typedef CT16<code_type, 0, 2, 2, 2, 2, 3, 7, 15, 16, 20, 22, 22, 27, 27, 28, 32> CT;
|
|
switch (number) {
|
|
case 1:
|
|
return new BITL<code_type, PCTITL<code_type, 64800, 90, CT>, _1511338119510647122140>();
|
|
case 2:
|
|
return new BITL<code_type, PCTITL<code_type, 64800, 72, CT>, _2113409181013714615512>();
|
|
case 3:
|
|
return new BITL<code_type, PCTITL<code_type, 64800, 60, CT>, _7290461331410155812111>();
|
|
case 4:
|
|
return new BITL<code_type, PCTITL<code_type, 64800, 45, CT>, _1511338119510647122140>();
|
|
case 5:
|
|
return new BITL<code_type, PCTITL<code_type, 64800, 36, CT>, _1511338119510647122140>();
|
|
case 6:
|
|
return new BITL<code_type, PCTITL<code_type, 64800, 30, CT>, _1511338119510647122140>();
|
|
}
|
|
}
|
|
if (prefix == 'B') {
|
|
typedef MUX8<code_type, 7, 3, 1, 5, 2, 6, 4, 0> _73152640;
|
|
typedef MUX8<code_type, 4, 0, 1, 2, 5, 3, 6, 7> _40125367;
|
|
typedef MUX8<code_type, 4, 0, 5, 1, 2, 3, 6, 7> _40512367;
|
|
typedef CT8<code_type, 0, 0, 0, 1, 7, 20, 20, 21> CT;
|
|
switch (number) {
|
|
case 1:
|
|
return new BITL<code_type, PCTITL<code_type, 16200, 36, CT>, _73152640>();
|
|
case 2:
|
|
return new BITL<code_type, PCTITL<code_type, 16200, 25, CT>, _73152640>();
|
|
case 3:
|
|
return new BITL<code_type, PCTITL<code_type, 16200, 18, CT>, _73152640>();
|
|
case 4:
|
|
return new BITL<code_type, PCTITL<code_type, 16200, 15, CT>, _73152640>();
|
|
case 5:
|
|
return new BITL<code_type, PCTITL<code_type, 16200, 12, CT>, _73152640>();
|
|
case 6:
|
|
return new BITL<code_type, PCTITL<code_type, 16200, 10, CT>, _73152640>();
|
|
case 7:
|
|
return new BITL<code_type, PCTITL<code_type, 16200, 8, CT>, _73152640>();
|
|
case 8:
|
|
return new BITL<code_type, PCTITL<code_type, 16200, 30, CT>, _40125367>();
|
|
case 9:
|
|
return new BITL<code_type, PCTITL<code_type, 16200, 27, CT>, _40512367>();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
std::cerr << "using noop interleaver." << std::endl;
|
|
return new ITL0<code_type>();
|
|
}
|
|
|
|
} // namespace ldpctool
|