mirror of https://github.com/PentHertz/srsLTE.git
refactored FEC directories
This commit is contained in:
parent
7093a85f81
commit
f21590735d
|
@ -32,8 +32,8 @@
|
|||
#ifndef SRSLTE_CONVCODER_H
|
||||
#define SRSLTE_CONVCODER_H
|
||||
|
||||
#include "../../../../../../../../../../usr/lib/gcc/x86_64-linux-gnu/7/include/stdbool.h"
|
||||
#include "../../../config.h"
|
||||
#include "srslte/config.h"
|
||||
#include <stdbool.h>
|
||||
|
||||
typedef struct SRSLTE_API {
|
||||
uint32_t R;
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
#ifndef SRSLTE_RM_CONV_H
|
||||
#define SRSLTE_RM_CONV_H
|
||||
|
||||
#include "../../../config.h"
|
||||
#include "srslte/config.h"
|
||||
|
||||
#ifndef SRSLTE_RX_NULL
|
||||
#define SRSLTE_RX_NULL 10000
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
*/
|
||||
|
||||
/******************************************************************************
|
||||
* File: convolutional.h
|
||||
* File: viterbi.h
|
||||
*
|
||||
* Description: Viterbi decoder for convolutionally encoded data.
|
||||
* Used for decoding of PBCH and PDCCH (type 37 decoder).
|
||||
|
@ -31,8 +31,8 @@
|
|||
#ifndef SRSLTE_VITERBI_H
|
||||
#define SRSLTE_VITERBI_H
|
||||
|
||||
#include "../../../../../../../../../../usr/lib/gcc/x86_64-linux-gnu/7/include/stdbool.h"
|
||||
#include "../../../config.h"
|
||||
#include "srslte/config.h"
|
||||
#include <stdbool.h>
|
||||
|
||||
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
|
||||
|
||||
#include "srslte/config.h"
|
||||
#include "srslte/phy/fec/turbodecoder.h"
|
||||
#include "srslte/phy/fec/turbo/turbodecoder.h"
|
||||
|
||||
#ifndef SRSLTE_RX_NULL
|
||||
#define SRSLTE_RX_NULL 10000
|
||||
|
|
|
@ -17,56 +17,55 @@
|
|||
* the LICENSE file in the top-level directory of this distribution
|
||||
* and at http://www.gnu.org/licenses/.
|
||||
*
|
||||
*/
|
||||
|
||||
/**********************************************************************************************
|
||||
* File: turbocoder.h
|
||||
*
|
||||
* Description: Turbo coder.
|
||||
* Parallel Concatenated Convolutional Code (PCCC) with two 8-state constituent
|
||||
* encoders and one turbo code internal interleaver. The coding rate of turbo
|
||||
* encoder is 1/3.
|
||||
*
|
||||
* Reference: 3GPP TS 36.212 version 10.0.0 Release 10 Sec. 5.1.3.2
|
||||
*********************************************************************************************/
|
||||
|
||||
#ifndef SRSLTE_TURBOCODER_H
|
||||
#define SRSLTE_TURBOCODER_H
|
||||
|
||||
#include "srslte/config.h"
|
||||
#include "srslte/phy/fec/crc.h"
|
||||
#include "srslte/phy/fec/tc_interl.h"
|
||||
|
||||
#define SRSLTE_TCOD_MAX_LEN_CB_BYTES (6144 / 8)
|
||||
|
||||
#ifndef SRSLTE_TX_NULL
|
||||
#define SRSLTE_TX_NULL 100
|
||||
#endif
|
||||
|
||||
typedef struct SRSLTE_API {
|
||||
uint32_t max_long_cb;
|
||||
uint8_t* temp;
|
||||
} srslte_tcod_t;
|
||||
|
||||
/* 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
|
||||
* with the systematic bits
|
||||
*/
|
||||
|
||||
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 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_crc_t* crc_tb,
|
||||
srslte_crc_t* crc_cb,
|
||||
uint8_t* input,
|
||||
uint8_t* parity,
|
||||
uint32_t cblen_idx,
|
||||
bool last_cb);
|
||||
|
||||
SRSLTE_API void srslte_tcod_gentable();
|
||||
|
||||
#endif // SRSLTE_TURBOCODER_H
|
||||
*/
|
||||
|
||||
/**********************************************************************************************
|
||||
* File: turbocoder.h
|
||||
*
|
||||
* Description: Turbo coder.
|
||||
* Parallel Concatenated Convolutional Code (PCCC) with two 8-state constituent
|
||||
* encoders and one turbo code internal interleaver. The coding rate of turbo
|
||||
* encoder is 1/3.
|
||||
*
|
||||
* Reference: 3GPP TS 36.212 version 10.0.0 Release 10 Sec. 5.1.3.2
|
||||
*********************************************************************************************/
|
||||
|
||||
#ifndef SRSLTE_TURBOCODER_H
|
||||
#define SRSLTE_TURBOCODER_H
|
||||
|
||||
#include "srslte/config.h"
|
||||
#include "srslte/phy/fec/crc.h"
|
||||
#include "srslte/phy/fec/turbo/tc_interl.h"
|
||||
#define SRSLTE_TCOD_MAX_LEN_CB_BYTES (6144 / 8)
|
||||
|
||||
#ifndef SRSLTE_TX_NULL
|
||||
#define SRSLTE_TX_NULL 100
|
||||
#endif
|
||||
|
||||
typedef struct SRSLTE_API {
|
||||
uint32_t max_long_cb;
|
||||
uint8_t* temp;
|
||||
} srslte_tcod_t;
|
||||
|
||||
/* 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
|
||||
* with the systematic bits
|
||||
*/
|
||||
|
||||
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 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_crc_t* crc_tb,
|
||||
srslte_crc_t* crc_cb,
|
||||
uint8_t* input,
|
||||
uint8_t* parity,
|
||||
uint32_t cblen_idx,
|
||||
bool last_cb);
|
||||
|
||||
SRSLTE_API void srslte_tcod_gentable();
|
||||
|
||||
#endif // SRSLTE_TURBOCODER_H
|
||||
|
|
|
@ -35,8 +35,8 @@
|
|||
#define SRSLTE_TURBODECODER_H
|
||||
|
||||
#include "srslte/config.h"
|
||||
#include "srslte/phy/fec/cbsegm.h"
|
||||
#include "srslte/phy/fec/tc_interl.h"
|
||||
#include "srslte/phy/fec/turbo/cbsegm.h"
|
||||
#include "srslte/phy/fec/turbo/tc_interl.h"
|
||||
|
||||
#define SRSLTE_TCOD_RATE 3
|
||||
#define SRSLTE_TCOD_TOTALTAIL 12
|
||||
|
@ -48,11 +48,11 @@
|
|||
|
||||
// Include interfaces for 8 and 16 bit decoder implementations
|
||||
#define LLR_IS_8BIT
|
||||
#include "srslte/phy/fec/turbodecoder_impl.h"
|
||||
#include "srslte/phy/fec/turbo/turbodecoder_impl.h"
|
||||
#undef LLR_IS_8BIT
|
||||
|
||||
#define LLR_IS_16BIT
|
||||
#include "srslte/phy/fec/turbodecoder_impl.h"
|
||||
#include "srslte/phy/fec/turbo/turbodecoder_impl.h"
|
||||
#undef LLR_IS_16BIT
|
||||
|
||||
#define SRSLTE_TDEC_NOF_AUTO_MODES_8 2
|
||||
|
|
|
@ -35,9 +35,8 @@
|
|||
#define SRSLTE_TURBODECODER_GEN_H
|
||||
|
||||
#include "srslte/config.h"
|
||||
#include "srslte/phy/fec/cbsegm.h"
|
||||
#include "srslte/phy/fec/tc_interl.h"
|
||||
|
||||
#include "srslte/phy/fec/turbo/cbsegm.h"
|
||||
#include "srslte/phy/fec/turbo/tc_interl.h"
|
||||
#define SRSLTE_TCOD_RATE 3
|
||||
#define SRSLTE_TCOD_TOTALTAIL 12
|
||||
|
||||
|
|
|
@ -25,10 +25,10 @@
|
|||
#include "srslte/config.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/rm_conv.h"
|
||||
#include "srslte/phy/fec/viterbi.h"
|
||||
#include "srslte/phy/mimo/layermap.h"
|
||||
#include "srslte/phy/mimo/precoding.h"
|
||||
#include "srslte/phy/modem/demod_soft.h"
|
||||
|
|
|
@ -24,10 +24,10 @@
|
|||
|
||||
#include "srslte/config.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/rm_conv.h"
|
||||
#include "srslte/phy/fec/viterbi.h"
|
||||
#include "srslte/phy/mimo/layermap.h"
|
||||
#include "srslte/phy/mimo/precoding.h"
|
||||
#include "srslte/phy/modem/demod_soft.h"
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
|
||||
#include "srslte/config.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/mimo/layermap.h"
|
||||
#include "srslte/phy/mimo/precoding.h"
|
||||
|
|
|
@ -35,10 +35,10 @@
|
|||
#include "srslte/config.h"
|
||||
#include "srslte/phy/ch_estimation/chest_dl.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/rm_conv.h"
|
||||
#include "srslte/phy/fec/viterbi.h"
|
||||
#include "srslte/phy/mimo/layermap.h"
|
||||
#include "srslte/phy/mimo/precoding.h"
|
||||
#include "srslte/phy/modem/demod_soft.h"
|
||||
|
|
|
@ -33,10 +33,10 @@
|
|||
#include "srslte/config.h"
|
||||
#include "srslte/phy/ch_estimation/chest_dl.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/rm_conv.h"
|
||||
#include "srslte/phy/fec/viterbi.h"
|
||||
#include "srslte/phy/mimo/layermap.h"
|
||||
#include "srslte/phy/mimo/precoding.h"
|
||||
#include "srslte/phy/modem/demod_soft.h"
|
||||
|
|
|
@ -30,8 +30,8 @@
|
|||
#ifndef 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/turbo/cbsegm.h"
|
||||
#include "srslte/phy/phch/ra.h"
|
||||
|
||||
typedef struct SRSLTE_API {
|
||||
|
|
|
@ -22,14 +22,14 @@
|
|||
#ifndef SRSLTE_PSBCH_H
|
||||
#define SRSLTE_PSBCH_H
|
||||
|
||||
#include <srslte/phy/common/phy_common_sl.h>
|
||||
#include <srslte/phy/dft/dft_precoding.h>
|
||||
#include <srslte/phy/fec/convcoder.h>
|
||||
#include <srslte/phy/fec/crc.h>
|
||||
#include <srslte/phy/fec/viterbi.h>
|
||||
#include <srslte/phy/modem/demod_soft.h>
|
||||
#include <srslte/phy/modem/modem_table.h>
|
||||
#include <srslte/phy/scrambling/scrambling.h>
|
||||
#include "srslte/phy/common/phy_common_sl.h"
|
||||
#include "srslte/phy/dft/dft_precoding.h"
|
||||
#include "srslte/phy/fec/convolutional/convcoder.h"
|
||||
#include "srslte/phy/fec/convolutional/viterbi.h"
|
||||
#include "srslte/phy/fec/crc.h"
|
||||
#include "srslte/phy/modem/demod_soft.h"
|
||||
#include "srslte/phy/modem/modem_table.h"
|
||||
#include "srslte/phy/scrambling/scrambling.h"
|
||||
|
||||
#define SRSLTE_SL_BCH_CRC_LEN 16
|
||||
|
||||
|
|
|
@ -27,9 +27,9 @@
|
|||
#include "srslte/phy/common/phy_common_sl.h"
|
||||
#include "srslte/phy/common/sequence.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/viterbi.h"
|
||||
#include "srslte/phy/modem/modem_table.h"
|
||||
|
||||
/**
|
||||
|
|
|
@ -25,8 +25,8 @@
|
|||
#include "srslte/phy/common/phy_common_sl.h"
|
||||
#include "srslte/phy/dft/dft_precoding.h"
|
||||
#include "srslte/phy/fec/crc.h"
|
||||
#include "srslte/phy/fec/turbocoder.h"
|
||||
#include "srslte/phy/fec/turbodecoder.h"
|
||||
#include "srslte/phy/fec/turbo/turbocoder.h"
|
||||
#include "srslte/phy/fec/turbo/turbodecoder.h"
|
||||
#include "srslte/phy/modem/mod.h"
|
||||
#include "srslte/phy/scrambling/scrambling.h"
|
||||
|
||||
|
|
|
@ -33,9 +33,9 @@
|
|||
#include "srslte/config.h"
|
||||
#include "srslte/phy/common/phy_common.h"
|
||||
#include "srslte/phy/fec/crc.h"
|
||||
#include "srslte/phy/fec/rm_turbo.h"
|
||||
#include "srslte/phy/fec/turbocoder.h"
|
||||
#include "srslte/phy/fec/turbodecoder.h"
|
||||
#include "srslte/phy/fec/turbo/rm_turbo.h"
|
||||
#include "srslte/phy/fec/turbo/turbocoder.h"
|
||||
#include "srslte/phy/fec/turbo/turbodecoder.h"
|
||||
#include "srslte/phy/phch/pdsch_cfg.h"
|
||||
#include "srslte/phy/phch/pusch_cfg.h"
|
||||
#include "srslte/phy/phch/uci.h"
|
||||
|
|
|
@ -32,8 +32,8 @@
|
|||
|
||||
#include "srslte/config.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/viterbi.h"
|
||||
#include "srslte/phy/phch/pusch_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/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_precoding.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/filesink.h"
|
||||
|
|
|
@ -18,6 +18,12 @@
|
|||
# and at http://www.gnu.org/licenses/.
|
||||
#
|
||||
|
||||
file(GLOB SOURCES "*.c")
|
||||
add_library(srslte_fec OBJECT ${SOURCES})
|
||||
set(FEC_SOURCES
|
||||
crc.c
|
||||
softbuffer.c)
|
||||
|
||||
add_subdirectory(test)
|
||||
add_subdirectory(convolutional)
|
||||
add_subdirectory(turbo)
|
||||
|
||||
add_library(srslte_fec OBJECT ${FEC_SOURCES})
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
#include <stdlib.h>
|
||||
|
||||
#include "parity.h"
|
||||
#include "srslte/phy/fec/convcoder.h"
|
||||
#include "srslte/phy/fec/convolutional/convcoder.h"
|
||||
|
||||
/**
|
||||
* Convolution encodes according to given parameters.
|
||||
|
|
|
@ -26,8 +26,8 @@
|
|||
#include <math.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "../parity.h"
|
||||
#include "srslte/phy/fec/viterbi.h"
|
||||
#include "parity.h"
|
||||
#include "srslte/phy/fec/convolutional/viterbi.h"
|
||||
#include "srslte/phy/utils/debug.h"
|
||||
#include "srslte/phy/utils/vector.h"
|
||||
#include "viterbi37.h"
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* May be used under the terms of the GNU Lesser General Public License (LGPL)
|
||||
*/
|
||||
|
||||
#include "../parity.h"
|
||||
#include "parity.h"
|
||||
#include <limits.h>
|
||||
#include <memory.h>
|
||||
#include <stdint.h>
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* May be used under the terms of the GNU Lesser General Public License (LGPL)
|
||||
*/
|
||||
|
||||
#include "../parity.h"
|
||||
#include "parity.h"
|
||||
#include <limits.h>
|
||||
#include <memory.h>
|
||||
#include <stdint.h>
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* May be used under the terms of the GNU Lesser General Public License (LGPL)
|
||||
*/
|
||||
|
||||
#include "../parity.h"
|
||||
#include "parity.h"
|
||||
#include <limits.h>
|
||||
#include <memory.h>
|
||||
#include <stdint.h>
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "../parity.h"
|
||||
#include "parity.h"
|
||||
#include "viterbi37.h"
|
||||
#include <limits.h>
|
||||
#include <memory.h>
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* May be used under the terms of the GNU Lesser General Public License (LGPL)
|
||||
*/
|
||||
|
||||
#include "../parity.h"
|
||||
#include "parity.h"
|
||||
#include <limits.h>
|
||||
#include <memory.h>
|
||||
#include <stdint.h>
|
||||
|
|
|
@ -19,21 +19,16 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <math.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <strings.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/turbodecoder_gen.h"
|
||||
#include "srslte/phy/fec/turbo/turbodecoder_gen.h"
|
||||
#include "srslte/phy/phch/ra.h"
|
||||
#include "srslte/phy/utils/debug.h"
|
||||
#include "srslte/phy/utils/vector.h"
|
||||
|
||||
#define MAX_PDSCH_RE(cp) (2 * SRSLTE_CP_NSYMB(cp) * 12)
|
||||
|
|
|
@ -18,57 +18,6 @@
|
|||
# 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
|
||||
########################################################################
|
||||
|
|
|
@ -22,8 +22,8 @@
|
|||
#include <math.h>
|
||||
#include <strings.h>
|
||||
|
||||
#include "srslte/phy/fec/cbsegm.h"
|
||||
#include "srslte/phy/fec/turbodecoder_gen.h"
|
||||
#include "srslte/phy/fec/turbo/cbsegm.h"
|
||||
#include "srslte/phy/fec/turbo/turbodecoder_gen.h"
|
||||
#include "srslte/phy/utils/debug.h"
|
||||
|
||||
const uint32_t tc_cb_sizes[SRSLTE_NOF_TC_CB_SIZES] = {
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
#include <stdio.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"
|
||||
|
||||
#define NCOLS 32
|
||||
|
|
|
@ -26,8 +26,8 @@
|
|||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "srslte/phy/fec/cbsegm.h"
|
||||
#include "srslte/phy/fec/rm_turbo.h"
|
||||
#include "srslte/phy/fec/turbo/cbsegm.h"
|
||||
#include "srslte/phy/fec/turbo/rm_turbo.h"
|
||||
#include "srslte/phy/utils/bit.h"
|
||||
#include "srslte/phy/utils/debug.h"
|
||||
#include "srslte/phy/utils/vector.h"
|
||||
|
|
|
@ -17,93 +17,93 @@
|
|||
* the LICENSE file in the top-level directory of this distribution
|
||||
* and at http://www.gnu.org/licenses/.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "srslte/phy/common/phy_common.h"
|
||||
#include "srslte/phy/fec/cbsegm.h"
|
||||
#include "srslte/phy/fec/tc_interl.h"
|
||||
#include "srslte/phy/fec/turbocoder.h"
|
||||
#include "srslte/phy/utils/debug.h"
|
||||
#include "srslte/phy/utils/vector.h"
|
||||
|
||||
/************************************************
|
||||
*
|
||||
* LTE TURBO CODE INTERLEAVER
|
||||
*
|
||||
************************************************/
|
||||
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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};
|
||||
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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};
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
#define deinter(x, win) ((x % (long_cb / win)) * (win) + x / (long_cb / 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)
|
||||
{
|
||||
uint32_t cb_table_idx, f1, f2;
|
||||
uint64_t i, j;
|
||||
|
||||
if (long_cb > h->max_long_cb) {
|
||||
ERROR("Interleaver initiated for max_long_cb=%d\n", h->max_long_cb);
|
||||
return -1;
|
||||
}
|
||||
|
||||
cb_table_idx = srslte_cbsegm_cbindex(long_cb);
|
||||
if (cb_table_idx == -1) {
|
||||
ERROR("Can't find long_cb=%d in valid TC CB table\n", long_cb);
|
||||
return -1;
|
||||
}
|
||||
|
||||
f1 = f1_list[cb_table_idx];
|
||||
f2 = f2_list[cb_table_idx];
|
||||
|
||||
h->forward[0] = 0;
|
||||
h->reverse[0] = 0;
|
||||
for (i = 1; i < long_cb; i++) {
|
||||
j = (f1 * i + f2 * i * i) % (long_cb);
|
||||
h->forward[i] = (uint32_t)j;
|
||||
h->reverse[j] = (uint32_t)i;
|
||||
}
|
||||
if (interl_win != 1) {
|
||||
uint16_t* f = 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(r, h->reverse, long_cb * sizeof(uint16_t));
|
||||
for (i = 0; i < long_cb; i++) {
|
||||
h->forward[i] = deinter(f[inter(i, interl_win)], interl_win);
|
||||
h->reverse[i] = deinter(r[inter(i, interl_win)], interl_win);
|
||||
}
|
||||
free(f);
|
||||
free(r);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "srslte/phy/common/phy_common.h"
|
||||
#include "srslte/phy/fec/turbo/cbsegm.h"
|
||||
#include "srslte/phy/fec/turbo/tc_interl.h"
|
||||
#include "srslte/phy/fec/turbo/turbocoder.h"
|
||||
#include "srslte/phy/utils/debug.h"
|
||||
#include "srslte/phy/utils/vector.h"
|
||||
|
||||
/************************************************
|
||||
*
|
||||
* LTE TURBO CODE INTERLEAVER
|
||||
*
|
||||
************************************************/
|
||||
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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};
|
||||
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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};
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
#define deinter(x, win) ((x % (long_cb / win)) * (win) + x / (long_cb / 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)
|
||||
{
|
||||
uint32_t cb_table_idx, f1, f2;
|
||||
uint64_t i, j;
|
||||
|
||||
if (long_cb > h->max_long_cb) {
|
||||
ERROR("Interleaver initiated for max_long_cb=%d\n", h->max_long_cb);
|
||||
return -1;
|
||||
}
|
||||
|
||||
cb_table_idx = srslte_cbsegm_cbindex(long_cb);
|
||||
if (cb_table_idx == -1) {
|
||||
ERROR("Can't find long_cb=%d in valid TC CB table\n", long_cb);
|
||||
return -1;
|
||||
}
|
||||
|
||||
f1 = f1_list[cb_table_idx];
|
||||
f2 = f2_list[cb_table_idx];
|
||||
|
||||
h->forward[0] = 0;
|
||||
h->reverse[0] = 0;
|
||||
for (i = 1; i < long_cb; i++) {
|
||||
j = (f1 * i + f2 * i * i) % (long_cb);
|
||||
h->forward[i] = (uint32_t)j;
|
||||
h->reverse[j] = (uint32_t)i;
|
||||
}
|
||||
if (interl_win != 1) {
|
||||
uint16_t* f = 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(r, h->reverse, long_cb * sizeof(uint16_t));
|
||||
for (i = 0; i < long_cb; i++) {
|
||||
h->forward[i] = deinter(f[inter(i, interl_win)], interl_win);
|
||||
h->reverse[i] = deinter(r[inter(i, interl_win)], interl_win);
|
||||
}
|
||||
free(f);
|
||||
free(r);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -17,250 +17,250 @@
|
|||
* the LICENSE file in the top-level directory of this distribution
|
||||
* and at http://www.gnu.org/licenses/.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <strings.h>
|
||||
|
||||
#include "srslte/phy/fec/tc_interl.h"
|
||||
#include "srslte/phy/utils/debug.h"
|
||||
#include "srslte/phy/utils/vector.h"
|
||||
|
||||
#define TURBO_SRSLTE_TCOD_RATE 3
|
||||
|
||||
uint32_t mcd(uint32_t x, uint32_t y);
|
||||
|
||||
/************************************************
|
||||
*
|
||||
* UMTS TURBO CODE INTERLEAVER
|
||||
*
|
||||
************************************************/
|
||||
|
||||
#define MAX_ROWS 20
|
||||
#define MAX_COLS 256
|
||||
|
||||
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,
|
||||
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};
|
||||
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};
|
||||
|
||||
int srslte_tc_interl_init(srslte_tc_interl_t* h, uint32_t max_long_cb)
|
||||
{
|
||||
int ret = -1;
|
||||
h->forward = srslte_vec_u16_malloc(max_long_cb);
|
||||
if (!h->forward) {
|
||||
perror("malloc");
|
||||
goto clean_exit;
|
||||
}
|
||||
h->reverse = srslte_vec_u16_malloc(max_long_cb);
|
||||
if (!h->reverse) {
|
||||
perror("malloc");
|
||||
goto clean_exit;
|
||||
}
|
||||
h->max_long_cb = max_long_cb;
|
||||
ret = 0;
|
||||
clean_exit:
|
||||
if (ret == -1) {
|
||||
srslte_tc_interl_free(h);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void srslte_tc_interl_free(srslte_tc_interl_t* h)
|
||||
{
|
||||
if (h->forward) {
|
||||
free(h->forward);
|
||||
}
|
||||
if (h->reverse) {
|
||||
free(h->reverse);
|
||||
}
|
||||
bzero(h, sizeof(srslte_tc_interl_t));
|
||||
}
|
||||
|
||||
int srslte_tc_interl_UMTS_gen(srslte_tc_interl_t* h, uint32_t long_cb)
|
||||
{
|
||||
|
||||
uint32_t i, j;
|
||||
uint32_t res, prim, aux;
|
||||
uint32_t kp, k;
|
||||
uint16_t *per, *desper;
|
||||
uint8_t v;
|
||||
uint16_t p;
|
||||
uint16_t s[MAX_COLS], q[MAX_ROWS], r[MAX_ROWS], T[MAX_ROWS];
|
||||
uint16_t U[MAX_COLS * MAX_ROWS];
|
||||
uint32_t M_Rows, M_Cols, M_long;
|
||||
|
||||
M_long = long_cb;
|
||||
|
||||
if (long_cb > h->max_long_cb) {
|
||||
ERROR("Interleaver initiated for max_long_cb=%d\n", h->max_long_cb);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Find R*/
|
||||
if ((40 <= M_long) && (M_long <= 159))
|
||||
M_Rows = 5;
|
||||
else if (((160 <= M_long) && (M_long <= 200)) || ((481 <= M_long) && (M_long <= 530)))
|
||||
M_Rows = 10;
|
||||
else
|
||||
M_Rows = 20;
|
||||
|
||||
/* Find p i v*/
|
||||
if ((481 <= M_long) && (M_long <= 530)) {
|
||||
p = 53;
|
||||
v = 2;
|
||||
M_Cols = p;
|
||||
} else {
|
||||
i = 0;
|
||||
do {
|
||||
p = table_p[i];
|
||||
v = table_v[i];
|
||||
i++;
|
||||
} while (M_long > (M_Rows * (p + 1)));
|
||||
}
|
||||
|
||||
/* Find C*/
|
||||
if ((M_long) <= (M_Rows) * ((p)-1))
|
||||
M_Cols = (p)-1;
|
||||
else if (((M_Rows) * (p - 1) < M_long) && (M_long <= (M_Rows) * (p)))
|
||||
M_Cols = p;
|
||||
else if ((M_Rows) * (p) < M_long)
|
||||
M_Cols = (p) + 1;
|
||||
|
||||
q[0] = 1;
|
||||
prim = 6;
|
||||
|
||||
for (i = 1; i < M_Rows; i++) {
|
||||
do {
|
||||
prim++;
|
||||
res = mcd(prim, p - 1);
|
||||
} while (res != 1);
|
||||
q[i] = prim;
|
||||
}
|
||||
|
||||
s[0] = 1;
|
||||
for (i = 1; i < p - 1; i++) {
|
||||
s[i] = (v * s[i - 1]) % p;
|
||||
}
|
||||
|
||||
if (M_long <= 159 && M_long >= 40) {
|
||||
T[0] = 4;
|
||||
T[1] = 3;
|
||||
T[2] = 2;
|
||||
T[3] = 1;
|
||||
T[4] = 0;
|
||||
} else if ((M_long <= 200 && M_long >= 160) || (M_long <= 530 && M_long >= 481)) {
|
||||
T[0] = 9;
|
||||
T[1] = 8;
|
||||
T[2] = 7;
|
||||
T[3] = 6;
|
||||
T[4] = 5;
|
||||
T[5] = 4;
|
||||
T[6] = 3;
|
||||
T[7] = 2;
|
||||
T[8] = 1;
|
||||
T[9] = 0;
|
||||
} else if ((M_long <= 2480 && M_long >= 2281) || (M_long <= 3210 && M_long >= 3161)) {
|
||||
T[0] = 19;
|
||||
T[1] = 9;
|
||||
T[2] = 14;
|
||||
T[3] = 4;
|
||||
T[4] = 0;
|
||||
T[5] = 2;
|
||||
T[6] = 5;
|
||||
T[7] = 7;
|
||||
T[8] = 12;
|
||||
T[9] = 18;
|
||||
T[10] = 16;
|
||||
T[11] = 13;
|
||||
T[12] = 17;
|
||||
T[13] = 15;
|
||||
T[14] = 3;
|
||||
T[15] = 1;
|
||||
T[16] = 6;
|
||||
T[17] = 11;
|
||||
T[18] = 8;
|
||||
T[19] = 10;
|
||||
} else {
|
||||
T[0] = 19;
|
||||
T[1] = 9;
|
||||
T[2] = 14;
|
||||
T[3] = 4;
|
||||
T[4] = 0;
|
||||
T[5] = 2;
|
||||
T[6] = 5;
|
||||
T[7] = 7;
|
||||
T[8] = 12;
|
||||
T[9] = 18;
|
||||
T[10] = 10;
|
||||
T[11] = 8;
|
||||
T[12] = 13;
|
||||
T[13] = 17;
|
||||
T[14] = 3;
|
||||
T[15] = 1;
|
||||
T[16] = 16;
|
||||
T[17] = 6;
|
||||
T[18] = 15;
|
||||
T[19] = 11;
|
||||
}
|
||||
|
||||
for (i = 0; i < M_Rows; i++) {
|
||||
r[T[i]] = q[i];
|
||||
}
|
||||
|
||||
for (i = 0; i < M_Rows; i++) {
|
||||
for (j = 0; j < p - 1; j++) {
|
||||
U[i * M_Cols + j] = s[(j * r[i]) % (p - 1)];
|
||||
if (M_Cols == (p - 1))
|
||||
U[i * M_Cols + j] -= 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (M_Cols == p) {
|
||||
for (i = 0; i < M_Rows; i++)
|
||||
U[i * M_Cols + p - 1] = 0;
|
||||
} else if (M_Cols == p + 1) {
|
||||
for (i = 0; i < M_Rows; i++) {
|
||||
U[i * M_Cols + p - 1] = 0;
|
||||
U[i * M_Cols + p] = p;
|
||||
}
|
||||
if (M_long == M_Cols * M_Rows) {
|
||||
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 + 0] = aux;
|
||||
}
|
||||
}
|
||||
|
||||
per = h->forward;
|
||||
desper = h->reverse;
|
||||
|
||||
k = 0;
|
||||
for (j = 0; j < M_Cols; j++) {
|
||||
for (i = 0; i < M_Rows; i++) {
|
||||
kp = T[i] * M_Cols + U[i * M_Cols + j];
|
||||
if (kp < M_long) {
|
||||
desper[kp] = k;
|
||||
per[k] = kp;
|
||||
k++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t mcd(uint32_t x, uint32_t y)
|
||||
{
|
||||
uint32_t r = 1;
|
||||
|
||||
while (r) {
|
||||
r = x % y;
|
||||
x = y;
|
||||
y = r;
|
||||
}
|
||||
return x;
|
||||
}
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <strings.h>
|
||||
|
||||
#include "srslte/phy/fec/turbo/tc_interl.h"
|
||||
#include "srslte/phy/utils/debug.h"
|
||||
#include "srslte/phy/utils/vector.h"
|
||||
|
||||
#define TURBO_SRSLTE_TCOD_RATE 3
|
||||
|
||||
uint32_t mcd(uint32_t x, uint32_t y);
|
||||
|
||||
/************************************************
|
||||
*
|
||||
* UMTS TURBO CODE INTERLEAVER
|
||||
*
|
||||
************************************************/
|
||||
|
||||
#define MAX_ROWS 20
|
||||
#define MAX_COLS 256
|
||||
|
||||
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,
|
||||
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};
|
||||
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};
|
||||
|
||||
int srslte_tc_interl_init(srslte_tc_interl_t* h, uint32_t max_long_cb)
|
||||
{
|
||||
int ret = -1;
|
||||
h->forward = srslte_vec_u16_malloc(max_long_cb);
|
||||
if (!h->forward) {
|
||||
perror("malloc");
|
||||
goto clean_exit;
|
||||
}
|
||||
h->reverse = srslte_vec_u16_malloc(max_long_cb);
|
||||
if (!h->reverse) {
|
||||
perror("malloc");
|
||||
goto clean_exit;
|
||||
}
|
||||
h->max_long_cb = max_long_cb;
|
||||
ret = 0;
|
||||
clean_exit:
|
||||
if (ret == -1) {
|
||||
srslte_tc_interl_free(h);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void srslte_tc_interl_free(srslte_tc_interl_t* h)
|
||||
{
|
||||
if (h->forward) {
|
||||
free(h->forward);
|
||||
}
|
||||
if (h->reverse) {
|
||||
free(h->reverse);
|
||||
}
|
||||
bzero(h, sizeof(srslte_tc_interl_t));
|
||||
}
|
||||
|
||||
int srslte_tc_interl_UMTS_gen(srslte_tc_interl_t* h, uint32_t long_cb)
|
||||
{
|
||||
|
||||
uint32_t i, j;
|
||||
uint32_t res, prim, aux;
|
||||
uint32_t kp, k;
|
||||
uint16_t *per, *desper;
|
||||
uint8_t v;
|
||||
uint16_t p;
|
||||
uint16_t s[MAX_COLS], q[MAX_ROWS], r[MAX_ROWS], T[MAX_ROWS];
|
||||
uint16_t U[MAX_COLS * MAX_ROWS];
|
||||
uint32_t M_Rows, M_Cols, M_long;
|
||||
|
||||
M_long = long_cb;
|
||||
|
||||
if (long_cb > h->max_long_cb) {
|
||||
ERROR("Interleaver initiated for max_long_cb=%d\n", h->max_long_cb);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Find R*/
|
||||
if ((40 <= M_long) && (M_long <= 159))
|
||||
M_Rows = 5;
|
||||
else if (((160 <= M_long) && (M_long <= 200)) || ((481 <= M_long) && (M_long <= 530)))
|
||||
M_Rows = 10;
|
||||
else
|
||||
M_Rows = 20;
|
||||
|
||||
/* Find p i v*/
|
||||
if ((481 <= M_long) && (M_long <= 530)) {
|
||||
p = 53;
|
||||
v = 2;
|
||||
M_Cols = p;
|
||||
} else {
|
||||
i = 0;
|
||||
do {
|
||||
p = table_p[i];
|
||||
v = table_v[i];
|
||||
i++;
|
||||
} while (M_long > (M_Rows * (p + 1)));
|
||||
}
|
||||
|
||||
/* Find C*/
|
||||
if ((M_long) <= (M_Rows) * ((p)-1))
|
||||
M_Cols = (p)-1;
|
||||
else if (((M_Rows) * (p - 1) < M_long) && (M_long <= (M_Rows) * (p)))
|
||||
M_Cols = p;
|
||||
else if ((M_Rows) * (p) < M_long)
|
||||
M_Cols = (p) + 1;
|
||||
|
||||
q[0] = 1;
|
||||
prim = 6;
|
||||
|
||||
for (i = 1; i < M_Rows; i++) {
|
||||
do {
|
||||
prim++;
|
||||
res = mcd(prim, p - 1);
|
||||
} while (res != 1);
|
||||
q[i] = prim;
|
||||
}
|
||||
|
||||
s[0] = 1;
|
||||
for (i = 1; i < p - 1; i++) {
|
||||
s[i] = (v * s[i - 1]) % p;
|
||||
}
|
||||
|
||||
if (M_long <= 159 && M_long >= 40) {
|
||||
T[0] = 4;
|
||||
T[1] = 3;
|
||||
T[2] = 2;
|
||||
T[3] = 1;
|
||||
T[4] = 0;
|
||||
} else if ((M_long <= 200 && M_long >= 160) || (M_long <= 530 && M_long >= 481)) {
|
||||
T[0] = 9;
|
||||
T[1] = 8;
|
||||
T[2] = 7;
|
||||
T[3] = 6;
|
||||
T[4] = 5;
|
||||
T[5] = 4;
|
||||
T[6] = 3;
|
||||
T[7] = 2;
|
||||
T[8] = 1;
|
||||
T[9] = 0;
|
||||
} else if ((M_long <= 2480 && M_long >= 2281) || (M_long <= 3210 && M_long >= 3161)) {
|
||||
T[0] = 19;
|
||||
T[1] = 9;
|
||||
T[2] = 14;
|
||||
T[3] = 4;
|
||||
T[4] = 0;
|
||||
T[5] = 2;
|
||||
T[6] = 5;
|
||||
T[7] = 7;
|
||||
T[8] = 12;
|
||||
T[9] = 18;
|
||||
T[10] = 16;
|
||||
T[11] = 13;
|
||||
T[12] = 17;
|
||||
T[13] = 15;
|
||||
T[14] = 3;
|
||||
T[15] = 1;
|
||||
T[16] = 6;
|
||||
T[17] = 11;
|
||||
T[18] = 8;
|
||||
T[19] = 10;
|
||||
} else {
|
||||
T[0] = 19;
|
||||
T[1] = 9;
|
||||
T[2] = 14;
|
||||
T[3] = 4;
|
||||
T[4] = 0;
|
||||
T[5] = 2;
|
||||
T[6] = 5;
|
||||
T[7] = 7;
|
||||
T[8] = 12;
|
||||
T[9] = 18;
|
||||
T[10] = 10;
|
||||
T[11] = 8;
|
||||
T[12] = 13;
|
||||
T[13] = 17;
|
||||
T[14] = 3;
|
||||
T[15] = 1;
|
||||
T[16] = 16;
|
||||
T[17] = 6;
|
||||
T[18] = 15;
|
||||
T[19] = 11;
|
||||
}
|
||||
|
||||
for (i = 0; i < M_Rows; i++) {
|
||||
r[T[i]] = q[i];
|
||||
}
|
||||
|
||||
for (i = 0; i < M_Rows; i++) {
|
||||
for (j = 0; j < p - 1; j++) {
|
||||
U[i * M_Cols + j] = s[(j * r[i]) % (p - 1)];
|
||||
if (M_Cols == (p - 1))
|
||||
U[i * M_Cols + j] -= 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (M_Cols == p) {
|
||||
for (i = 0; i < M_Rows; i++)
|
||||
U[i * M_Cols + p - 1] = 0;
|
||||
} else if (M_Cols == p + 1) {
|
||||
for (i = 0; i < M_Rows; i++) {
|
||||
U[i * M_Cols + p - 1] = 0;
|
||||
U[i * M_Cols + p] = p;
|
||||
}
|
||||
if (M_long == M_Cols * M_Rows) {
|
||||
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 + 0] = aux;
|
||||
}
|
||||
}
|
||||
|
||||
per = h->forward;
|
||||
desper = h->reverse;
|
||||
|
||||
k = 0;
|
||||
for (j = 0; j < M_Cols; j++) {
|
||||
for (i = 0; i < M_Rows; i++) {
|
||||
kp = T[i] * M_Cols + U[i * M_Cols + j];
|
||||
if (kp < M_long) {
|
||||
desper[kp] = k;
|
||||
per[k] = kp;
|
||||
k++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t mcd(uint32_t x, uint32_t y)
|
||||
{
|
||||
uint32_t r = 1;
|
||||
|
||||
while (r) {
|
||||
r = x % y;
|
||||
x = y;
|
||||
y = r;
|
||||
}
|
||||
return x;
|
||||
}
|
||||
|
|
|
@ -17,410 +17,410 @@
|
|||
* the LICENSE file in the top-level directory of this distribution
|
||||
* and at http://www.gnu.org/licenses/.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "srslte/phy/fec/cbsegm.h"
|
||||
#include "srslte/phy/fec/turbocoder.h"
|
||||
#include "srslte/phy/utils/bit.h"
|
||||
#include "srslte/phy/utils/debug.h"
|
||||
#include "srslte/phy/utils/vector.h"
|
||||
|
||||
#define NOF_REGS 3
|
||||
|
||||
#define RATE 3
|
||||
#define TOTALTAIL 12
|
||||
|
||||
typedef struct {
|
||||
uint8_t next_state;
|
||||
uint8_t output;
|
||||
} tcod_lut_t;
|
||||
|
||||
static tcod_lut_t tcod_lut[8][256];
|
||||
static uint16_t tcod_per_fw[188][6144];
|
||||
static srslte_bit_interleaver_t tcod_interleavers[188];
|
||||
|
||||
static bool table_initiated = false;
|
||||
|
||||
int srslte_tcod_init(srslte_tcod_t* h, uint32_t max_long_cb)
|
||||
{
|
||||
|
||||
h->max_long_cb = max_long_cb;
|
||||
h->temp = srslte_vec_malloc(max_long_cb / 8);
|
||||
|
||||
if (!table_initiated) {
|
||||
table_initiated = true;
|
||||
srslte_tcod_gentable();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void srslte_tcod_free(srslte_tcod_t* h)
|
||||
{
|
||||
h->max_long_cb = 0;
|
||||
if (h->temp) {
|
||||
free(h->temp);
|
||||
}
|
||||
|
||||
if (table_initiated) {
|
||||
for (int i = 0; i < 188; i++) {
|
||||
srslte_bit_interleaver_free(&tcod_interleavers[i]);
|
||||
}
|
||||
table_initiated = false;
|
||||
}
|
||||
}
|
||||
|
||||
/* 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)
|
||||
{
|
||||
|
||||
uint8_t reg1_0, reg1_1, reg1_2, reg2_0, reg2_1, reg2_2;
|
||||
uint32_t i, k = 0, j;
|
||||
uint8_t bit;
|
||||
uint8_t in, out;
|
||||
uint16_t* per;
|
||||
|
||||
if (long_cb > h->max_long_cb) {
|
||||
ERROR("Turbo coder initiated for max_long_cb=%d\n", h->max_long_cb);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int longcb_idx = srslte_cbsegm_cbindex(long_cb);
|
||||
if (longcb_idx < 0) {
|
||||
ERROR("Invalid CB size %d\n", long_cb);
|
||||
return -1;
|
||||
}
|
||||
|
||||
per = tcod_per_fw[longcb_idx];
|
||||
|
||||
reg1_0 = 0;
|
||||
reg1_1 = 0;
|
||||
reg1_2 = 0;
|
||||
|
||||
reg2_0 = 0;
|
||||
reg2_1 = 0;
|
||||
reg2_2 = 0;
|
||||
|
||||
k = 0;
|
||||
for (i = 0; i < long_cb; i++) {
|
||||
if (input[i] == SRSLTE_TX_NULL) {
|
||||
bit = 0;
|
||||
} else {
|
||||
bit = input[i];
|
||||
}
|
||||
output[k] = input[i];
|
||||
|
||||
k++;
|
||||
|
||||
in = bit ^ (reg1_2 ^ reg1_1);
|
||||
out = reg1_2 ^ (reg1_0 ^ in);
|
||||
|
||||
reg1_2 = reg1_1;
|
||||
reg1_1 = reg1_0;
|
||||
reg1_0 = in;
|
||||
|
||||
if (input[i] == SRSLTE_TX_NULL) {
|
||||
output[k] = SRSLTE_TX_NULL;
|
||||
} else {
|
||||
output[k] = out;
|
||||
}
|
||||
k++;
|
||||
|
||||
bit = input[per[i]];
|
||||
if (bit == SRSLTE_TX_NULL) {
|
||||
bit = 0;
|
||||
}
|
||||
|
||||
in = bit ^ (reg2_2 ^ reg2_1);
|
||||
out = reg2_2 ^ (reg2_0 ^ in);
|
||||
|
||||
reg2_2 = reg2_1;
|
||||
reg2_1 = reg2_0;
|
||||
reg2_0 = in;
|
||||
|
||||
output[k] = out;
|
||||
k++;
|
||||
}
|
||||
|
||||
k = 3 * long_cb;
|
||||
|
||||
/* TAILING CODER #1 */
|
||||
for (j = 0; j < NOF_REGS; j++) {
|
||||
bit = reg1_2 ^ reg1_1;
|
||||
|
||||
output[k] = bit;
|
||||
k++;
|
||||
|
||||
in = bit ^ (reg1_2 ^ reg1_1);
|
||||
out = reg1_2 ^ (reg1_0 ^ in);
|
||||
|
||||
reg1_2 = reg1_1;
|
||||
reg1_1 = reg1_0;
|
||||
reg1_0 = in;
|
||||
|
||||
output[k] = out;
|
||||
k++;
|
||||
}
|
||||
|
||||
/* TAILING CODER #2 */
|
||||
for (j = 0; j < NOF_REGS; j++) {
|
||||
bit = reg2_2 ^ reg2_1;
|
||||
|
||||
output[k] = bit;
|
||||
k++;
|
||||
|
||||
in = bit ^ (reg2_2 ^ reg2_1);
|
||||
out = reg2_2 ^ (reg2_0 ^ in);
|
||||
|
||||
reg2_2 = reg2_1;
|
||||
reg2_1 = reg2_0;
|
||||
reg2_0 = in;
|
||||
|
||||
output[k] = out;
|
||||
k++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Expects bytes and produces bytes. The systematic and parity bits are interlaced in the output */
|
||||
int srslte_tcod_encode_lut(srslte_tcod_t* h,
|
||||
srslte_crc_t* crc_tb,
|
||||
srslte_crc_t* crc_cb,
|
||||
uint8_t* input,
|
||||
uint8_t* parity,
|
||||
uint32_t cblen_idx,
|
||||
bool last_cb)
|
||||
{
|
||||
if (cblen_idx < 188) {
|
||||
uint32_t long_cb = (uint32_t)srslte_cbsegm_cbsize(cblen_idx);
|
||||
|
||||
if (long_cb % 8) {
|
||||
ERROR("Turbo coder LUT implementation long_cb must be multiple of 8\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Reset CRC */
|
||||
if (crc_cb) {
|
||||
srslte_crc_set_init(crc_cb, 0);
|
||||
}
|
||||
|
||||
/* Parity bits for the 1st constituent encoders */
|
||||
uint8_t state0 = 0;
|
||||
if (crc_cb) {
|
||||
int block_size_nocrc = (long_cb - crc_cb->order - ((last_cb) ? crc_tb->order : 0)) / 8;
|
||||
|
||||
/* if CRC pointer is given */
|
||||
for (int i = 0; i < block_size_nocrc; i++) {
|
||||
uint8_t in = input[i];
|
||||
|
||||
/* Put byte in TB CRC and save latest checksum */
|
||||
srslte_crc_checksum_put_byte(crc_tb, in);
|
||||
|
||||
/* Put byte in CB CRC and save latest checksum */
|
||||
srslte_crc_checksum_put_byte(crc_cb, in);
|
||||
|
||||
/* Run actual encoder */
|
||||
tcod_lut_t l = tcod_lut[state0][in];
|
||||
parity[i] = l.output;
|
||||
state0 = l.next_state;
|
||||
}
|
||||
|
||||
if (last_cb) {
|
||||
uint32_t checksum = (uint32_t)srslte_crc_checksum_get(crc_tb);
|
||||
for (int i = 0; i < crc_tb->order / 8; i++) {
|
||||
int mask_shift = 8 * (crc_tb->order / 8 - i - 1);
|
||||
int idx = block_size_nocrc + i;
|
||||
uint8_t in = (uint8_t)((checksum >> mask_shift) & 0xff);
|
||||
|
||||
/* Put byte in CB CRC and save latest checksum */
|
||||
srslte_crc_checksum_put_byte(crc_cb, in);
|
||||
|
||||
input[idx] = in;
|
||||
tcod_lut_t l = tcod_lut[state0][in];
|
||||
parity[idx] = l.output;
|
||||
state0 = l.next_state;
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t checksum = (uint32_t)srslte_crc_checksum_get(crc_cb);
|
||||
for (int i = 0; i < crc_cb->order / 8; i++) {
|
||||
int mask_shift = 8 * (crc_cb->order / 8 - i - 1);
|
||||
int idx = (long_cb - crc_cb->order) / 8 + i;
|
||||
uint8_t in = (uint8_t)((checksum >> mask_shift) & 0xff);
|
||||
|
||||
input[idx] = in;
|
||||
tcod_lut_t l = tcod_lut[state0][in];
|
||||
parity[idx] = l.output;
|
||||
state0 = l.next_state;
|
||||
}
|
||||
|
||||
} else {
|
||||
/* No CRC given */
|
||||
int block_size_nocrc = (long_cb - ((last_cb) ? crc_tb->order : 0)) / 8;
|
||||
|
||||
for (uint32_t i = 0; i < block_size_nocrc; i++) {
|
||||
uint8_t in = input[i];
|
||||
|
||||
srslte_crc_checksum_put_byte(crc_tb, in);
|
||||
|
||||
tcod_lut_t l = tcod_lut[state0][in];
|
||||
parity[i] = l.output;
|
||||
state0 = l.next_state;
|
||||
}
|
||||
|
||||
if (last_cb) {
|
||||
uint32_t checksum = (uint32_t)srslte_crc_checksum_get(crc_tb);
|
||||
for (int i = 0; i < crc_tb->order / 8; i++) {
|
||||
int mask_shift = 8 * (crc_tb->order / 8 - i - 1);
|
||||
int idx = block_size_nocrc + i;
|
||||
uint8_t in = (uint8_t)((checksum >> mask_shift) & 0xff);
|
||||
|
||||
input[idx] = in;
|
||||
tcod_lut_t l = tcod_lut[state0][in];
|
||||
parity[idx] = l.output;
|
||||
state0 = l.next_state;
|
||||
}
|
||||
}
|
||||
}
|
||||
parity[long_cb / 8] = 0; // will put tail here later
|
||||
|
||||
/* Interleave input */
|
||||
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);
|
||||
|
||||
/* Parity bits for the 2nd constituent encoders */
|
||||
uint8_t state1 = 0;
|
||||
for (uint32_t i = 0; i < long_cb / 8; i++) {
|
||||
tcod_lut_t l = tcod_lut[state1][h->temp[i]];
|
||||
uint8_t out = l.output;
|
||||
parity[long_cb / 8 + i] |= (out & 0xf0) >> 4;
|
||||
parity[long_cb / 8 + i + 1] = (out & 0xf) << 4;
|
||||
state1 = l.next_state;
|
||||
}
|
||||
|
||||
/* Tail bits */
|
||||
uint8_t reg1_0, reg1_1, reg1_2, reg2_0, reg2_1, reg2_2;
|
||||
uint8_t bit, in, out;
|
||||
uint8_t k = 0;
|
||||
uint8_t tail[12];
|
||||
|
||||
reg2_0 = (state1 & 4) >> 2;
|
||||
reg2_1 = (state1 & 2) >> 1;
|
||||
reg2_2 = state1 & 1;
|
||||
|
||||
reg1_0 = (state0 & 4) >> 2;
|
||||
reg1_1 = (state0 & 2) >> 1;
|
||||
reg1_2 = state0 & 1;
|
||||
|
||||
/* TAILING CODER #1 */
|
||||
for (uint32_t j = 0; j < NOF_REGS; j++) {
|
||||
bit = reg1_2 ^ reg1_1;
|
||||
|
||||
tail[k] = bit;
|
||||
k++;
|
||||
|
||||
in = bit ^ (reg1_2 ^ reg1_1);
|
||||
out = reg1_2 ^ (reg1_0 ^ in);
|
||||
|
||||
reg1_2 = reg1_1;
|
||||
reg1_1 = reg1_0;
|
||||
reg1_0 = in;
|
||||
|
||||
tail[k] = out;
|
||||
k++;
|
||||
}
|
||||
|
||||
/* TAILING CODER #2 */
|
||||
for (uint32_t j = 0; j < NOF_REGS; j++) {
|
||||
bit = reg2_2 ^ reg2_1;
|
||||
|
||||
tail[k] = bit;
|
||||
k++;
|
||||
|
||||
in = bit ^ (reg2_2 ^ reg2_1);
|
||||
out = reg2_2 ^ (reg2_0 ^ in);
|
||||
|
||||
reg2_2 = reg2_1;
|
||||
reg2_1 = reg2_0;
|
||||
reg2_0 = in;
|
||||
|
||||
tail[k] = out;
|
||||
k++;
|
||||
}
|
||||
|
||||
uint8_t tailv[3][4];
|
||||
for (int i = 0; i < 4; i++) {
|
||||
for (int j = 0; j < 3; j++) {
|
||||
tailv[j][i] = tail[3 * i + j];
|
||||
}
|
||||
}
|
||||
uint8_t* x = tailv[0];
|
||||
input[long_cb / 8] = (srslte_bit_pack(&x, 4) << 4);
|
||||
x = tailv[1];
|
||||
parity[long_cb / 8] |= (srslte_bit_pack(&x, 4) << 4);
|
||||
x = tailv[2];
|
||||
parity[2 * long_cb / 8] |= (srslte_bit_pack(&x, 4) & 0xf);
|
||||
|
||||
return 3 * long_cb + TOTALTAIL;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
void srslte_tcod_gentable()
|
||||
{
|
||||
srslte_tc_interl_t interl;
|
||||
|
||||
if (srslte_tc_interl_init(&interl, 6144)) {
|
||||
ERROR("Error initiating interleave\n");
|
||||
return;
|
||||
}
|
||||
|
||||
for (uint32_t len = 0; len < 188; len++) {
|
||||
uint32_t long_cb = srslte_cbsegm_cbsize(len);
|
||||
if (srslte_tc_interl_LTE_gen(&interl, long_cb)) {
|
||||
ERROR("Error initiating TC interleaver for long_cb=%d\n", long_cb);
|
||||
return;
|
||||
}
|
||||
// Save fw/bw permutation tables
|
||||
for (uint32_t i = 0; i < long_cb; i++) {
|
||||
tcod_per_fw[len][i] = interl.forward[i];
|
||||
}
|
||||
srslte_bit_interleaver_init(&tcod_interleavers[len], tcod_per_fw[len], long_cb);
|
||||
for (uint32_t i = long_cb; i < 6144; i++) {
|
||||
tcod_per_fw[len][i] = 0;
|
||||
}
|
||||
}
|
||||
// Compute state transitions
|
||||
for (uint32_t state = 0; state < 8; state++) {
|
||||
for (uint32_t data = 0; data < 256; data++) {
|
||||
|
||||
uint8_t reg_0, reg_1, reg_2;
|
||||
reg_0 = (state & 4) >> 2;
|
||||
reg_1 = (state & 2) >> 1;
|
||||
reg_2 = state & 1;
|
||||
|
||||
tcod_lut[state][data].output = 0;
|
||||
uint8_t bit, in, out;
|
||||
for (uint32_t i = 0; i < 8; i++) {
|
||||
bit = (data & (1 << (7 - i))) ? 1 : 0;
|
||||
|
||||
in = bit ^ (reg_2 ^ reg_1);
|
||||
out = reg_2 ^ (reg_0 ^ in);
|
||||
|
||||
reg_2 = reg_1;
|
||||
reg_1 = reg_0;
|
||||
reg_0 = in;
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
srslte_tc_interl_free(&interl);
|
||||
}
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "srslte/phy/fec/turbo/cbsegm.h"
|
||||
#include "srslte/phy/fec/turbo/turbocoder.h"
|
||||
#include "srslte/phy/utils/bit.h"
|
||||
#include "srslte/phy/utils/debug.h"
|
||||
#include "srslte/phy/utils/vector.h"
|
||||
|
||||
#define NOF_REGS 3
|
||||
|
||||
#define RATE 3
|
||||
#define TOTALTAIL 12
|
||||
|
||||
typedef struct {
|
||||
uint8_t next_state;
|
||||
uint8_t output;
|
||||
} tcod_lut_t;
|
||||
|
||||
static tcod_lut_t tcod_lut[8][256];
|
||||
static uint16_t tcod_per_fw[188][6144];
|
||||
static srslte_bit_interleaver_t tcod_interleavers[188];
|
||||
|
||||
static bool table_initiated = false;
|
||||
|
||||
int srslte_tcod_init(srslte_tcod_t* h, uint32_t max_long_cb)
|
||||
{
|
||||
|
||||
h->max_long_cb = max_long_cb;
|
||||
h->temp = srslte_vec_malloc(max_long_cb / 8);
|
||||
|
||||
if (!table_initiated) {
|
||||
table_initiated = true;
|
||||
srslte_tcod_gentable();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void srslte_tcod_free(srslte_tcod_t* h)
|
||||
{
|
||||
h->max_long_cb = 0;
|
||||
if (h->temp) {
|
||||
free(h->temp);
|
||||
}
|
||||
|
||||
if (table_initiated) {
|
||||
for (int i = 0; i < 188; i++) {
|
||||
srslte_bit_interleaver_free(&tcod_interleavers[i]);
|
||||
}
|
||||
table_initiated = false;
|
||||
}
|
||||
}
|
||||
|
||||
/* 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)
|
||||
{
|
||||
|
||||
uint8_t reg1_0, reg1_1, reg1_2, reg2_0, reg2_1, reg2_2;
|
||||
uint32_t i, k = 0, j;
|
||||
uint8_t bit;
|
||||
uint8_t in, out;
|
||||
uint16_t* per;
|
||||
|
||||
if (long_cb > h->max_long_cb) {
|
||||
ERROR("Turbo coder initiated for max_long_cb=%d\n", h->max_long_cb);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int longcb_idx = srslte_cbsegm_cbindex(long_cb);
|
||||
if (longcb_idx < 0) {
|
||||
ERROR("Invalid CB size %d\n", long_cb);
|
||||
return -1;
|
||||
}
|
||||
|
||||
per = tcod_per_fw[longcb_idx];
|
||||
|
||||
reg1_0 = 0;
|
||||
reg1_1 = 0;
|
||||
reg1_2 = 0;
|
||||
|
||||
reg2_0 = 0;
|
||||
reg2_1 = 0;
|
||||
reg2_2 = 0;
|
||||
|
||||
k = 0;
|
||||
for (i = 0; i < long_cb; i++) {
|
||||
if (input[i] == SRSLTE_TX_NULL) {
|
||||
bit = 0;
|
||||
} else {
|
||||
bit = input[i];
|
||||
}
|
||||
output[k] = input[i];
|
||||
|
||||
k++;
|
||||
|
||||
in = bit ^ (reg1_2 ^ reg1_1);
|
||||
out = reg1_2 ^ (reg1_0 ^ in);
|
||||
|
||||
reg1_2 = reg1_1;
|
||||
reg1_1 = reg1_0;
|
||||
reg1_0 = in;
|
||||
|
||||
if (input[i] == SRSLTE_TX_NULL) {
|
||||
output[k] = SRSLTE_TX_NULL;
|
||||
} else {
|
||||
output[k] = out;
|
||||
}
|
||||
k++;
|
||||
|
||||
bit = input[per[i]];
|
||||
if (bit == SRSLTE_TX_NULL) {
|
||||
bit = 0;
|
||||
}
|
||||
|
||||
in = bit ^ (reg2_2 ^ reg2_1);
|
||||
out = reg2_2 ^ (reg2_0 ^ in);
|
||||
|
||||
reg2_2 = reg2_1;
|
||||
reg2_1 = reg2_0;
|
||||
reg2_0 = in;
|
||||
|
||||
output[k] = out;
|
||||
k++;
|
||||
}
|
||||
|
||||
k = 3 * long_cb;
|
||||
|
||||
/* TAILING CODER #1 */
|
||||
for (j = 0; j < NOF_REGS; j++) {
|
||||
bit = reg1_2 ^ reg1_1;
|
||||
|
||||
output[k] = bit;
|
||||
k++;
|
||||
|
||||
in = bit ^ (reg1_2 ^ reg1_1);
|
||||
out = reg1_2 ^ (reg1_0 ^ in);
|
||||
|
||||
reg1_2 = reg1_1;
|
||||
reg1_1 = reg1_0;
|
||||
reg1_0 = in;
|
||||
|
||||
output[k] = out;
|
||||
k++;
|
||||
}
|
||||
|
||||
/* TAILING CODER #2 */
|
||||
for (j = 0; j < NOF_REGS; j++) {
|
||||
bit = reg2_2 ^ reg2_1;
|
||||
|
||||
output[k] = bit;
|
||||
k++;
|
||||
|
||||
in = bit ^ (reg2_2 ^ reg2_1);
|
||||
out = reg2_2 ^ (reg2_0 ^ in);
|
||||
|
||||
reg2_2 = reg2_1;
|
||||
reg2_1 = reg2_0;
|
||||
reg2_0 = in;
|
||||
|
||||
output[k] = out;
|
||||
k++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Expects bytes and produces bytes. The systematic and parity bits are interlaced in the output */
|
||||
int srslte_tcod_encode_lut(srslte_tcod_t* h,
|
||||
srslte_crc_t* crc_tb,
|
||||
srslte_crc_t* crc_cb,
|
||||
uint8_t* input,
|
||||
uint8_t* parity,
|
||||
uint32_t cblen_idx,
|
||||
bool last_cb)
|
||||
{
|
||||
if (cblen_idx < 188) {
|
||||
uint32_t long_cb = (uint32_t)srslte_cbsegm_cbsize(cblen_idx);
|
||||
|
||||
if (long_cb % 8) {
|
||||
ERROR("Turbo coder LUT implementation long_cb must be multiple of 8\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Reset CRC */
|
||||
if (crc_cb) {
|
||||
srslte_crc_set_init(crc_cb, 0);
|
||||
}
|
||||
|
||||
/* Parity bits for the 1st constituent encoders */
|
||||
uint8_t state0 = 0;
|
||||
if (crc_cb) {
|
||||
int block_size_nocrc = (long_cb - crc_cb->order - ((last_cb) ? crc_tb->order : 0)) / 8;
|
||||
|
||||
/* if CRC pointer is given */
|
||||
for (int i = 0; i < block_size_nocrc; i++) {
|
||||
uint8_t in = input[i];
|
||||
|
||||
/* Put byte in TB CRC and save latest checksum */
|
||||
srslte_crc_checksum_put_byte(crc_tb, in);
|
||||
|
||||
/* Put byte in CB CRC and save latest checksum */
|
||||
srslte_crc_checksum_put_byte(crc_cb, in);
|
||||
|
||||
/* Run actual encoder */
|
||||
tcod_lut_t l = tcod_lut[state0][in];
|
||||
parity[i] = l.output;
|
||||
state0 = l.next_state;
|
||||
}
|
||||
|
||||
if (last_cb) {
|
||||
uint32_t checksum = (uint32_t)srslte_crc_checksum_get(crc_tb);
|
||||
for (int i = 0; i < crc_tb->order / 8; i++) {
|
||||
int mask_shift = 8 * (crc_tb->order / 8 - i - 1);
|
||||
int idx = block_size_nocrc + i;
|
||||
uint8_t in = (uint8_t)((checksum >> mask_shift) & 0xff);
|
||||
|
||||
/* Put byte in CB CRC and save latest checksum */
|
||||
srslte_crc_checksum_put_byte(crc_cb, in);
|
||||
|
||||
input[idx] = in;
|
||||
tcod_lut_t l = tcod_lut[state0][in];
|
||||
parity[idx] = l.output;
|
||||
state0 = l.next_state;
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t checksum = (uint32_t)srslte_crc_checksum_get(crc_cb);
|
||||
for (int i = 0; i < crc_cb->order / 8; i++) {
|
||||
int mask_shift = 8 * (crc_cb->order / 8 - i - 1);
|
||||
int idx = (long_cb - crc_cb->order) / 8 + i;
|
||||
uint8_t in = (uint8_t)((checksum >> mask_shift) & 0xff);
|
||||
|
||||
input[idx] = in;
|
||||
tcod_lut_t l = tcod_lut[state0][in];
|
||||
parity[idx] = l.output;
|
||||
state0 = l.next_state;
|
||||
}
|
||||
|
||||
} else {
|
||||
/* No CRC given */
|
||||
int block_size_nocrc = (long_cb - ((last_cb) ? crc_tb->order : 0)) / 8;
|
||||
|
||||
for (uint32_t i = 0; i < block_size_nocrc; i++) {
|
||||
uint8_t in = input[i];
|
||||
|
||||
srslte_crc_checksum_put_byte(crc_tb, in);
|
||||
|
||||
tcod_lut_t l = tcod_lut[state0][in];
|
||||
parity[i] = l.output;
|
||||
state0 = l.next_state;
|
||||
}
|
||||
|
||||
if (last_cb) {
|
||||
uint32_t checksum = (uint32_t)srslte_crc_checksum_get(crc_tb);
|
||||
for (int i = 0; i < crc_tb->order / 8; i++) {
|
||||
int mask_shift = 8 * (crc_tb->order / 8 - i - 1);
|
||||
int idx = block_size_nocrc + i;
|
||||
uint8_t in = (uint8_t)((checksum >> mask_shift) & 0xff);
|
||||
|
||||
input[idx] = in;
|
||||
tcod_lut_t l = tcod_lut[state0][in];
|
||||
parity[idx] = l.output;
|
||||
state0 = l.next_state;
|
||||
}
|
||||
}
|
||||
}
|
||||
parity[long_cb / 8] = 0; // will put tail here later
|
||||
|
||||
/* Interleave input */
|
||||
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);
|
||||
|
||||
/* Parity bits for the 2nd constituent encoders */
|
||||
uint8_t state1 = 0;
|
||||
for (uint32_t i = 0; i < long_cb / 8; i++) {
|
||||
tcod_lut_t l = tcod_lut[state1][h->temp[i]];
|
||||
uint8_t out = l.output;
|
||||
parity[long_cb / 8 + i] |= (out & 0xf0) >> 4;
|
||||
parity[long_cb / 8 + i + 1] = (out & 0xf) << 4;
|
||||
state1 = l.next_state;
|
||||
}
|
||||
|
||||
/* Tail bits */
|
||||
uint8_t reg1_0, reg1_1, reg1_2, reg2_0, reg2_1, reg2_2;
|
||||
uint8_t bit, in, out;
|
||||
uint8_t k = 0;
|
||||
uint8_t tail[12];
|
||||
|
||||
reg2_0 = (state1 & 4) >> 2;
|
||||
reg2_1 = (state1 & 2) >> 1;
|
||||
reg2_2 = state1 & 1;
|
||||
|
||||
reg1_0 = (state0 & 4) >> 2;
|
||||
reg1_1 = (state0 & 2) >> 1;
|
||||
reg1_2 = state0 & 1;
|
||||
|
||||
/* TAILING CODER #1 */
|
||||
for (uint32_t j = 0; j < NOF_REGS; j++) {
|
||||
bit = reg1_2 ^ reg1_1;
|
||||
|
||||
tail[k] = bit;
|
||||
k++;
|
||||
|
||||
in = bit ^ (reg1_2 ^ reg1_1);
|
||||
out = reg1_2 ^ (reg1_0 ^ in);
|
||||
|
||||
reg1_2 = reg1_1;
|
||||
reg1_1 = reg1_0;
|
||||
reg1_0 = in;
|
||||
|
||||
tail[k] = out;
|
||||
k++;
|
||||
}
|
||||
|
||||
/* TAILING CODER #2 */
|
||||
for (uint32_t j = 0; j < NOF_REGS; j++) {
|
||||
bit = reg2_2 ^ reg2_1;
|
||||
|
||||
tail[k] = bit;
|
||||
k++;
|
||||
|
||||
in = bit ^ (reg2_2 ^ reg2_1);
|
||||
out = reg2_2 ^ (reg2_0 ^ in);
|
||||
|
||||
reg2_2 = reg2_1;
|
||||
reg2_1 = reg2_0;
|
||||
reg2_0 = in;
|
||||
|
||||
tail[k] = out;
|
||||
k++;
|
||||
}
|
||||
|
||||
uint8_t tailv[3][4];
|
||||
for (int i = 0; i < 4; i++) {
|
||||
for (int j = 0; j < 3; j++) {
|
||||
tailv[j][i] = tail[3 * i + j];
|
||||
}
|
||||
}
|
||||
uint8_t* x = tailv[0];
|
||||
input[long_cb / 8] = (srslte_bit_pack(&x, 4) << 4);
|
||||
x = tailv[1];
|
||||
parity[long_cb / 8] |= (srslte_bit_pack(&x, 4) << 4);
|
||||
x = tailv[2];
|
||||
parity[2 * long_cb / 8] |= (srslte_bit_pack(&x, 4) & 0xf);
|
||||
|
||||
return 3 * long_cb + TOTALTAIL;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
void srslte_tcod_gentable()
|
||||
{
|
||||
srslte_tc_interl_t interl;
|
||||
|
||||
if (srslte_tc_interl_init(&interl, 6144)) {
|
||||
ERROR("Error initiating interleave\n");
|
||||
return;
|
||||
}
|
||||
|
||||
for (uint32_t len = 0; len < 188; len++) {
|
||||
uint32_t long_cb = srslte_cbsegm_cbsize(len);
|
||||
if (srslte_tc_interl_LTE_gen(&interl, long_cb)) {
|
||||
ERROR("Error initiating TC interleaver for long_cb=%d\n", long_cb);
|
||||
return;
|
||||
}
|
||||
// Save fw/bw permutation tables
|
||||
for (uint32_t i = 0; i < long_cb; i++) {
|
||||
tcod_per_fw[len][i] = interl.forward[i];
|
||||
}
|
||||
srslte_bit_interleaver_init(&tcod_interleavers[len], tcod_per_fw[len], long_cb);
|
||||
for (uint32_t i = long_cb; i < 6144; i++) {
|
||||
tcod_per_fw[len][i] = 0;
|
||||
}
|
||||
}
|
||||
// Compute state transitions
|
||||
for (uint32_t state = 0; state < 8; state++) {
|
||||
for (uint32_t data = 0; data < 256; data++) {
|
||||
|
||||
uint8_t reg_0, reg_1, reg_2;
|
||||
reg_0 = (state & 4) >> 2;
|
||||
reg_1 = (state & 2) >> 1;
|
||||
reg_2 = state & 1;
|
||||
|
||||
tcod_lut[state][data].output = 0;
|
||||
uint8_t bit, in, out;
|
||||
for (uint32_t i = 0; i < 8; i++) {
|
||||
bit = (data & (1 << (7 - i))) ? 1 : 0;
|
||||
|
||||
in = bit ^ (reg_2 ^ reg_1);
|
||||
out = reg_2 ^ (reg_0 ^ in);
|
||||
|
||||
reg_2 = reg_1;
|
||||
reg_1 = reg_0;
|
||||
reg_0 = in;
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
srslte_tc_interl_free(&interl);
|
||||
}
|
||||
|
|
|
@ -24,14 +24,14 @@
|
|||
#include <stdlib.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/srslte.h"
|
||||
|
||||
#define debug_enabled 0
|
||||
|
||||
/* 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,
|
||||
tdec_gen_free,
|
||||
tdec_gen_dec,
|
||||
|
@ -40,7 +40,7 @@ srslte_tdec_16bit_impl_t gen_impl = {tdec_gen_init,
|
|||
|
||||
/* SSE no-window implementation */
|
||||
#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,
|
||||
tdec_sse_free,
|
||||
tdec_sse_dec,
|
||||
|
@ -50,7 +50,7 @@ srslte_tdec_16bit_impl_t sse_impl = {tdec_sse_init,
|
|||
/* SSE window implementation */
|
||||
|
||||
#define WINIMP_IS_SSE16
|
||||
#include "srslte/phy/fec/turbodecoder_win.h"
|
||||
#include "srslte/phy/fec/turbo/turbodecoder_win.h"
|
||||
#undef WINIMP_IS_SSE16
|
||||
|
||||
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 */
|
||||
#ifdef LV_HAVE_AVX2
|
||||
#define WINIMP_IS_AVX16
|
||||
#include "srslte/phy/fec/turbodecoder_win.h"
|
||||
#include "srslte/phy/fec/turbo/turbodecoder_win.h"
|
||||
#undef WINIMP_IS_AVX16
|
||||
srslte_tdec_16bit_impl_t avx16_win_impl = {tdec_winavx16_init,
|
||||
tdec_winavx16_free,
|
||||
|
@ -75,7 +75,7 @@ srslte_tdec_16bit_impl_t avx16_win_impl = {tdec_winavx16_init,
|
|||
/* SSE window implementation */
|
||||
#ifdef LV_HAVE_SSE
|
||||
#define WINIMP_IS_SSE8
|
||||
#include "srslte/phy/fec/turbodecoder_win.h"
|
||||
#include "srslte/phy/fec/turbo/turbodecoder_win.h"
|
||||
#undef WINIMP_IS_SSE8
|
||||
|
||||
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 */
|
||||
#ifdef LV_HAVE_AVX2
|
||||
#define WINIMP_IS_AVX8
|
||||
#include "srslte/phy/fec/turbodecoder_win.h"
|
||||
#include "srslte/phy/fec/turbo/turbodecoder_win.h"
|
||||
#undef WINIMP_IS_AVX8
|
||||
srslte_tdec_8bit_impl_t avx8_win_impl = {tdec_winavx8_init,
|
||||
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
|
||||
#define LLR_IS_8BIT
|
||||
#include "srslte/phy/fec/turbodecoder_iter.h"
|
||||
#include "srslte/phy/fec/turbo/turbodecoder_iter.h"
|
||||
#undef LLR_IS_8BIT
|
||||
|
||||
#define LLR_IS_16BIT
|
||||
#include "srslte/phy/fec/turbodecoder_iter.h"
|
||||
#include "srslte/phy/fec/turbo/turbodecoder_iter.h"
|
||||
#undef LLR_IS_16BIT
|
||||
|
||||
int srslte_tdec_init(srslte_tdec_t* h, uint32_t max_long_cb)
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
#include <string.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"
|
||||
|
||||
#define NUMSTATES 8
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
#include <string.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 <inttypes.h>
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
|
||||
#include "prb_dl.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/utils/bit.h"
|
||||
#include "srslte/phy/utils/debug.h"
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
*/
|
||||
|
||||
#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/phch/sch.h"
|
||||
#include "srslte/phy/utils/bit.h"
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
#include <stdlib.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/mod.h"
|
||||
#include "srslte/phy/phch/pscch.h"
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
|
||||
#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/phch/pssch.h"
|
||||
#include "srslte/phy/phch/ra.h"
|
||||
|
|
|
@ -29,10 +29,10 @@
|
|||
#include <strings.h>
|
||||
|
||||
#include "srslte/phy/common/phy_common.h"
|
||||
#include "srslte/phy/fec/cbsegm.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/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/utils/bit.h"
|
||||
#include "srslte/phy/utils/debug.h"
|
||||
|
|
Loading…
Reference in New Issue