refactored FEC directories

master
Xavier Arteaga 4 years ago committed by Xavier Arteaga
parent 7093a85f81
commit f21590735d

@ -32,8 +32,8 @@
#ifndef SRSLTE_CONVCODER_H #ifndef SRSLTE_CONVCODER_H
#define SRSLTE_CONVCODER_H #define SRSLTE_CONVCODER_H
#include "../../../../../../../../../../usr/lib/gcc/x86_64-linux-gnu/7/include/stdbool.h" #include "srslte/config.h"
#include "../../../config.h" #include <stdbool.h>
typedef struct SRSLTE_API { typedef struct SRSLTE_API {
uint32_t R; uint32_t R;

@ -31,7 +31,7 @@
#ifndef SRSLTE_RM_CONV_H #ifndef SRSLTE_RM_CONV_H
#define SRSLTE_RM_CONV_H #define SRSLTE_RM_CONV_H
#include "../../../config.h" #include "srslte/config.h"
#ifndef SRSLTE_RX_NULL #ifndef SRSLTE_RX_NULL
#define SRSLTE_RX_NULL 10000 #define SRSLTE_RX_NULL 10000

@ -20,7 +20,7 @@
*/ */
/****************************************************************************** /******************************************************************************
* File: convolutional.h * File: viterbi.h
* *
* Description: Viterbi decoder for convolutionally encoded data. * Description: Viterbi decoder for convolutionally encoded data.
* Used for decoding of PBCH and PDCCH (type 37 decoder). * Used for decoding of PBCH and PDCCH (type 37 decoder).
@ -31,8 +31,8 @@
#ifndef SRSLTE_VITERBI_H #ifndef SRSLTE_VITERBI_H
#define SRSLTE_VITERBI_H #define SRSLTE_VITERBI_H
#include "../../../../../../../../../../usr/lib/gcc/x86_64-linux-gnu/7/include/stdbool.h" #include "srslte/config.h"
#include "../../../config.h" #include <stdbool.h>
typedef enum { SRSLTE_VITERBI_27 = 0, SRSLTE_VITERBI_29, SRSLTE_VITERBI_37, SRSLTE_VITERBI_39 } srslte_viterbi_type_t; typedef enum { SRSLTE_VITERBI_27 = 0, SRSLTE_VITERBI_29, SRSLTE_VITERBI_37, SRSLTE_VITERBI_39 } srslte_viterbi_type_t;

@ -31,7 +31,7 @@
#define SRSLTE_RM_TURBO_H #define SRSLTE_RM_TURBO_H
#include "srslte/config.h" #include "srslte/config.h"
#include "srslte/phy/fec/turbodecoder.h" #include "srslte/phy/fec/turbo/turbodecoder.h"
#ifndef SRSLTE_RX_NULL #ifndef SRSLTE_RX_NULL
#define SRSLTE_RX_NULL 10000 #define SRSLTE_RX_NULL 10000

@ -17,56 +17,55 @@
* the LICENSE file in the top-level directory of this distribution * the LICENSE file in the top-level directory of this distribution
* and at http://www.gnu.org/licenses/. * and at http://www.gnu.org/licenses/.
* *
*/ */
/********************************************************************************************** /**********************************************************************************************
* File: turbocoder.h * File: turbocoder.h
* *
* Description: Turbo coder. * Description: Turbo coder.
* Parallel Concatenated Convolutional Code (PCCC) with two 8-state constituent * Parallel Concatenated Convolutional Code (PCCC) with two 8-state constituent
* encoders and one turbo code internal interleaver. The coding rate of turbo * encoders and one turbo code internal interleaver. The coding rate of turbo
* encoder is 1/3. * encoder is 1/3.
* *
* Reference: 3GPP TS 36.212 version 10.0.0 Release 10 Sec. 5.1.3.2 * Reference: 3GPP TS 36.212 version 10.0.0 Release 10 Sec. 5.1.3.2
*********************************************************************************************/ *********************************************************************************************/
#ifndef SRSLTE_TURBOCODER_H #ifndef SRSLTE_TURBOCODER_H
#define SRSLTE_TURBOCODER_H #define SRSLTE_TURBOCODER_H
#include "srslte/config.h" #include "srslte/config.h"
#include "srslte/phy/fec/crc.h" #include "srslte/phy/fec/crc.h"
#include "srslte/phy/fec/tc_interl.h" #include "srslte/phy/fec/turbo/tc_interl.h"
#define SRSLTE_TCOD_MAX_LEN_CB_BYTES (6144 / 8)
#define SRSLTE_TCOD_MAX_LEN_CB_BYTES (6144 / 8)
#ifndef SRSLTE_TX_NULL
#ifndef SRSLTE_TX_NULL #define SRSLTE_TX_NULL 100
#define SRSLTE_TX_NULL 100 #endif
#endif
typedef struct SRSLTE_API {
typedef struct SRSLTE_API { uint32_t max_long_cb;
uint32_t max_long_cb; uint8_t* temp;
uint8_t* temp; } srslte_tcod_t;
} srslte_tcod_t;
/* This structure is used as an output for the LUT version of the encoder.
/* This structure is used as an output for the LUT version of the encoder. * The encoder produces parity bits only and rate matching will interleave them
* The encoder produces parity bits only and rate matching will interleave them * with the systematic bits
* with the systematic bits */
*/
SRSLTE_API int srslte_tcod_init(srslte_tcod_t* h, uint32_t max_long_cb);
SRSLTE_API int srslte_tcod_init(srslte_tcod_t* h, uint32_t max_long_cb);
SRSLTE_API void srslte_tcod_free(srslte_tcod_t* h);
SRSLTE_API void srslte_tcod_free(srslte_tcod_t* h);
SRSLTE_API int srslte_tcod_encode(srslte_tcod_t* h, uint8_t* input, uint8_t* output, uint32_t long_cb);
SRSLTE_API int srslte_tcod_encode(srslte_tcod_t* h, uint8_t* input, uint8_t* output, uint32_t long_cb);
SRSLTE_API int srslte_tcod_encode_lut(srslte_tcod_t* h,
SRSLTE_API int srslte_tcod_encode_lut(srslte_tcod_t* h, srslte_crc_t* crc_tb,
srslte_crc_t* crc_tb, srslte_crc_t* crc_cb,
srslte_crc_t* crc_cb, uint8_t* input,
uint8_t* input, uint8_t* parity,
uint8_t* parity, uint32_t cblen_idx,
uint32_t cblen_idx, bool last_cb);
bool last_cb);
SRSLTE_API void srslte_tcod_gentable();
SRSLTE_API void srslte_tcod_gentable();
#endif // SRSLTE_TURBOCODER_H
#endif // SRSLTE_TURBOCODER_H

@ -35,8 +35,8 @@
#define SRSLTE_TURBODECODER_H #define SRSLTE_TURBODECODER_H
#include "srslte/config.h" #include "srslte/config.h"
#include "srslte/phy/fec/cbsegm.h" #include "srslte/phy/fec/turbo/cbsegm.h"
#include "srslte/phy/fec/tc_interl.h" #include "srslte/phy/fec/turbo/tc_interl.h"
#define SRSLTE_TCOD_RATE 3 #define SRSLTE_TCOD_RATE 3
#define SRSLTE_TCOD_TOTALTAIL 12 #define SRSLTE_TCOD_TOTALTAIL 12
@ -48,11 +48,11 @@
// Include interfaces for 8 and 16 bit decoder implementations // Include interfaces for 8 and 16 bit decoder implementations
#define LLR_IS_8BIT #define LLR_IS_8BIT
#include "srslte/phy/fec/turbodecoder_impl.h" #include "srslte/phy/fec/turbo/turbodecoder_impl.h"
#undef LLR_IS_8BIT #undef LLR_IS_8BIT
#define LLR_IS_16BIT #define LLR_IS_16BIT
#include "srslte/phy/fec/turbodecoder_impl.h" #include "srslte/phy/fec/turbo/turbodecoder_impl.h"
#undef LLR_IS_16BIT #undef LLR_IS_16BIT
#define SRSLTE_TDEC_NOF_AUTO_MODES_8 2 #define SRSLTE_TDEC_NOF_AUTO_MODES_8 2

@ -35,9 +35,8 @@
#define SRSLTE_TURBODECODER_GEN_H #define SRSLTE_TURBODECODER_GEN_H
#include "srslte/config.h" #include "srslte/config.h"
#include "srslte/phy/fec/cbsegm.h" #include "srslte/phy/fec/turbo/cbsegm.h"
#include "srslte/phy/fec/tc_interl.h" #include "srslte/phy/fec/turbo/tc_interl.h"
#define SRSLTE_TCOD_RATE 3 #define SRSLTE_TCOD_RATE 3
#define SRSLTE_TCOD_TOTALTAIL 12 #define SRSLTE_TCOD_TOTALTAIL 12

@ -25,10 +25,10 @@
#include "srslte/config.h" #include "srslte/config.h"
#include "srslte/phy/common/phy_common.h" #include "srslte/phy/common/phy_common.h"
#include "srslte/phy/fec/convcoder.h" #include "srslte/phy/fec/convolutional/convcoder.h"
#include "srslte/phy/fec/convolutional/rm_conv.h"
#include "srslte/phy/fec/convolutional/viterbi.h"
#include "srslte/phy/fec/crc.h" #include "srslte/phy/fec/crc.h"
#include "srslte/phy/fec/rm_conv.h"
#include "srslte/phy/fec/viterbi.h"
#include "srslte/phy/mimo/layermap.h" #include "srslte/phy/mimo/layermap.h"
#include "srslte/phy/mimo/precoding.h" #include "srslte/phy/mimo/precoding.h"
#include "srslte/phy/modem/demod_soft.h" #include "srslte/phy/modem/demod_soft.h"

@ -24,10 +24,10 @@
#include "srslte/config.h" #include "srslte/config.h"
#include "srslte/phy/common/phy_common.h" #include "srslte/phy/common/phy_common.h"
#include "srslte/phy/fec/convcoder.h" #include "srslte/phy/fec/convolutional/convcoder.h"
#include "srslte/phy/fec/convolutional/rm_conv.h"
#include "srslte/phy/fec/convolutional/viterbi.h"
#include "srslte/phy/fec/crc.h" #include "srslte/phy/fec/crc.h"
#include "srslte/phy/fec/rm_conv.h"
#include "srslte/phy/fec/viterbi.h"
#include "srslte/phy/mimo/layermap.h" #include "srslte/phy/mimo/layermap.h"
#include "srslte/phy/mimo/precoding.h" #include "srslte/phy/mimo/precoding.h"
#include "srslte/phy/modem/demod_soft.h" #include "srslte/phy/modem/demod_soft.h"

@ -24,7 +24,7 @@
#include "srslte/config.h" #include "srslte/config.h"
#include "srslte/phy/common/phy_common.h" #include "srslte/phy/common/phy_common.h"
#include "srslte/phy/fec/convcoder.h" #include "srslte/phy/fec/convolutional/convcoder.h"
#include "srslte/phy/fec/crc.h" #include "srslte/phy/fec/crc.h"
#include "srslte/phy/mimo/layermap.h" #include "srslte/phy/mimo/layermap.h"
#include "srslte/phy/mimo/precoding.h" #include "srslte/phy/mimo/precoding.h"

@ -35,10 +35,10 @@
#include "srslte/config.h" #include "srslte/config.h"
#include "srslte/phy/ch_estimation/chest_dl.h" #include "srslte/phy/ch_estimation/chest_dl.h"
#include "srslte/phy/common/phy_common.h" #include "srslte/phy/common/phy_common.h"
#include "srslte/phy/fec/convcoder.h" #include "srslte/phy/fec/convolutional/convcoder.h"
#include "srslte/phy/fec/convolutional/rm_conv.h"
#include "srslte/phy/fec/convolutional/viterbi.h"
#include "srslte/phy/fec/crc.h" #include "srslte/phy/fec/crc.h"
#include "srslte/phy/fec/rm_conv.h"
#include "srslte/phy/fec/viterbi.h"
#include "srslte/phy/mimo/layermap.h" #include "srslte/phy/mimo/layermap.h"
#include "srslte/phy/mimo/precoding.h" #include "srslte/phy/mimo/precoding.h"
#include "srslte/phy/modem/demod_soft.h" #include "srslte/phy/modem/demod_soft.h"

@ -33,10 +33,10 @@
#include "srslte/config.h" #include "srslte/config.h"
#include "srslte/phy/ch_estimation/chest_dl.h" #include "srslte/phy/ch_estimation/chest_dl.h"
#include "srslte/phy/common/phy_common.h" #include "srslte/phy/common/phy_common.h"
#include "srslte/phy/fec/convcoder.h" #include "srslte/phy/fec/convolutional/convcoder.h"
#include "srslte/phy/fec/convolutional/rm_conv.h"
#include "srslte/phy/fec/convolutional/viterbi.h"
#include "srslte/phy/fec/crc.h" #include "srslte/phy/fec/crc.h"
#include "srslte/phy/fec/rm_conv.h"
#include "srslte/phy/fec/viterbi.h"
#include "srslte/phy/mimo/layermap.h" #include "srslte/phy/mimo/layermap.h"
#include "srslte/phy/mimo/precoding.h" #include "srslte/phy/mimo/precoding.h"
#include "srslte/phy/modem/demod_soft.h" #include "srslte/phy/modem/demod_soft.h"

@ -30,8 +30,8 @@
#ifndef SRSLTE_PDSCH_CFG_H #ifndef SRSLTE_PDSCH_CFG_H
#define SRSLTE_PDSCH_CFG_H #define SRSLTE_PDSCH_CFG_H
#include "srslte/phy/fec/cbsegm.h"
#include "srslte/phy/fec/softbuffer.h" #include "srslte/phy/fec/softbuffer.h"
#include "srslte/phy/fec/turbo/cbsegm.h"
#include "srslte/phy/phch/ra.h" #include "srslte/phy/phch/ra.h"
typedef struct SRSLTE_API { typedef struct SRSLTE_API {

@ -22,14 +22,14 @@
#ifndef SRSLTE_PSBCH_H #ifndef SRSLTE_PSBCH_H
#define SRSLTE_PSBCH_H #define SRSLTE_PSBCH_H
#include <srslte/phy/common/phy_common_sl.h> #include "srslte/phy/common/phy_common_sl.h"
#include <srslte/phy/dft/dft_precoding.h> #include "srslte/phy/dft/dft_precoding.h"
#include <srslte/phy/fec/convcoder.h> #include "srslte/phy/fec/convolutional/convcoder.h"
#include <srslte/phy/fec/crc.h> #include "srslte/phy/fec/convolutional/viterbi.h"
#include <srslte/phy/fec/viterbi.h> #include "srslte/phy/fec/crc.h"
#include <srslte/phy/modem/demod_soft.h> #include "srslte/phy/modem/demod_soft.h"
#include <srslte/phy/modem/modem_table.h> #include "srslte/phy/modem/modem_table.h"
#include <srslte/phy/scrambling/scrambling.h> #include "srslte/phy/scrambling/scrambling.h"
#define SRSLTE_SL_BCH_CRC_LEN 16 #define SRSLTE_SL_BCH_CRC_LEN 16

@ -27,9 +27,9 @@
#include "srslte/phy/common/phy_common_sl.h" #include "srslte/phy/common/phy_common_sl.h"
#include "srslte/phy/common/sequence.h" #include "srslte/phy/common/sequence.h"
#include "srslte/phy/dft/dft_precoding.h" #include "srslte/phy/dft/dft_precoding.h"
#include "srslte/phy/fec/convcoder.h" #include "srslte/phy/fec/convolutional/convcoder.h"
#include "srslte/phy/fec/convolutional/viterbi.h"
#include "srslte/phy/fec/crc.h" #include "srslte/phy/fec/crc.h"
#include "srslte/phy/fec/viterbi.h"
#include "srslte/phy/modem/modem_table.h" #include "srslte/phy/modem/modem_table.h"
/** /**

@ -25,8 +25,8 @@
#include "srslte/phy/common/phy_common_sl.h" #include "srslte/phy/common/phy_common_sl.h"
#include "srslte/phy/dft/dft_precoding.h" #include "srslte/phy/dft/dft_precoding.h"
#include "srslte/phy/fec/crc.h" #include "srslte/phy/fec/crc.h"
#include "srslte/phy/fec/turbocoder.h" #include "srslte/phy/fec/turbo/turbocoder.h"
#include "srslte/phy/fec/turbodecoder.h" #include "srslte/phy/fec/turbo/turbodecoder.h"
#include "srslte/phy/modem/mod.h" #include "srslte/phy/modem/mod.h"
#include "srslte/phy/scrambling/scrambling.h" #include "srslte/phy/scrambling/scrambling.h"

@ -33,9 +33,9 @@
#include "srslte/config.h" #include "srslte/config.h"
#include "srslte/phy/common/phy_common.h" #include "srslte/phy/common/phy_common.h"
#include "srslte/phy/fec/crc.h" #include "srslte/phy/fec/crc.h"
#include "srslte/phy/fec/rm_turbo.h" #include "srslte/phy/fec/turbo/rm_turbo.h"
#include "srslte/phy/fec/turbocoder.h" #include "srslte/phy/fec/turbo/turbocoder.h"
#include "srslte/phy/fec/turbodecoder.h" #include "srslte/phy/fec/turbo/turbodecoder.h"
#include "srslte/phy/phch/pdsch_cfg.h" #include "srslte/phy/phch/pdsch_cfg.h"
#include "srslte/phy/phch/pusch_cfg.h" #include "srslte/phy/phch/pusch_cfg.h"
#include "srslte/phy/phch/uci.h" #include "srslte/phy/phch/uci.h"

@ -32,8 +32,8 @@
#include "srslte/config.h" #include "srslte/config.h"
#include "srslte/phy/common/phy_common.h" #include "srslte/phy/common/phy_common.h"
#include "srslte/phy/fec/convolutional/viterbi.h"
#include "srslte/phy/fec/crc.h" #include "srslte/phy/fec/crc.h"
#include "srslte/phy/fec/viterbi.h"
#include "srslte/phy/phch/pusch_cfg.h" #include "srslte/phy/phch/pusch_cfg.h"
#include "srslte/phy/phch/uci_cfg.h" #include "srslte/phy/phch/uci_cfg.h"

@ -58,19 +58,18 @@ extern "C" {
#include "srslte/phy/channel/ch_awgn.h" #include "srslte/phy/channel/ch_awgn.h"
#include "srslte/phy/fec/cbsegm.h"
#include "srslte/phy/fec/convcoder.h"
#include "srslte/phy/fec/crc.h"
#include "srslte/phy/fec/rm_conv.h"
#include "srslte/phy/fec/rm_turbo.h"
#include "srslte/phy/fec/tc_interl.h"
#include "srslte/phy/fec/turbocoder.h"
#include "srslte/phy/fec/turbodecoder.h"
#include "srslte/phy/fec/viterbi.h"
#include "srslte/phy/dft/dft.h" #include "srslte/phy/dft/dft.h"
#include "srslte/phy/dft/dft_precoding.h" #include "srslte/phy/dft/dft_precoding.h"
#include "srslte/phy/dft/ofdm.h" #include "srslte/phy/dft/ofdm.h"
#include "srslte/phy/fec/convolutional/convcoder.h"
#include "srslte/phy/fec/convolutional/rm_conv.h"
#include "srslte/phy/fec/convolutional/viterbi.h"
#include "srslte/phy/fec/crc.h"
#include "srslte/phy/fec/turbo/cbsegm.h"
#include "srslte/phy/fec/turbo/rm_turbo.h"
#include "srslte/phy/fec/turbo/tc_interl.h"
#include "srslte/phy/fec/turbo/turbocoder.h"
#include "srslte/phy/fec/turbo/turbodecoder.h"
#include "srslte/phy/io/binsource.h" #include "srslte/phy/io/binsource.h"
#include "srslte/phy/io/filesink.h" #include "srslte/phy/io/filesink.h"

@ -18,6 +18,12 @@
# and at http://www.gnu.org/licenses/. # and at http://www.gnu.org/licenses/.
# #
file(GLOB SOURCES "*.c") set(FEC_SOURCES
add_library(srslte_fec OBJECT ${SOURCES}) crc.c
softbuffer.c)
add_subdirectory(test) add_subdirectory(test)
add_subdirectory(convolutional)
add_subdirectory(turbo)
add_library(srslte_fec OBJECT ${FEC_SOURCES})

@ -25,7 +25,7 @@
#include <stdlib.h> #include <stdlib.h>
#include "parity.h" #include "parity.h"
#include "srslte/phy/fec/convcoder.h" #include "srslte/phy/fec/convolutional/convcoder.h"
/** /**
* Convolution encodes according to given parameters. * Convolution encodes according to given parameters.

@ -26,8 +26,8 @@
#include <math.h> #include <math.h>
#include <string.h> #include <string.h>
#include "../parity.h" #include "parity.h"
#include "srslte/phy/fec/viterbi.h" #include "srslte/phy/fec/convolutional/viterbi.h"
#include "srslte/phy/utils/debug.h" #include "srslte/phy/utils/debug.h"
#include "srslte/phy/utils/vector.h" #include "srslte/phy/utils/vector.h"
#include "viterbi37.h" #include "viterbi37.h"

@ -5,7 +5,7 @@
* May be used under the terms of the GNU Lesser General Public License (LGPL) * May be used under the terms of the GNU Lesser General Public License (LGPL)
*/ */
#include "../parity.h" #include "parity.h"
#include <limits.h> #include <limits.h>
#include <memory.h> #include <memory.h>
#include <stdint.h> #include <stdint.h>

@ -5,7 +5,7 @@
* May be used under the terms of the GNU Lesser General Public License (LGPL) * May be used under the terms of the GNU Lesser General Public License (LGPL)
*/ */
#include "../parity.h" #include "parity.h"
#include <limits.h> #include <limits.h>
#include <memory.h> #include <memory.h>
#include <stdint.h> #include <stdint.h>

@ -5,7 +5,7 @@
* May be used under the terms of the GNU Lesser General Public License (LGPL) * May be used under the terms of the GNU Lesser General Public License (LGPL)
*/ */
#include "../parity.h" #include "parity.h"
#include <limits.h> #include <limits.h>
#include <memory.h> #include <memory.h>
#include <stdint.h> #include <stdint.h>

@ -8,7 +8,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include "../parity.h" #include "parity.h"
#include "viterbi37.h" #include "viterbi37.h"
#include <limits.h> #include <limits.h>
#include <memory.h> #include <memory.h>

@ -5,7 +5,7 @@
* May be used under the terms of the GNU Lesser General Public License (LGPL) * May be used under the terms of the GNU Lesser General Public License (LGPL)
*/ */
#include "../parity.h" #include "parity.h"
#include <limits.h> #include <limits.h>
#include <memory.h> #include <memory.h>
#include <stdint.h> #include <stdint.h>

@ -19,21 +19,16 @@
* *
*/ */
#include <assert.h>
#include <math.h>
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
#include <strings.h> #include <strings.h>
#include "srslte/phy/common/phy_common.h" #include "srslte/phy/common/phy_common.h"
#include "srslte/phy/fec/rm_turbo.h"
#include "srslte/phy/fec/softbuffer.h" #include "srslte/phy/fec/softbuffer.h"
#include "srslte/phy/fec/turbodecoder_gen.h" #include "srslte/phy/fec/turbo/turbodecoder_gen.h"
#include "srslte/phy/phch/ra.h" #include "srslte/phy/phch/ra.h"
#include "srslte/phy/utils/debug.h"
#include "srslte/phy/utils/vector.h" #include "srslte/phy/utils/vector.h"
#define MAX_PDSCH_RE(cp) (2 * SRSLTE_CP_NSYMB(cp) * 12) #define MAX_PDSCH_RE(cp) (2 * SRSLTE_CP_NSYMB(cp) * 12)

@ -18,57 +18,6 @@
# and at http://www.gnu.org/licenses/. # and at http://www.gnu.org/licenses/.
# #
########################################################################
# RATEMATCHING TEST
########################################################################
add_executable(rm_conv_test rm_conv_test.c)
target_link_libraries(rm_conv_test srslte_phy)
add_executable(rm_turbo_test rm_turbo_test.c)
target_link_libraries(rm_turbo_test srslte_phy)
add_test(rm_conv_test_1 rm_conv_test -t 480 -r 1920)
add_test(rm_conv_test_2 rm_conv_test -t 1920 -r 480)
add_test(rm_turbo_test_1 rm_turbo_test -e 1920)
add_test(rm_turbo_test_2 rm_turbo_test -e 8192)
########################################################################
# Turbo Coder TEST
########################################################################
add_executable(turbodecoder_test turbodecoder_test.c)
target_link_libraries(turbodecoder_test srslte_phy)
add_test(turbodecoder_test_504_1 turbodecoder_test -n 100 -s 1 -l 504 -e 1.0 -t)
add_test(turbodecoder_test_504_2 turbodecoder_test -n 100 -s 1 -l 504 -e 2.0 -t)
add_test(turbodecoder_test_6114_1_5 turbodecoder_test -n 100 -s 1 -l 6144 -e 1.5 -t)
add_test(turbodecoder_test_known turbodecoder_test -n 1 -s 1 -k -e 0.5)
add_executable(turbocoder_test turbocoder_test.c)
target_link_libraries(turbocoder_test srslte_phy)
add_test(turbocoder_test_all turbocoder_test)
########################################################################
# Viterbi TEST
########################################################################
add_executable(viterbi_test viterbi_test.c)
target_link_libraries(viterbi_test srslte_phy)
add_test(viterbi_40_0 viterbi_test -n 1000 -s 1 -l 40 -t -e 0.0)
add_test(viterbi_40_2 viterbi_test -n 1000 -s 1 -l 40 -t -e 2.0)
add_test(viterbi_40_3 viterbi_test -n 1000 -s 1 -l 40 -t -e 3.0)
add_test(viterbi_40_4 viterbi_test -n 1000 -s 1 -l 40 -t -e 4.5)
add_test(viterbi_1000_0 viterbi_test -n 100 -s 1 -l 1000 -t -e 0.0)
add_test(viterbi_1000_2 viterbi_test -n 100 -s 1 -l 1000 -t -e 2.0)
add_test(viterbi_1000_3 viterbi_test -n 100 -s 1 -l 1000 -t -e 3.0)
add_test(viterbi_1000_4 viterbi_test -n 100 -s 1 -l 1000 -t -e 4.5)
add_test(viterbi_56_4 viterbi_test -n 1000 -s 1 -l 56 -t -e 4.5)
######################################################################## ########################################################################
# CRC TEST # CRC TEST
######################################################################## ########################################################################

@ -22,8 +22,8 @@
#include <math.h> #include <math.h>
#include <strings.h> #include <strings.h>
#include "srslte/phy/fec/cbsegm.h" #include "srslte/phy/fec/turbo/cbsegm.h"
#include "srslte/phy/fec/turbodecoder_gen.h" #include "srslte/phy/fec/turbo/turbodecoder_gen.h"
#include "srslte/phy/utils/debug.h" #include "srslte/phy/utils/debug.h"
const uint32_t tc_cb_sizes[SRSLTE_NOF_TC_CB_SIZES] = { const uint32_t tc_cb_sizes[SRSLTE_NOF_TC_CB_SIZES] = {

@ -23,7 +23,7 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include "srslte/phy/fec/rm_conv.h" #include "srslte/phy/fec/convolutional/rm_conv.h"
#include "srslte/phy/utils/debug.h" #include "srslte/phy/utils/debug.h"
#define NCOLS 32 #define NCOLS 32

@ -26,8 +26,8 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "srslte/phy/fec/cbsegm.h" #include "srslte/phy/fec/turbo/cbsegm.h"
#include "srslte/phy/fec/rm_turbo.h" #include "srslte/phy/fec/turbo/rm_turbo.h"
#include "srslte/phy/utils/bit.h" #include "srslte/phy/utils/bit.h"
#include "srslte/phy/utils/debug.h" #include "srslte/phy/utils/debug.h"
#include "srslte/phy/utils/vector.h" #include "srslte/phy/utils/vector.h"

@ -17,93 +17,93 @@
* the LICENSE file in the top-level directory of this distribution * the LICENSE file in the top-level directory of this distribution
* and at http://www.gnu.org/licenses/. * and at http://www.gnu.org/licenses/.
* *
*/ */
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include "srslte/phy/common/phy_common.h" #include "srslte/phy/common/phy_common.h"
#include "srslte/phy/fec/cbsegm.h" #include "srslte/phy/fec/turbo/cbsegm.h"
#include "srslte/phy/fec/tc_interl.h" #include "srslte/phy/fec/turbo/tc_interl.h"
#include "srslte/phy/fec/turbocoder.h" #include "srslte/phy/fec/turbo/turbocoder.h"
#include "srslte/phy/utils/debug.h" #include "srslte/phy/utils/debug.h"
#include "srslte/phy/utils/vector.h" #include "srslte/phy/utils/vector.h"
/************************************************ /************************************************
* *
* LTE TURBO CODE INTERLEAVER * LTE TURBO CODE INTERLEAVER
* *
************************************************/ ************************************************/
const uint32_t f1_list[SRSLTE_NOF_TC_CB_SIZES] = { const uint32_t f1_list[SRSLTE_NOF_TC_CB_SIZES] = {
3, 7, 19, 7, 7, 11, 5, 11, 7, 41, 103, 15, 9, 17, 9, 21, 101, 21, 57, 23, 13, 3, 7, 19, 7, 7, 11, 5, 11, 7, 41, 103, 15, 9, 17, 9, 21, 101, 21, 57, 23, 13,
27, 11, 27, 85, 29, 33, 15, 17, 33, 103, 19, 19, 37, 19, 21, 21, 115, 193, 21, 133, 81, 27, 11, 27, 85, 29, 33, 15, 17, 33, 103, 19, 19, 37, 19, 21, 21, 115, 193, 21, 133, 81,
45, 23, 243, 151, 155, 25, 51, 47, 91, 29, 29, 247, 29, 89, 91, 157, 55, 31, 17, 35, 227, 45, 23, 243, 151, 155, 25, 51, 47, 91, 29, 29, 247, 29, 89, 91, 157, 55, 31, 17, 35, 227,
65, 19, 37, 41, 39, 185, 43, 21, 155, 79, 139, 23, 217, 25, 17, 127, 25, 239, 17, 137, 215, 65, 19, 37, 41, 39, 185, 43, 21, 155, 79, 139, 23, 217, 25, 17, 127, 25, 239, 17, 137, 215,
29, 15, 147, 29, 59, 65, 55, 31, 17, 171, 67, 35, 19, 39, 19, 199, 21, 211, 21, 43, 149, 29, 15, 147, 29, 59, 65, 55, 31, 17, 171, 67, 35, 19, 39, 19, 199, 21, 211, 21, 43, 149,
45, 49, 71, 13, 17, 25, 183, 55, 127, 27, 29, 29, 57, 45, 31, 59, 185, 113, 31, 17, 171, 45, 49, 71, 13, 17, 25, 183, 55, 127, 27, 29, 29, 57, 45, 31, 59, 185, 113, 31, 17, 171,
209, 253, 367, 265, 181, 39, 27, 127, 143, 43, 29, 45, 157, 47, 13, 111, 443, 51, 51, 451, 257, 209, 253, 367, 265, 181, 39, 27, 127, 143, 43, 29, 45, 157, 47, 13, 111, 443, 51, 51, 451, 257,
57, 313, 271, 179, 331, 363, 375, 127, 31, 33, 43, 33, 477, 35, 233, 357, 337, 37, 71, 71, 37, 57, 313, 271, 179, 331, 363, 375, 127, 31, 33, 43, 33, 477, 35, 233, 357, 337, 37, 71, 71, 37,
39, 127, 39, 39, 31, 113, 41, 251, 43, 21, 43, 45, 45, 161, 89, 323, 47, 23, 47, 263}; 39, 127, 39, 39, 31, 113, 41, 251, 43, 21, 43, 45, 45, 161, 89, 323, 47, 23, 47, 263};
const uint32_t f2_list[SRSLTE_NOF_TC_CB_SIZES] = { const uint32_t f2_list[SRSLTE_NOF_TC_CB_SIZES] = {
10, 12, 42, 16, 18, 20, 22, 24, 26, 84, 90, 32, 34, 108, 38, 120, 84, 44, 46, 48, 50, 10, 12, 42, 16, 18, 20, 22, 24, 26, 84, 90, 32, 34, 108, 38, 120, 84, 44, 46, 48, 50,
52, 36, 56, 58, 60, 62, 32, 198, 68, 210, 36, 74, 76, 78, 120, 82, 84, 86, 44, 90, 46, 52, 36, 56, 58, 60, 62, 32, 198, 68, 210, 36, 74, 76, 78, 120, 82, 84, 86, 44, 90, 46,
94, 48, 98, 40, 102, 52, 106, 72, 110, 168, 114, 58, 118, 180, 122, 62, 84, 64, 66, 68, 420, 94, 48, 98, 40, 102, 52, 106, 72, 110, 168, 114, 58, 118, 180, 122, 62, 84, 64, 66, 68, 420,
96, 74, 76, 234, 80, 82, 252, 86, 44, 120, 92, 94, 48, 98, 80, 102, 52, 106, 48, 110, 112, 96, 74, 76, 234, 80, 82, 252, 86, 44, 120, 92, 94, 48, 98, 80, 102, 52, 106, 48, 110, 112,
114, 58, 118, 60, 122, 124, 84, 64, 66, 204, 140, 72, 74, 76, 78, 240, 82, 252, 86, 88, 60, 114, 58, 118, 60, 122, 124, 84, 64, 66, 204, 140, 72, 74, 76, 78, 240, 82, 252, 86, 88, 60,
92, 846, 48, 28, 80, 102, 104, 954, 96, 110, 112, 114, 116, 354, 120, 610, 124, 420, 64, 66, 136, 92, 846, 48, 28, 80, 102, 104, 954, 96, 110, 112, 114, 116, 354, 120, 610, 124, 420, 64, 66, 136,
420, 216, 444, 456, 468, 80, 164, 504, 172, 88, 300, 92, 188, 96, 28, 240, 204, 104, 212, 192, 220, 420, 216, 444, 456, 468, 80, 164, 504, 172, 88, 300, 92, 188, 96, 28, 240, 204, 104, 212, 192, 220,
336, 228, 232, 236, 120, 244, 248, 168, 64, 130, 264, 134, 408, 138, 280, 142, 480, 146, 444, 120, 152, 336, 228, 232, 236, 120, 244, 248, 168, 64, 130, 264, 134, 408, 138, 280, 142, 480, 146, 444, 120, 152,
462, 234, 158, 80, 96, 902, 166, 336, 170, 86, 174, 176, 178, 120, 182, 184, 186, 94, 190, 480}; 462, 234, 158, 80, 96, 902, 166, 336, 170, 86, 174, 176, 178, 120, 182, 184, 186, 94, 190, 480};
int srslte_tc_interl_LTE_gen(srslte_tc_interl_t* h, uint32_t long_cb) int srslte_tc_interl_LTE_gen(srslte_tc_interl_t* h, uint32_t long_cb)
{ {
return srslte_tc_interl_LTE_gen_interl(h, long_cb, 1); return srslte_tc_interl_LTE_gen_interl(h, long_cb, 1);
} }
#define deinter(x, win) ((x % (long_cb / win)) * (win) + x / (long_cb / win)) #define deinter(x, win) ((x % (long_cb / win)) * (win) + x / (long_cb / win))
#define inter(x, win) ((x % win) * (long_cb / win) + x / win) #define inter(x, win) ((x % win) * (long_cb / win) + x / win)
int srslte_tc_interl_LTE_gen_interl(srslte_tc_interl_t* h, uint32_t long_cb, uint32_t interl_win) int srslte_tc_interl_LTE_gen_interl(srslte_tc_interl_t* h, uint32_t long_cb, uint32_t interl_win)
{ {
uint32_t cb_table_idx, f1, f2; uint32_t cb_table_idx, f1, f2;
uint64_t i, j; uint64_t i, j;
if (long_cb > h->max_long_cb) { if (long_cb > h->max_long_cb) {
ERROR("Interleaver initiated for max_long_cb=%d\n", h->max_long_cb); ERROR("Interleaver initiated for max_long_cb=%d\n", h->max_long_cb);
return -1; return -1;
} }
cb_table_idx = srslte_cbsegm_cbindex(long_cb); cb_table_idx = srslte_cbsegm_cbindex(long_cb);
if (cb_table_idx == -1) { if (cb_table_idx == -1) {
ERROR("Can't find long_cb=%d in valid TC CB table\n", long_cb); ERROR("Can't find long_cb=%d in valid TC CB table\n", long_cb);
return -1; return -1;
} }
f1 = f1_list[cb_table_idx]; f1 = f1_list[cb_table_idx];
f2 = f2_list[cb_table_idx]; f2 = f2_list[cb_table_idx];
h->forward[0] = 0; h->forward[0] = 0;
h->reverse[0] = 0; h->reverse[0] = 0;
for (i = 1; i < long_cb; i++) { for (i = 1; i < long_cb; i++) {
j = (f1 * i + f2 * i * i) % (long_cb); j = (f1 * i + f2 * i * i) % (long_cb);
h->forward[i] = (uint32_t)j; h->forward[i] = (uint32_t)j;
h->reverse[j] = (uint32_t)i; h->reverse[j] = (uint32_t)i;
} }
if (interl_win != 1) { if (interl_win != 1) {
uint16_t* f = srslte_vec_u16_malloc(long_cb); uint16_t* f = srslte_vec_u16_malloc(long_cb);
uint16_t* r = srslte_vec_u16_malloc(long_cb); uint16_t* r = srslte_vec_u16_malloc(long_cb);
memcpy(f, h->forward, long_cb * sizeof(uint16_t)); memcpy(f, h->forward, long_cb * sizeof(uint16_t));
memcpy(r, h->reverse, long_cb * sizeof(uint16_t)); memcpy(r, h->reverse, long_cb * sizeof(uint16_t));
for (i = 0; i < long_cb; i++) { for (i = 0; i < long_cb; i++) {
h->forward[i] = deinter(f[inter(i, interl_win)], interl_win); h->forward[i] = deinter(f[inter(i, interl_win)], interl_win);
h->reverse[i] = deinter(r[inter(i, interl_win)], interl_win); h->reverse[i] = deinter(r[inter(i, interl_win)], interl_win);
} }
free(f); free(f);
free(r); free(r);
} }
return 0; return 0;
} }

@ -17,250 +17,250 @@
* the LICENSE file in the top-level directory of this distribution * the LICENSE file in the top-level directory of this distribution
* and at http://www.gnu.org/licenses/. * and at http://www.gnu.org/licenses/.
* *
*/ */
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <strings.h> #include <strings.h>
#include "srslte/phy/fec/tc_interl.h" #include "srslte/phy/fec/turbo/tc_interl.h"
#include "srslte/phy/utils/debug.h" #include "srslte/phy/utils/debug.h"
#include "srslte/phy/utils/vector.h" #include "srslte/phy/utils/vector.h"
#define TURBO_SRSLTE_TCOD_RATE 3 #define TURBO_SRSLTE_TCOD_RATE 3
uint32_t mcd(uint32_t x, uint32_t y); uint32_t mcd(uint32_t x, uint32_t y);
/************************************************ /************************************************
* *
* UMTS TURBO CODE INTERLEAVER * UMTS TURBO CODE INTERLEAVER
* *
************************************************/ ************************************************/
#define MAX_ROWS 20 #define MAX_ROWS 20
#define MAX_COLS 256 #define MAX_COLS 256
const unsigned short table_p[52] = {7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, const unsigned short table_p[52] = {7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53,
59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109,
113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181,
191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257}; 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257};
const uint8_t table_v[52] = {3, 2, 2, 3, 2, 5, 2, 3, 2, 6, 3, 5, 2, 2, 2, 2, 7, 5, 3, 2, 3, 5, 2, 5, 2, 6, const uint8_t table_v[52] = {3, 2, 2, 3, 2, 5, 2, 3, 2, 6, 3, 5, 2, 2, 2, 2, 7, 5, 3, 2, 3, 5, 2, 5, 2, 6,
3, 3, 2, 3, 2, 2, 6, 5, 2, 5, 2, 2, 2, 19, 5, 2, 3, 2, 3, 2, 6, 3, 7, 7, 6, 3}; 3, 3, 2, 3, 2, 2, 6, 5, 2, 5, 2, 2, 2, 19, 5, 2, 3, 2, 3, 2, 6, 3, 7, 7, 6, 3};
int srslte_tc_interl_init(srslte_tc_interl_t* h, uint32_t max_long_cb) int srslte_tc_interl_init(srslte_tc_interl_t* h, uint32_t max_long_cb)
{ {
int ret = -1; int ret = -1;
h->forward = srslte_vec_u16_malloc(max_long_cb); h->forward = srslte_vec_u16_malloc(max_long_cb);
if (!h->forward) { if (!h->forward) {
perror("malloc"); perror("malloc");
goto clean_exit; goto clean_exit;
} }
h->reverse = srslte_vec_u16_malloc(max_long_cb); h->reverse = srslte_vec_u16_malloc(max_long_cb);
if (!h->reverse) { if (!h->reverse) {
perror("malloc"); perror("malloc");
goto clean_exit; goto clean_exit;
} }
h->max_long_cb = max_long_cb; h->max_long_cb = max_long_cb;
ret = 0; ret = 0;
clean_exit: clean_exit:
if (ret == -1) { if (ret == -1) {
srslte_tc_interl_free(h); srslte_tc_interl_free(h);
} }
return ret; return ret;
} }
void srslte_tc_interl_free(srslte_tc_interl_t* h) void srslte_tc_interl_free(srslte_tc_interl_t* h)
{ {
if (h->forward) { if (h->forward) {
free(h->forward); free(h->forward);
} }
if (h->reverse) { if (h->reverse) {
free(h->reverse); free(h->reverse);
} }
bzero(h, sizeof(srslte_tc_interl_t)); bzero(h, sizeof(srslte_tc_interl_t));
} }
int srslte_tc_interl_UMTS_gen(srslte_tc_interl_t* h, uint32_t long_cb) int srslte_tc_interl_UMTS_gen(srslte_tc_interl_t* h, uint32_t long_cb)
{ {
uint32_t i, j; uint32_t i, j;
uint32_t res, prim, aux; uint32_t res, prim, aux;
uint32_t kp, k; uint32_t kp, k;
uint16_t *per, *desper; uint16_t *per, *desper;
uint8_t v; uint8_t v;
uint16_t p; uint16_t p;
uint16_t s[MAX_COLS], q[MAX_ROWS], r[MAX_ROWS], T[MAX_ROWS]; uint16_t s[MAX_COLS], q[MAX_ROWS], r[MAX_ROWS], T[MAX_ROWS];
uint16_t U[MAX_COLS * MAX_ROWS]; uint16_t U[MAX_COLS * MAX_ROWS];
uint32_t M_Rows, M_Cols, M_long; uint32_t M_Rows, M_Cols, M_long;
M_long = long_cb; M_long = long_cb;
if (long_cb > h->max_long_cb) { if (long_cb > h->max_long_cb) {
ERROR("Interleaver initiated for max_long_cb=%d\n", h->max_long_cb); ERROR("Interleaver initiated for max_long_cb=%d\n", h->max_long_cb);
return -1; return -1;
} }
/* Find R*/ /* Find R*/
if ((40 <= M_long) && (M_long <= 159)) if ((40 <= M_long) && (M_long <= 159))
M_Rows = 5; M_Rows = 5;
else if (((160 <= M_long) && (M_long <= 200)) || ((481 <= M_long) && (M_long <= 530))) else if (((160 <= M_long) && (M_long <= 200)) || ((481 <= M_long) && (M_long <= 530)))
M_Rows = 10; M_Rows = 10;
else else
M_Rows = 20; M_Rows = 20;
/* Find p i v*/ /* Find p i v*/
if ((481 <= M_long) && (M_long <= 530)) { if ((481 <= M_long) && (M_long <= 530)) {
p = 53; p = 53;
v = 2; v = 2;
M_Cols = p; M_Cols = p;
} else { } else {
i = 0; i = 0;
do { do {
p = table_p[i]; p = table_p[i];
v = table_v[i]; v = table_v[i];
i++; i++;
} while (M_long > (M_Rows * (p + 1))); } while (M_long > (M_Rows * (p + 1)));
} }
/* Find C*/ /* Find C*/
if ((M_long) <= (M_Rows) * ((p)-1)) if ((M_long) <= (M_Rows) * ((p)-1))
M_Cols = (p)-1; M_Cols = (p)-1;
else if (((M_Rows) * (p - 1) < M_long) && (M_long <= (M_Rows) * (p))) else if (((M_Rows) * (p - 1) < M_long) && (M_long <= (M_Rows) * (p)))
M_Cols = p; M_Cols = p;
else if ((M_Rows) * (p) < M_long) else if ((M_Rows) * (p) < M_long)
M_Cols = (p) + 1; M_Cols = (p) + 1;
q[0] = 1; q[0] = 1;
prim = 6; prim = 6;
for (i = 1; i < M_Rows; i++) { for (i = 1; i < M_Rows; i++) {
do { do {
prim++; prim++;
res = mcd(prim, p - 1); res = mcd(prim, p - 1);
} while (res != 1); } while (res != 1);
q[i] = prim; q[i] = prim;
} }
s[0] = 1; s[0] = 1;
for (i = 1; i < p - 1; i++) { for (i = 1; i < p - 1; i++) {
s[i] = (v * s[i - 1]) % p; s[i] = (v * s[i - 1]) % p;
} }
if (M_long <= 159 && M_long >= 40) { if (M_long <= 159 && M_long >= 40) {
T[0] = 4; T[0] = 4;
T[1] = 3; T[1] = 3;
T[2] = 2; T[2] = 2;
T[3] = 1; T[3] = 1;
T[4] = 0; T[4] = 0;
} else if ((M_long <= 200 && M_long >= 160) || (M_long <= 530 && M_long >= 481)) { } else if ((M_long <= 200 && M_long >= 160) || (M_long <= 530 && M_long >= 481)) {
T[0] = 9; T[0] = 9;
T[1] = 8; T[1] = 8;
T[2] = 7; T[2] = 7;
T[3] = 6; T[3] = 6;
T[4] = 5; T[4] = 5;
T[5] = 4; T[5] = 4;
T[6] = 3; T[6] = 3;
T[7] = 2; T[7] = 2;
T[8] = 1; T[8] = 1;
T[9] = 0; T[9] = 0;
} else if ((M_long <= 2480 && M_long >= 2281) || (M_long <= 3210 && M_long >= 3161)) { } else if ((M_long <= 2480 && M_long >= 2281) || (M_long <= 3210 && M_long >= 3161)) {
T[0] = 19; T[0] = 19;
T[1] = 9; T[1] = 9;
T[2] = 14; T[2] = 14;
T[3] = 4; T[3] = 4;
T[4] = 0; T[4] = 0;
T[5] = 2; T[5] = 2;
T[6] = 5; T[6] = 5;
T[7] = 7; T[7] = 7;
T[8] = 12; T[8] = 12;
T[9] = 18; T[9] = 18;
T[10] = 16; T[10] = 16;
T[11] = 13; T[11] = 13;
T[12] = 17; T[12] = 17;
T[13] = 15; T[13] = 15;
T[14] = 3; T[14] = 3;
T[15] = 1; T[15] = 1;
T[16] = 6; T[16] = 6;
T[17] = 11; T[17] = 11;
T[18] = 8; T[18] = 8;
T[19] = 10; T[19] = 10;
} else { } else {
T[0] = 19; T[0] = 19;
T[1] = 9; T[1] = 9;
T[2] = 14; T[2] = 14;
T[3] = 4; T[3] = 4;
T[4] = 0; T[4] = 0;
T[5] = 2; T[5] = 2;
T[6] = 5; T[6] = 5;
T[7] = 7; T[7] = 7;
T[8] = 12; T[8] = 12;
T[9] = 18; T[9] = 18;
T[10] = 10; T[10] = 10;
T[11] = 8; T[11] = 8;
T[12] = 13; T[12] = 13;
T[13] = 17; T[13] = 17;
T[14] = 3; T[14] = 3;
T[15] = 1; T[15] = 1;
T[16] = 16; T[16] = 16;
T[17] = 6; T[17] = 6;
T[18] = 15; T[18] = 15;
T[19] = 11; T[19] = 11;
} }
for (i = 0; i < M_Rows; i++) { for (i = 0; i < M_Rows; i++) {
r[T[i]] = q[i]; r[T[i]] = q[i];
} }
for (i = 0; i < M_Rows; i++) { for (i = 0; i < M_Rows; i++) {
for (j = 0; j < p - 1; j++) { for (j = 0; j < p - 1; j++) {
U[i * M_Cols + j] = s[(j * r[i]) % (p - 1)]; U[i * M_Cols + j] = s[(j * r[i]) % (p - 1)];
if (M_Cols == (p - 1)) if (M_Cols == (p - 1))
U[i * M_Cols + j] -= 1; U[i * M_Cols + j] -= 1;
} }
} }
if (M_Cols == p) { if (M_Cols == p) {
for (i = 0; i < M_Rows; i++) for (i = 0; i < M_Rows; i++)
U[i * M_Cols + p - 1] = 0; U[i * M_Cols + p - 1] = 0;
} else if (M_Cols == p + 1) { } else if (M_Cols == p + 1) {
for (i = 0; i < M_Rows; i++) { for (i = 0; i < M_Rows; i++) {
U[i * M_Cols + p - 1] = 0; U[i * M_Cols + p - 1] = 0;
U[i * M_Cols + p] = p; U[i * M_Cols + p] = p;
} }
if (M_long == M_Cols * M_Rows) { if (M_long == M_Cols * M_Rows) {
aux = U[(M_Rows - 1) * M_Cols + p]; aux = U[(M_Rows - 1) * M_Cols + p];
U[(M_Rows - 1) * M_Cols + p] = U[(M_Rows - 1) * M_Cols + 0]; U[(M_Rows - 1) * M_Cols + p] = U[(M_Rows - 1) * M_Cols + 0];
U[(M_Rows - 1) * M_Cols + 0] = aux; U[(M_Rows - 1) * M_Cols + 0] = aux;
} }
} }
per = h->forward; per = h->forward;
desper = h->reverse; desper = h->reverse;
k = 0; k = 0;
for (j = 0; j < M_Cols; j++) { for (j = 0; j < M_Cols; j++) {
for (i = 0; i < M_Rows; i++) { for (i = 0; i < M_Rows; i++) {
kp = T[i] * M_Cols + U[i * M_Cols + j]; kp = T[i] * M_Cols + U[i * M_Cols + j];
if (kp < M_long) { if (kp < M_long) {
desper[kp] = k; desper[kp] = k;
per[k] = kp; per[k] = kp;
k++; k++;
} }
} }
} }
return 0; return 0;
} }
uint32_t mcd(uint32_t x, uint32_t y) uint32_t mcd(uint32_t x, uint32_t y)
{ {
uint32_t r = 1; uint32_t r = 1;
while (r) { while (r) {
r = x % y; r = x % y;
x = y; x = y;
y = r; y = r;
} }
return x; return x;
} }

@ -17,410 +17,410 @@
* the LICENSE file in the top-level directory of this distribution * the LICENSE file in the top-level directory of this distribution
* and at http://www.gnu.org/licenses/. * and at http://www.gnu.org/licenses/.
* *
*/ */
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "srslte/phy/fec/cbsegm.h" #include "srslte/phy/fec/turbo/cbsegm.h"
#include "srslte/phy/fec/turbocoder.h" #include "srslte/phy/fec/turbo/turbocoder.h"
#include "srslte/phy/utils/bit.h" #include "srslte/phy/utils/bit.h"
#include "srslte/phy/utils/debug.h" #include "srslte/phy/utils/debug.h"
#include "srslte/phy/utils/vector.h" #include "srslte/phy/utils/vector.h"
#define NOF_REGS 3 #define NOF_REGS 3
#define RATE 3 #define RATE 3
#define TOTALTAIL 12 #define TOTALTAIL 12
typedef struct { typedef struct {
uint8_t next_state; uint8_t next_state;
uint8_t output; uint8_t output;
} tcod_lut_t; } tcod_lut_t;
static tcod_lut_t tcod_lut[8][256]; static tcod_lut_t tcod_lut[8][256];
static uint16_t tcod_per_fw[188][6144]; static uint16_t tcod_per_fw[188][6144];
static srslte_bit_interleaver_t tcod_interleavers[188]; static srslte_bit_interleaver_t tcod_interleavers[188];
static bool table_initiated = false; static bool table_initiated = false;
int srslte_tcod_init(srslte_tcod_t* h, uint32_t max_long_cb) int srslte_tcod_init(srslte_tcod_t* h, uint32_t max_long_cb)
{ {
h->max_long_cb = max_long_cb; h->max_long_cb = max_long_cb;
h->temp = srslte_vec_malloc(max_long_cb / 8); h->temp = srslte_vec_malloc(max_long_cb / 8);
if (!table_initiated) { if (!table_initiated) {
table_initiated = true; table_initiated = true;
srslte_tcod_gentable(); srslte_tcod_gentable();
} }
return 0; return 0;
} }
void srslte_tcod_free(srslte_tcod_t* h) void srslte_tcod_free(srslte_tcod_t* h)
{ {
h->max_long_cb = 0; h->max_long_cb = 0;
if (h->temp) { if (h->temp) {
free(h->temp); free(h->temp);
} }
if (table_initiated) { if (table_initiated) {
for (int i = 0; i < 188; i++) { for (int i = 0; i < 188; i++) {
srslte_bit_interleaver_free(&tcod_interleavers[i]); srslte_bit_interleaver_free(&tcod_interleavers[i]);
} }
table_initiated = false; table_initiated = false;
} }
} }
/* Expects bits (1 byte = 1 bit) and produces bits. The systematic and parity bits are interlaced in the output */ /* Expects bits (1 byte = 1 bit) and produces bits. The systematic and parity bits are interlaced in the output */
int srslte_tcod_encode(srslte_tcod_t* h, uint8_t* input, uint8_t* output, uint32_t long_cb) int srslte_tcod_encode(srslte_tcod_t* h, uint8_t* input, uint8_t* output, uint32_t long_cb)
{ {
uint8_t reg1_0, reg1_1, reg1_2, reg2_0, reg2_1, reg2_2; uint8_t reg1_0, reg1_1, reg1_2, reg2_0, reg2_1, reg2_2;
uint32_t i, k = 0, j; uint32_t i, k = 0, j;
uint8_t bit; uint8_t bit;
uint8_t in, out; uint8_t in, out;
uint16_t* per; uint16_t* per;
if (long_cb > h->max_long_cb) { if (long_cb > h->max_long_cb) {
ERROR("Turbo coder initiated for max_long_cb=%d\n", h->max_long_cb); ERROR("Turbo coder initiated for max_long_cb=%d\n", h->max_long_cb);
return -1; return -1;
} }
int longcb_idx = srslte_cbsegm_cbindex(long_cb); int longcb_idx = srslte_cbsegm_cbindex(long_cb);
if (longcb_idx < 0) { if (longcb_idx < 0) {
ERROR("Invalid CB size %d\n", long_cb); ERROR("Invalid CB size %d\n", long_cb);
return -1; return -1;
} }
per = tcod_per_fw[longcb_idx]; per = tcod_per_fw[longcb_idx];
reg1_0 = 0; reg1_0 = 0;
reg1_1 = 0; reg1_1 = 0;
reg1_2 = 0; reg1_2 = 0;
reg2_0 = 0; reg2_0 = 0;
reg2_1 = 0; reg2_1 = 0;
reg2_2 = 0; reg2_2 = 0;
k = 0; k = 0;
for (i = 0; i < long_cb; i++) { for (i = 0; i < long_cb; i++) {
if (input[i] == SRSLTE_TX_NULL) { if (input[i] == SRSLTE_TX_NULL) {
bit = 0; bit = 0;
} else { } else {
bit = input[i]; bit = input[i];
} }
output[k] = input[i]; output[k] = input[i];
k++; k++;
in = bit ^ (reg1_2 ^ reg1_1); in = bit ^ (reg1_2 ^ reg1_1);
out = reg1_2 ^ (reg1_0 ^ in); out = reg1_2 ^ (reg1_0 ^ in);
reg1_2 = reg1_1; reg1_2 = reg1_1;
reg1_1 = reg1_0; reg1_1 = reg1_0;
reg1_0 = in; reg1_0 = in;
if (input[i] == SRSLTE_TX_NULL) { if (input[i] == SRSLTE_TX_NULL) {
output[k] = SRSLTE_TX_NULL; output[k] = SRSLTE_TX_NULL;
} else { } else {
output[k] = out; output[k] = out;
} }
k++; k++;
bit = input[per[i]]; bit = input[per[i]];
if (bit == SRSLTE_TX_NULL) { if (bit == SRSLTE_TX_NULL) {
bit = 0; bit = 0;
} }
in = bit ^ (reg2_2 ^ reg2_1); in = bit ^ (reg2_2 ^ reg2_1);
out = reg2_2 ^ (reg2_0 ^ in); out = reg2_2 ^ (reg2_0 ^ in);
reg2_2 = reg2_1; reg2_2 = reg2_1;
reg2_1 = reg2_0; reg2_1 = reg2_0;
reg2_0 = in; reg2_0 = in;
output[k] = out; output[k] = out;
k++; k++;
} }
k = 3 * long_cb; k = 3 * long_cb;
/* TAILING CODER #1 */ /* TAILING CODER #1 */
for (j = 0; j < NOF_REGS; j++) { for (j = 0; j < NOF_REGS; j++) {
bit = reg1_2 ^ reg1_1; bit = reg1_2 ^ reg1_1;
output[k] = bit; output[k] = bit;
k++; k++;
in = bit ^ (reg1_2 ^ reg1_1); in = bit ^ (reg1_2 ^ reg1_1);
out = reg1_2 ^ (reg1_0 ^ in); out = reg1_2 ^ (reg1_0 ^ in);
reg1_2 = reg1_1; reg1_2 = reg1_1;
reg1_1 = reg1_0; reg1_1 = reg1_0;
reg1_0 = in; reg1_0 = in;
output[k] = out; output[k] = out;
k++; k++;
} }
/* TAILING CODER #2 */ /* TAILING CODER #2 */
for (j = 0; j < NOF_REGS; j++) { for (j = 0; j < NOF_REGS; j++) {
bit = reg2_2 ^ reg2_1; bit = reg2_2 ^ reg2_1;
output[k] = bit; output[k] = bit;
k++; k++;
in = bit ^ (reg2_2 ^ reg2_1); in = bit ^ (reg2_2 ^ reg2_1);
out = reg2_2 ^ (reg2_0 ^ in); out = reg2_2 ^ (reg2_0 ^ in);
reg2_2 = reg2_1; reg2_2 = reg2_1;
reg2_1 = reg2_0; reg2_1 = reg2_0;
reg2_0 = in; reg2_0 = in;
output[k] = out; output[k] = out;
k++; k++;
} }
return 0; return 0;
} }
/* Expects bytes and produces bytes. The systematic and parity bits are interlaced in the output */ /* Expects bytes and produces bytes. The systematic and parity bits are interlaced in the output */
int srslte_tcod_encode_lut(srslte_tcod_t* h, int srslte_tcod_encode_lut(srslte_tcod_t* h,
srslte_crc_t* crc_tb, srslte_crc_t* crc_tb,
srslte_crc_t* crc_cb, srslte_crc_t* crc_cb,
uint8_t* input, uint8_t* input,
uint8_t* parity, uint8_t* parity,
uint32_t cblen_idx, uint32_t cblen_idx,
bool last_cb) bool last_cb)
{ {
if (cblen_idx < 188) { if (cblen_idx < 188) {
uint32_t long_cb = (uint32_t)srslte_cbsegm_cbsize(cblen_idx); uint32_t long_cb = (uint32_t)srslte_cbsegm_cbsize(cblen_idx);
if (long_cb % 8) { if (long_cb % 8) {
ERROR("Turbo coder LUT implementation long_cb must be multiple of 8\n"); ERROR("Turbo coder LUT implementation long_cb must be multiple of 8\n");
return -1; return -1;
} }
/* Reset CRC */ /* Reset CRC */
if (crc_cb) { if (crc_cb) {
srslte_crc_set_init(crc_cb, 0); srslte_crc_set_init(crc_cb, 0);
} }
/* Parity bits for the 1st constituent encoders */ /* Parity bits for the 1st constituent encoders */
uint8_t state0 = 0; uint8_t state0 = 0;
if (crc_cb) { if (crc_cb) {
int block_size_nocrc = (long_cb - crc_cb->order - ((last_cb) ? crc_tb->order : 0)) / 8; int block_size_nocrc = (long_cb - crc_cb->order - ((last_cb) ? crc_tb->order : 0)) / 8;
/* if CRC pointer is given */ /* if CRC pointer is given */
for (int i = 0; i < block_size_nocrc; i++) { for (int i = 0; i < block_size_nocrc; i++) {
uint8_t in = input[i]; uint8_t in = input[i];
/* Put byte in TB CRC and save latest checksum */ /* Put byte in TB CRC and save latest checksum */
srslte_crc_checksum_put_byte(crc_tb, in); srslte_crc_checksum_put_byte(crc_tb, in);
/* Put byte in CB CRC and save latest checksum */ /* Put byte in CB CRC and save latest checksum */
srslte_crc_checksum_put_byte(crc_cb, in); srslte_crc_checksum_put_byte(crc_cb, in);
/* Run actual encoder */ /* Run actual encoder */
tcod_lut_t l = tcod_lut[state0][in]; tcod_lut_t l = tcod_lut[state0][in];
parity[i] = l.output; parity[i] = l.output;
state0 = l.next_state; state0 = l.next_state;
} }
if (last_cb) { if (last_cb) {
uint32_t checksum = (uint32_t)srslte_crc_checksum_get(crc_tb); uint32_t checksum = (uint32_t)srslte_crc_checksum_get(crc_tb);
for (int i = 0; i < crc_tb->order / 8; i++) { for (int i = 0; i < crc_tb->order / 8; i++) {
int mask_shift = 8 * (crc_tb->order / 8 - i - 1); int mask_shift = 8 * (crc_tb->order / 8 - i - 1);
int idx = block_size_nocrc + i; int idx = block_size_nocrc + i;
uint8_t in = (uint8_t)((checksum >> mask_shift) & 0xff); uint8_t in = (uint8_t)((checksum >> mask_shift) & 0xff);
/* Put byte in CB CRC and save latest checksum */ /* Put byte in CB CRC and save latest checksum */
srslte_crc_checksum_put_byte(crc_cb, in); srslte_crc_checksum_put_byte(crc_cb, in);
input[idx] = in; input[idx] = in;
tcod_lut_t l = tcod_lut[state0][in]; tcod_lut_t l = tcod_lut[state0][in];
parity[idx] = l.output; parity[idx] = l.output;
state0 = l.next_state; state0 = l.next_state;
} }
} }
uint32_t checksum = (uint32_t)srslte_crc_checksum_get(crc_cb); uint32_t checksum = (uint32_t)srslte_crc_checksum_get(crc_cb);
for (int i = 0; i < crc_cb->order / 8; i++) { for (int i = 0; i < crc_cb->order / 8; i++) {
int mask_shift = 8 * (crc_cb->order / 8 - i - 1); int mask_shift = 8 * (crc_cb->order / 8 - i - 1);
int idx = (long_cb - crc_cb->order) / 8 + i; int idx = (long_cb - crc_cb->order) / 8 + i;
uint8_t in = (uint8_t)((checksum >> mask_shift) & 0xff); uint8_t in = (uint8_t)((checksum >> mask_shift) & 0xff);
input[idx] = in; input[idx] = in;
tcod_lut_t l = tcod_lut[state0][in]; tcod_lut_t l = tcod_lut[state0][in];
parity[idx] = l.output; parity[idx] = l.output;
state0 = l.next_state; state0 = l.next_state;
} }
} else { } else {
/* No CRC given */ /* No CRC given */
int block_size_nocrc = (long_cb - ((last_cb) ? crc_tb->order : 0)) / 8; int block_size_nocrc = (long_cb - ((last_cb) ? crc_tb->order : 0)) / 8;
for (uint32_t i = 0; i < block_size_nocrc; i++) { for (uint32_t i = 0; i < block_size_nocrc; i++) {
uint8_t in = input[i]; uint8_t in = input[i];
srslte_crc_checksum_put_byte(crc_tb, in); srslte_crc_checksum_put_byte(crc_tb, in);
tcod_lut_t l = tcod_lut[state0][in]; tcod_lut_t l = tcod_lut[state0][in];
parity[i] = l.output; parity[i] = l.output;
state0 = l.next_state; state0 = l.next_state;
} }
if (last_cb) { if (last_cb) {
uint32_t checksum = (uint32_t)srslte_crc_checksum_get(crc_tb); uint32_t checksum = (uint32_t)srslte_crc_checksum_get(crc_tb);
for (int i = 0; i < crc_tb->order / 8; i++) { for (int i = 0; i < crc_tb->order / 8; i++) {
int mask_shift = 8 * (crc_tb->order / 8 - i - 1); int mask_shift = 8 * (crc_tb->order / 8 - i - 1);
int idx = block_size_nocrc + i; int idx = block_size_nocrc + i;
uint8_t in = (uint8_t)((checksum >> mask_shift) & 0xff); uint8_t in = (uint8_t)((checksum >> mask_shift) & 0xff);
input[idx] = in; input[idx] = in;
tcod_lut_t l = tcod_lut[state0][in]; tcod_lut_t l = tcod_lut[state0][in];
parity[idx] = l.output; parity[idx] = l.output;
state0 = l.next_state; state0 = l.next_state;
} }
} }
} }
parity[long_cb / 8] = 0; // will put tail here later parity[long_cb / 8] = 0; // will put tail here later
/* Interleave input */ /* Interleave input */
srslte_bit_interleaver_run(&tcod_interleavers[cblen_idx], input, h->temp, 0); srslte_bit_interleaver_run(&tcod_interleavers[cblen_idx], input, h->temp, 0);
// srslte_bit_interleave(input, h->temp, tcod_per_fw[cblen_idx], long_cb); // srslte_bit_interleave(input, h->temp, tcod_per_fw[cblen_idx], long_cb);
/* Parity bits for the 2nd constituent encoders */ /* Parity bits for the 2nd constituent encoders */
uint8_t state1 = 0; uint8_t state1 = 0;
for (uint32_t i = 0; i < long_cb / 8; i++) { for (uint32_t i = 0; i < long_cb / 8; i++) {
tcod_lut_t l = tcod_lut[state1][h->temp[i]]; tcod_lut_t l = tcod_lut[state1][h->temp[i]];
uint8_t out = l.output; uint8_t out = l.output;
parity[long_cb / 8 + i] |= (out & 0xf0) >> 4; parity[long_cb / 8 + i] |= (out & 0xf0) >> 4;
parity[long_cb / 8 + i + 1] = (out & 0xf) << 4; parity[long_cb / 8 + i + 1] = (out & 0xf) << 4;
state1 = l.next_state; state1 = l.next_state;
} }
/* Tail bits */ /* Tail bits */
uint8_t reg1_0, reg1_1, reg1_2, reg2_0, reg2_1, reg2_2; uint8_t reg1_0, reg1_1, reg1_2, reg2_0, reg2_1, reg2_2;
uint8_t bit, in, out; uint8_t bit, in, out;
uint8_t k = 0; uint8_t k = 0;
uint8_t tail[12]; uint8_t tail[12];
reg2_0 = (state1 & 4) >> 2; reg2_0 = (state1 & 4) >> 2;
reg2_1 = (state1 & 2) >> 1; reg2_1 = (state1 & 2) >> 1;
reg2_2 = state1 & 1; reg2_2 = state1 & 1;
reg1_0 = (state0 & 4) >> 2; reg1_0 = (state0 & 4) >> 2;
reg1_1 = (state0 & 2) >> 1; reg1_1 = (state0 & 2) >> 1;
reg1_2 = state0 & 1; reg1_2 = state0 & 1;
/* TAILING CODER #1 */ /* TAILING CODER #1 */
for (uint32_t j = 0; j < NOF_REGS; j++) { for (uint32_t j = 0; j < NOF_REGS; j++) {
bit = reg1_2 ^ reg1_1; bit = reg1_2 ^ reg1_1;
tail[k] = bit; tail[k] = bit;
k++; k++;
in = bit ^ (reg1_2 ^ reg1_1); in = bit ^ (reg1_2 ^ reg1_1);
out = reg1_2 ^ (reg1_0 ^ in); out = reg1_2 ^ (reg1_0 ^ in);
reg1_2 = reg1_1; reg1_2 = reg1_1;
reg1_1 = reg1_0; reg1_1 = reg1_0;
reg1_0 = in; reg1_0 = in;
tail[k] = out; tail[k] = out;
k++; k++;
} }
/* TAILING CODER #2 */ /* TAILING CODER #2 */
for (uint32_t j = 0; j < NOF_REGS; j++) { for (uint32_t j = 0; j < NOF_REGS; j++) {
bit = reg2_2 ^ reg2_1; bit = reg2_2 ^ reg2_1;
tail[k] = bit; tail[k] = bit;
k++; k++;
in = bit ^ (reg2_2 ^ reg2_1); in = bit ^ (reg2_2 ^ reg2_1);
out = reg2_2 ^ (reg2_0 ^ in); out = reg2_2 ^ (reg2_0 ^ in);
reg2_2 = reg2_1; reg2_2 = reg2_1;
reg2_1 = reg2_0; reg2_1 = reg2_0;
reg2_0 = in; reg2_0 = in;
tail[k] = out; tail[k] = out;
k++; k++;
} }
uint8_t tailv[3][4]; uint8_t tailv[3][4];
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
for (int j = 0; j < 3; j++) { for (int j = 0; j < 3; j++) {
tailv[j][i] = tail[3 * i + j]; tailv[j][i] = tail[3 * i + j];
} }
} }
uint8_t* x = tailv[0]; uint8_t* x = tailv[0];
input[long_cb / 8] = (srslte_bit_pack(&x, 4) << 4); input[long_cb / 8] = (srslte_bit_pack(&x, 4) << 4);
x = tailv[1]; x = tailv[1];
parity[long_cb / 8] |= (srslte_bit_pack(&x, 4) << 4); parity[long_cb / 8] |= (srslte_bit_pack(&x, 4) << 4);
x = tailv[2]; x = tailv[2];
parity[2 * long_cb / 8] |= (srslte_bit_pack(&x, 4) & 0xf); parity[2 * long_cb / 8] |= (srslte_bit_pack(&x, 4) & 0xf);
return 3 * long_cb + TOTALTAIL; return 3 * long_cb + TOTALTAIL;
} else { } else {
return -1; return -1;
} }
} }
void srslte_tcod_gentable() void srslte_tcod_gentable()
{ {
srslte_tc_interl_t interl; srslte_tc_interl_t interl;
if (srslte_tc_interl_init(&interl, 6144)) { if (srslte_tc_interl_init(&interl, 6144)) {
ERROR("Error initiating interleave\n"); ERROR("Error initiating interleave\n");
return; return;
} }
for (uint32_t len = 0; len < 188; len++) { for (uint32_t len = 0; len < 188; len++) {
uint32_t long_cb = srslte_cbsegm_cbsize(len); uint32_t long_cb = srslte_cbsegm_cbsize(len);
if (srslte_tc_interl_LTE_gen(&interl, long_cb)) { if (srslte_tc_interl_LTE_gen(&interl, long_cb)) {
ERROR("Error initiating TC interleaver for long_cb=%d\n", long_cb); ERROR("Error initiating TC interleaver for long_cb=%d\n", long_cb);
return; return;
} }
// Save fw/bw permutation tables // Save fw/bw permutation tables
for (uint32_t i = 0; i < long_cb; i++) { for (uint32_t i = 0; i < long_cb; i++) {
tcod_per_fw[len][i] = interl.forward[i]; tcod_per_fw[len][i] = interl.forward[i];
} }
srslte_bit_interleaver_init(&tcod_interleavers[len], tcod_per_fw[len], long_cb); srslte_bit_interleaver_init(&tcod_interleavers[len], tcod_per_fw[len], long_cb);
for (uint32_t i = long_cb; i < 6144; i++) { for (uint32_t i = long_cb; i < 6144; i++) {
tcod_per_fw[len][i] = 0; tcod_per_fw[len][i] = 0;
} }
} }
// Compute state transitions // Compute state transitions
for (uint32_t state = 0; state < 8; state++) { for (uint32_t state = 0; state < 8; state++) {
for (uint32_t data = 0; data < 256; data++) { for (uint32_t data = 0; data < 256; data++) {
uint8_t reg_0, reg_1, reg_2; uint8_t reg_0, reg_1, reg_2;
reg_0 = (state & 4) >> 2; reg_0 = (state & 4) >> 2;
reg_1 = (state & 2) >> 1; reg_1 = (state & 2) >> 1;
reg_2 = state & 1; reg_2 = state & 1;
tcod_lut[state][data].output = 0; tcod_lut[state][data].output = 0;
uint8_t bit, in, out; uint8_t bit, in, out;
for (uint32_t i = 0; i < 8; i++) { for (uint32_t i = 0; i < 8; i++) {
bit = (data & (1 << (7 - i))) ? 1 : 0; bit = (data & (1 << (7 - i))) ? 1 : 0;
in = bit ^ (reg_2 ^ reg_1); in = bit ^ (reg_2 ^ reg_1);
out = reg_2 ^ (reg_0 ^ in); out = reg_2 ^ (reg_0 ^ in);
reg_2 = reg_1; reg_2 = reg_1;
reg_1 = reg_0; reg_1 = reg_0;
reg_0 = in; reg_0 = in;
tcod_lut[state][data].output |= out << (7 - i); tcod_lut[state][data].output |= out << (7 - i);
} }
tcod_lut[state][data].next_state = (uint8_t)((reg_0 << 2 | reg_1 << 1 | reg_2) % 8); tcod_lut[state][data].next_state = (uint8_t)((reg_0 << 2 | reg_1 << 1 | reg_2) % 8);
} }
} }
srslte_tc_interl_free(&interl); srslte_tc_interl_free(&interl);
} }

@ -24,14 +24,14 @@
#include <stdlib.h> #include <stdlib.h>
#include <strings.h> #include <strings.h>
#include "srslte/phy/fec/turbodecoder.h" #include "srslte/phy/fec/turbo/turbodecoder.h"
#include "srslte/phy/utils/vector.h" #include "srslte/phy/utils/vector.h"
#include "srslte/srslte.h" #include "srslte/srslte.h"
#define debug_enabled 0 #define debug_enabled 0
/* Generic (no SSE) implementation */ /* Generic (no SSE) implementation */
#include "srslte/phy/fec/turbodecoder_gen.h" #include "srslte/phy/fec/turbo/turbodecoder_gen.h"
srslte_tdec_16bit_impl_t gen_impl = {tdec_gen_init, srslte_tdec_16bit_impl_t gen_impl = {tdec_gen_init,
tdec_gen_free, tdec_gen_free,
tdec_gen_dec, tdec_gen_dec,
@ -40,7 +40,7 @@ srslte_tdec_16bit_impl_t gen_impl = {tdec_gen_init,
/* SSE no-window implementation */ /* SSE no-window implementation */
#ifdef LV_HAVE_SSE #ifdef LV_HAVE_SSE
#include "srslte/phy/fec/turbodecoder_sse.h" #include "srslte/phy/fec/turbo/turbodecoder_sse.h"
srslte_tdec_16bit_impl_t sse_impl = {tdec_sse_init, srslte_tdec_16bit_impl_t sse_impl = {tdec_sse_init,
tdec_sse_free, tdec_sse_free,
tdec_sse_dec, tdec_sse_dec,
@ -50,7 +50,7 @@ srslte_tdec_16bit_impl_t sse_impl = {tdec_sse_init,
/* SSE window implementation */ /* SSE window implementation */
#define WINIMP_IS_SSE16 #define WINIMP_IS_SSE16
#include "srslte/phy/fec/turbodecoder_win.h" #include "srslte/phy/fec/turbo/turbodecoder_win.h"
#undef WINIMP_IS_SSE16 #undef WINIMP_IS_SSE16
srslte_tdec_16bit_impl_t sse16_win_impl = {tdec_winsse16_init, srslte_tdec_16bit_impl_t sse16_win_impl = {tdec_winsse16_init,
@ -63,7 +63,7 @@ srslte_tdec_16bit_impl_t sse16_win_impl = {tdec_winsse16_init,
/* AVX window implementation */ /* AVX window implementation */
#ifdef LV_HAVE_AVX2 #ifdef LV_HAVE_AVX2
#define WINIMP_IS_AVX16 #define WINIMP_IS_AVX16
#include "srslte/phy/fec/turbodecoder_win.h" #include "srslte/phy/fec/turbo/turbodecoder_win.h"
#undef WINIMP_IS_AVX16 #undef WINIMP_IS_AVX16
srslte_tdec_16bit_impl_t avx16_win_impl = {tdec_winavx16_init, srslte_tdec_16bit_impl_t avx16_win_impl = {tdec_winavx16_init,
tdec_winavx16_free, tdec_winavx16_free,
@ -75,7 +75,7 @@ srslte_tdec_16bit_impl_t avx16_win_impl = {tdec_winavx16_init,
/* SSE window implementation */ /* SSE window implementation */
#ifdef LV_HAVE_SSE #ifdef LV_HAVE_SSE
#define WINIMP_IS_SSE8 #define WINIMP_IS_SSE8
#include "srslte/phy/fec/turbodecoder_win.h" #include "srslte/phy/fec/turbo/turbodecoder_win.h"
#undef WINIMP_IS_SSE8 #undef WINIMP_IS_SSE8
srslte_tdec_8bit_impl_t sse8_win_impl = {tdec_winsse8_init, srslte_tdec_8bit_impl_t sse8_win_impl = {tdec_winsse8_init,
@ -88,7 +88,7 @@ srslte_tdec_8bit_impl_t sse8_win_impl = {tdec_winsse8_init,
/* AVX window implementation */ /* AVX window implementation */
#ifdef LV_HAVE_AVX2 #ifdef LV_HAVE_AVX2
#define WINIMP_IS_AVX8 #define WINIMP_IS_AVX8
#include "srslte/phy/fec/turbodecoder_win.h" #include "srslte/phy/fec/turbo/turbodecoder_win.h"
#undef WINIMP_IS_AVX8 #undef WINIMP_IS_AVX8
srslte_tdec_8bit_impl_t avx8_win_impl = {tdec_winavx8_init, srslte_tdec_8bit_impl_t avx8_win_impl = {tdec_winavx8_init,
tdec_winavx8_free, tdec_winavx8_free,
@ -119,11 +119,11 @@ srslte_tdec_16bit_impl_t arm16_win_impl = {tdec_winarm16_init,
// Include interfaces for 8 and 16 bit decoder implementations // Include interfaces for 8 and 16 bit decoder implementations
#define LLR_IS_8BIT #define LLR_IS_8BIT
#include "srslte/phy/fec/turbodecoder_iter.h" #include "srslte/phy/fec/turbo/turbodecoder_iter.h"
#undef LLR_IS_8BIT #undef LLR_IS_8BIT
#define LLR_IS_16BIT #define LLR_IS_16BIT
#include "srslte/phy/fec/turbodecoder_iter.h" #include "srslte/phy/fec/turbo/turbodecoder_iter.h"
#undef LLR_IS_16BIT #undef LLR_IS_16BIT
int srslte_tdec_init(srslte_tdec_t* h, uint32_t max_long_cb) int srslte_tdec_init(srslte_tdec_t* h, uint32_t max_long_cb)

@ -26,7 +26,7 @@
#include <string.h> #include <string.h>
#include <strings.h> #include <strings.h>
#include "srslte/phy/fec/turbodecoder_gen.h" #include "srslte/phy/fec/turbo/turbodecoder_gen.h"
#include "srslte/phy/utils/vector.h" #include "srslte/phy/utils/vector.h"
#define NUMSTATES 8 #define NUMSTATES 8

@ -26,7 +26,7 @@
#include <string.h> #include <string.h>
#include <strings.h> #include <strings.h>
#include "srslte/phy/fec/turbodecoder_sse.h" #include "srslte/phy/fec/turbo/turbodecoder_sse.h"
#include "srslte/phy/utils/vector.h" #include "srslte/phy/utils/vector.h"
#include <inttypes.h> #include <inttypes.h>

@ -29,7 +29,7 @@
#include "prb_dl.h" #include "prb_dl.h"
#include "srslte/phy/common/phy_common.h" #include "srslte/phy/common/phy_common.h"
#include "srslte/phy/fec/rm_conv.h" #include "srslte/phy/fec/convolutional/rm_conv.h"
#include "srslte/phy/phch/npdsch.h" #include "srslte/phy/phch/npdsch.h"
#include "srslte/phy/utils/bit.h" #include "srslte/phy/utils/bit.h"
#include "srslte/phy/utils/debug.h" #include "srslte/phy/utils/debug.h"

@ -20,7 +20,7 @@
*/ */
#include "srslte/phy/phch/psbch.h" #include "srslte/phy/phch/psbch.h"
#include "srslte/phy/fec/rm_conv.h" #include "srslte/phy/fec/convolutional/rm_conv.h"
#include "srslte/phy/modem/mod.h" #include "srslte/phy/modem/mod.h"
#include "srslte/phy/phch/sch.h" #include "srslte/phy/phch/sch.h"
#include "srslte/phy/utils/bit.h" #include "srslte/phy/utils/bit.h"

@ -23,7 +23,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "srslte/phy/fec/rm_conv.h" #include "srslte/phy/fec/convolutional/rm_conv.h"
#include "srslte/phy/modem/demod_soft.h" #include "srslte/phy/modem/demod_soft.h"
#include "srslte/phy/modem/mod.h" #include "srslte/phy/modem/mod.h"
#include "srslte/phy/phch/pscch.h" #include "srslte/phy/phch/pscch.h"

@ -21,7 +21,7 @@
#include <string.h> #include <string.h>
#include "srslte/phy/fec/rm_turbo.h" #include "srslte/phy/fec/turbo/rm_turbo.h"
#include "srslte/phy/modem/demod_soft.h" #include "srslte/phy/modem/demod_soft.h"
#include "srslte/phy/phch/pssch.h" #include "srslte/phy/phch/pssch.h"
#include "srslte/phy/phch/ra.h" #include "srslte/phy/phch/ra.h"

@ -29,10 +29,10 @@
#include <strings.h> #include <strings.h>
#include "srslte/phy/common/phy_common.h" #include "srslte/phy/common/phy_common.h"
#include "srslte/phy/fec/cbsegm.h" #include "srslte/phy/fec/convolutional/convcoder.h"
#include "srslte/phy/fec/convcoder.h" #include "srslte/phy/fec/convolutional/rm_conv.h"
#include "srslte/phy/fec/crc.h" #include "srslte/phy/fec/crc.h"
#include "srslte/phy/fec/rm_conv.h" #include "srslte/phy/fec/turbo/cbsegm.h"
#include "srslte/phy/phch/uci.h" #include "srslte/phy/phch/uci.h"
#include "srslte/phy/utils/bit.h" #include "srslte/phy/utils/bit.h"
#include "srslte/phy/utils/debug.h" #include "srslte/phy/utils/debug.h"

Loading…
Cancel
Save