mirror of https://github.com/pvnis/srsRAN_4G.git
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
4.1 KiB
C
105 lines
4.1 KiB
C
/**
|
|
*
|
|
* \section COPYRIGHT
|
|
*
|
|
* Copyright 2013-2021 Software Radio Systems Limited
|
|
*
|
|
* By using this file, you agree to the terms and conditions set
|
|
* forth in the LICENSE file which can be found at the top level of
|
|
* the distribution.
|
|
*
|
|
*/
|
|
|
|
/*!
|
|
* \file base_graph.h
|
|
* \brief Declaration of the two LDPC base graphs employed in the 5G NR
|
|
* standard.
|
|
* \author David Gregoratti
|
|
* \date 2020
|
|
*
|
|
* This file declares the dimensions of the base graphs and provides an interface
|
|
* for obtaining the set index and the permutation matrix corresponding to a
|
|
* given *lifting size*.
|
|
*
|
|
* \copyright Software Radio Systems Limited
|
|
*
|
|
*/
|
|
|
|
#ifndef SRSRAN_BASEGRAPH_H
|
|
#define SRSRAN_BASEGRAPH_H
|
|
|
|
#include "srsran/config.h"
|
|
|
|
#include <stdint.h>
|
|
|
|
#define SRSRAN_LDPC_BG1_MAX_LEN_CB 8448 /*!< \brief Maximum code block size for LDPC BG1 */
|
|
#define SRSRAN_LDPC_BG2_MAX_LEN_CB 3840 /*!< \brief Maximum code block size for LDPC BG2 */
|
|
#define SRSRAN_LDPC_MAX_LEN_CB SRSRAN_LDPC_BG1_MAX_LEN_CB /*!< \brief Maximum code block size for LDPC BG1 or BG2 */
|
|
|
|
#define BG1Nfull 68 /*!< \brief Number of variable nodes in BG1. */
|
|
#define BG1N 66 /*!< \brief Number of variable nodes in BG1 after puncturing. */
|
|
#define BG1M 46 /*!< \brief Number of check nodes in BG1. */
|
|
#define BG1K 22 /*!< \brief Number of "uncoded bits" in BG1. */
|
|
|
|
#define BG2Nfull 52 /*!< \brief Number of variable nodes in BG2. */
|
|
#define BG2N 50 /*!< \brief Number of variable nodes in BG2 after puncturing. */
|
|
#define BG2M 42 /*!< \brief Number of check nodes in BG2. */
|
|
#define BG2K 10 /*!< \brief Number of "uncoded bits" in BG2. */
|
|
|
|
#define MAX_CNCT 20 /*!< \brief Maximum number (+1) of connected variables per check node. */
|
|
|
|
#define NOF_LIFTSIZE 8 /*!< \brief Number of possible lifting size indices. */
|
|
|
|
#define MAX_LIFTSIZE 384 /*!< \brief Maximum lifting size. */
|
|
|
|
#define SRSRAN_LDPC_MAX_LEN_ENCODED_CB (MAX_LIFTSIZE * SRSRAN_MAX(BG1N, BG2N))
|
|
|
|
#define VOID_LIFTSIZE 255 /*!< \brief Identifies an invalid lifting size in the lookup table. */
|
|
/*!
|
|
* \brief Identifies a missing connection between a check node and a variable node
|
|
* in the protograph. */
|
|
#define NO_CNCT 0xFFFF
|
|
|
|
/*! \brief Possible base graphs, BG1 or BG2. */
|
|
typedef enum SRSRAN_API {
|
|
BG1 = 0, /*!< \brief Base Graph 1 */
|
|
BG2, /*!< \brief Base Graph 2 */
|
|
} srsran_basegraph_t;
|
|
|
|
/*!
|
|
* Creates the parity-check matrix for the given base graph and lifting size
|
|
* in the compact form (a normalized permutation matrix). Also returns the
|
|
* indices of the variable nodes associated to each check node.
|
|
* \param[out] pcm The compact parity-check matrix: entry \f$(m,n)\f$ is an
|
|
* integer between 0 and LS-1 if check-node \f$m\f$ is
|
|
* connected to variable node \f$n\f$ in the protograph.
|
|
* This number specifies the order of the circular
|
|
* rotation applied to the identity matrix in the full
|
|
* graph (see also Section 3.4.1 of Deliverable 1). This
|
|
* pointer can be safely cast to 'uint16_t(*)[BGbgNfull]'
|
|
* (see also ::BG1Nfull and ::BG2Nfull) to get an BGbgM x
|
|
* BGbgNfull matrix.
|
|
* \param[out] positions For each check node, the corresponding row of this
|
|
* matrix contains the indices of the connected variable
|
|
* nodes (see also ::BG1_positions and ::BG2_positions).
|
|
* \param[in] bg The desired base graph (BG1 or BG2).
|
|
* \param[in] ls The desired lifting size.
|
|
* \return An integer: 0 if the function executes correctly, -1 otherwise.
|
|
*/
|
|
SRSRAN_API int create_compact_pcm(uint16_t* pcm, int8_t (*positions)[MAX_CNCT], srsran_basegraph_t bg, uint16_t ls);
|
|
|
|
/*!
|
|
* Reads the lookup table and returns the set index corresponding to the given
|
|
* lifting size.
|
|
* \param[in] ls A lifting size.
|
|
* \return An integer between 0 and 7 (included), ::VOID_LIFTSIZE if ls is an
|
|
* invalid lifting size
|
|
*/
|
|
static inline uint8_t get_ls_index(uint16_t ls)
|
|
{
|
|
extern const uint8_t LSindex[];
|
|
return (ls <= MAX_LIFTSIZE ? LSindex[ls] : VOID_LIFTSIZE);
|
|
}
|
|
|
|
#endif // SRSRAN_BASEGRAPH_H
|