mirror of https://github.com/PentHertz/srsLTE.git
Fix memory issues in PSCCH decoder
This commit is contained in:
parent
eed6240a4b
commit
a0fb150e58
|
@ -44,10 +44,10 @@ typedef enum SRSLTE_API {
|
||||||
} srslte_sl_tm_t;
|
} srslte_sl_tm_t;
|
||||||
|
|
||||||
typedef enum SRSLTE_API {
|
typedef enum SRSLTE_API {
|
||||||
SRSLTE_SIDELINK_PSBCH = 0,
|
SRSLTE_SIDELINK_PSBCH = 0, // Physical Sidelink Broadcast Channel
|
||||||
SRSLTE_SIDELINK_PSCCH,
|
SRSLTE_SIDELINK_PSCCH, // Physical Sidelink Control Channel
|
||||||
SRSLTE_SIDELINK_PSSCH,
|
SRSLTE_SIDELINK_PSSCH, // Physical Sidelink Shared Channel
|
||||||
SRSLTE_SIDELINK_PSDCH
|
SRSLTE_SIDELINK_PSDCH // Physical Sidelink Discovery Channel
|
||||||
} srslte_sl_channels_t;
|
} srslte_sl_channels_t;
|
||||||
|
|
||||||
typedef struct SRSLTE_API {
|
typedef struct SRSLTE_API {
|
||||||
|
@ -109,8 +109,6 @@ typedef enum SRSLTE_API {
|
||||||
#define SRSLTE_PSCCH_MAX_NOF_PRB (SRSLTE_PSCCH_TM34_NOF_PRB)
|
#define SRSLTE_PSCCH_MAX_NOF_PRB (SRSLTE_PSCCH_TM34_NOF_PRB)
|
||||||
#define SRSLTE_PSCCH_SCRAMBLING_SEED (510) ///< Scrambling seed for PSCCH is 510
|
#define SRSLTE_PSCCH_SCRAMBLING_SEED (510) ///< Scrambling seed for PSCCH is 510
|
||||||
|
|
||||||
#define SRSLTE_PSCCH_MAX_CODED_BITS (3 * (SRSLTE_SCI_MAX_LEN + SRSLTE_SCI_CRC_LEN))
|
|
||||||
|
|
||||||
#define SRSLTE_PSCCH_TM12_NUM_DATA_SYMBOLS (12)
|
#define SRSLTE_PSCCH_TM12_NUM_DATA_SYMBOLS (12)
|
||||||
#define SRSLTE_PSCCH_TM12_NUM_DMRS_SYMBOLS (2)
|
#define SRSLTE_PSCCH_TM12_NUM_DMRS_SYMBOLS (2)
|
||||||
#define SRSLTE_PSCCH_TM12_NUM_DATA_SYMBOLS_EXT (10)
|
#define SRSLTE_PSCCH_TM12_NUM_DATA_SYMBOLS_EXT (10)
|
||||||
|
@ -118,6 +116,12 @@ typedef enum SRSLTE_API {
|
||||||
#define SRSLTE_PSCCH_TM34_NUM_DATA_SYMBOLS (10)
|
#define SRSLTE_PSCCH_TM34_NUM_DATA_SYMBOLS (10)
|
||||||
#define SRSLTE_PSCCH_TM34_NUM_DMRS_SYMBOLS (4)
|
#define SRSLTE_PSCCH_TM34_NUM_DMRS_SYMBOLS (4)
|
||||||
|
|
||||||
|
#define SRSLTE_PSCCH_TM12_NOF_CODED_BITS \
|
||||||
|
(SRSLTE_NRE * SRSLTE_PSCCH_TM12_NUM_DATA_SYMBOLS * SRSLTE_PSCCH_TM12_NOF_PRB * SRSLTE_PSCCH_QM)
|
||||||
|
#define SRSLTE_PSCCH_TM34_NOF_CODED_BITS \
|
||||||
|
(SRSLTE_NRE * SRSLTE_PSCCH_TM34_NUM_DATA_SYMBOLS * SRSLTE_PSCCH_TM34_NOF_PRB * SRSLTE_PSCCH_QM)
|
||||||
|
#define SRSLTE_PSCCH_MAX_CODED_BITS SRSLTE_MAX(SRSLTE_PSCCH_TM12_NOF_CODED_BITS, SRSLTE_PSCCH_TM34_NOF_CODED_BITS)
|
||||||
|
|
||||||
#define SRSLTE_PSSCH_CRC_LEN 24
|
#define SRSLTE_PSSCH_CRC_LEN 24
|
||||||
#define SRSLTE_MAX_CODEWORD_LEN 168000 // 12 subcarriers * 100 PRB * 14 symbols * 10 bits, assuming 1024QAM
|
#define SRSLTE_MAX_CODEWORD_LEN 168000 // 12 subcarriers * 100 PRB * 14 symbols * 10 bits, assuming 1024QAM
|
||||||
#define SRSLTE_SL_SCH_MAX_TB_LEN 1000000 // Must be checked in 3GPP
|
#define SRSLTE_SL_SCH_MAX_TB_LEN 1000000 // Must be checked in 3GPP
|
||||||
|
|
|
@ -296,14 +296,6 @@ static void chest_sl_psbch_ls_estimate(srslte_chest_sl_t* q, cf_t* sf_buffer)
|
||||||
interpolate_pilots_sl_psbch(q);
|
interpolate_pilots_sl_psbch(q);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void chest_sl_psbch_ls_equalize(srslte_chest_sl_t* q, cf_t* sf_buffer, cf_t* equalized_sf_buffer)
|
|
||||||
{
|
|
||||||
srslte_chest_sl_estimate_noise(q);
|
|
||||||
|
|
||||||
// Perform channel equalization
|
|
||||||
srslte_predecoding_single(sf_buffer, q->ce_average, equalized_sf_buffer, NULL, q->sf_n_re, 1, q->noise_estimated);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int chest_sl_pscch_gen(srslte_chest_sl_t* q, uint32_t cyclic_shift)
|
static int chest_sl_pscch_gen(srslte_chest_sl_t* q, uint32_t cyclic_shift)
|
||||||
{
|
{
|
||||||
// M_sc_rs - Reference Signal Length
|
// M_sc_rs - Reference Signal Length
|
||||||
|
@ -524,14 +516,6 @@ static void chest_sl_pscch_ls_estimate(srslte_chest_sl_t* q, cf_t* sf_buffer)
|
||||||
interpolate_pilots_sl_pscch(q);
|
interpolate_pilots_sl_pscch(q);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void chest_sl_pscch_ls_equalize(srslte_chest_sl_t* q, cf_t* sf_buffer, cf_t* equalized_sf_buffer)
|
|
||||||
{
|
|
||||||
srslte_chest_sl_estimate_noise(q);
|
|
||||||
|
|
||||||
// Perform channel equalization
|
|
||||||
srslte_predecoding_single(sf_buffer, q->ce_average, equalized_sf_buffer, NULL, q->sf_n_re, 1.0, q->noise_estimated);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int chest_sl_pssch_gen(srslte_chest_sl_t* q)
|
static int chest_sl_pssch_gen(srslte_chest_sl_t* q)
|
||||||
{
|
{
|
||||||
// M_sc_rs - Reference Signal Length
|
// M_sc_rs - Reference Signal Length
|
||||||
|
@ -964,14 +948,6 @@ static void chest_sl_pssch_ls_estimate(srslte_chest_sl_t* q, cf_t* sf_buffer)
|
||||||
interpolate_pilots_sl_pssch(q);
|
interpolate_pilots_sl_pssch(q);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void chest_sl_pssch_ls_equalize(srslte_chest_sl_t* q, cf_t* sf_buffer, cf_t* equalized_sf_buffer)
|
|
||||||
{
|
|
||||||
srslte_chest_sl_estimate_noise(q);
|
|
||||||
|
|
||||||
// Perform channel equalization
|
|
||||||
srslte_predecoding_single(sf_buffer, q->ce_average, equalized_sf_buffer, NULL, q->sf_n_re, 1.0, q->noise_estimated);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void get_subband_noise(srslte_chest_sl_t* q, uint32_t k_start, uint32_t k_end, uint32_t sf_nsymbols)
|
static void get_subband_noise(srslte_chest_sl_t* q, uint32_t k_start, uint32_t k_end, uint32_t sf_nsymbols)
|
||||||
{
|
{
|
||||||
for (int k = k_start; k < k_end; k++) {
|
for (int k = k_start; k < k_end; k++) {
|
||||||
|
@ -1241,16 +1217,10 @@ void srslte_chest_sl_ls_estimate(srslte_chest_sl_t* q, cf_t* sf_buffer)
|
||||||
|
|
||||||
void srslte_chest_sl_ls_equalize(srslte_chest_sl_t* q, cf_t* sf_buffer, cf_t* equalized_sf_buffer)
|
void srslte_chest_sl_ls_equalize(srslte_chest_sl_t* q, cf_t* sf_buffer, cf_t* equalized_sf_buffer)
|
||||||
{
|
{
|
||||||
switch (q->channel) {
|
srslte_chest_sl_estimate_noise(q);
|
||||||
case SRSLTE_SIDELINK_PSBCH:
|
|
||||||
return chest_sl_psbch_ls_equalize(q, sf_buffer, equalized_sf_buffer);
|
// Perform channel equalization
|
||||||
case SRSLTE_SIDELINK_PSCCH:
|
srslte_predecoding_single(sf_buffer, q->ce_average, equalized_sf_buffer, NULL, q->sf_n_re, 1.0, q->noise_estimated);
|
||||||
return chest_sl_pscch_ls_equalize(q, sf_buffer, equalized_sf_buffer);
|
|
||||||
case SRSLTE_SIDELINK_PSSCH:
|
|
||||||
return chest_sl_pssch_ls_equalize(q, sf_buffer, equalized_sf_buffer);
|
|
||||||
default:
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void srslte_chest_sl_ls_estimate_equalize(srslte_chest_sl_t* q, cf_t* sf_buffer, cf_t* equalized_sf_buffer)
|
void srslte_chest_sl_ls_estimate_equalize(srslte_chest_sl_t* q, cf_t* sf_buffer, cf_t* equalized_sf_buffer)
|
||||||
|
|
|
@ -168,6 +168,7 @@ int srslte_pscch_set_cell(srslte_pscch_t* q, srslte_cell_sl_t cell)
|
||||||
q->sci_len = srslte_sci_format0_sizeof(cell.nof_prb);
|
q->sci_len = srslte_sci_format0_sizeof(cell.nof_prb);
|
||||||
q->nof_symbols = SRSLTE_PSCCH_TM12_NUM_DATA_SYMBOLS;
|
q->nof_symbols = SRSLTE_PSCCH_TM12_NUM_DATA_SYMBOLS;
|
||||||
q->pscch_nof_prb = SRSLTE_PSCCH_TM12_NOF_PRB;
|
q->pscch_nof_prb = SRSLTE_PSCCH_TM12_NOF_PRB;
|
||||||
|
q->E = SRSLTE_PSCCH_TM12_NOF_CODED_BITS;
|
||||||
|
|
||||||
if (cell.cp == SRSLTE_CP_EXT) {
|
if (cell.cp == SRSLTE_CP_EXT) {
|
||||||
q->nof_symbols = SRSLTE_PSCCH_TM12_NUM_DATA_SYMBOLS_EXT;
|
q->nof_symbols = SRSLTE_PSCCH_TM12_NUM_DATA_SYMBOLS_EXT;
|
||||||
|
@ -176,15 +177,13 @@ int srslte_pscch_set_cell(srslte_pscch_t* q, srslte_cell_sl_t cell)
|
||||||
q->sci_len = SRSLTE_SCI_TM34_LEN;
|
q->sci_len = SRSLTE_SCI_TM34_LEN;
|
||||||
q->nof_symbols = SRSLTE_PSCCH_TM34_NUM_DATA_SYMBOLS;
|
q->nof_symbols = SRSLTE_PSCCH_TM34_NUM_DATA_SYMBOLS;
|
||||||
q->pscch_nof_prb = SRSLTE_PSCCH_TM34_NOF_PRB;
|
q->pscch_nof_prb = SRSLTE_PSCCH_TM34_NOF_PRB;
|
||||||
|
q->E = SRSLTE_PSCCH_TM34_NOF_CODED_BITS;
|
||||||
} else {
|
} else {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
q->cell = cell;
|
q->cell = cell;
|
||||||
|
|
||||||
///< Calculate actual number of RE
|
|
||||||
q->E = SRSLTE_NRE * q->nof_symbols * q->pscch_nof_prb * SRSLTE_PSCCH_QM;
|
|
||||||
|
|
||||||
///< Last OFDM symbol is processed but not transmitted
|
///< Last OFDM symbol is processed but not transmitted
|
||||||
q->nof_tx_re = (q->nof_symbols - 1) * SRSLTE_NRE * q->pscch_nof_prb;
|
q->nof_tx_re = (q->nof_symbols - 1) * SRSLTE_NRE * q->pscch_nof_prb;
|
||||||
|
|
||||||
|
@ -323,6 +322,9 @@ int srslte_pscch_get(srslte_pscch_t* q, cf_t* sf_buffer, uint32_t prb_start_idx)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Force zeros in last symbol
|
||||||
|
srslte_vec_cf_zero(&q->scfdma_symbols[sample_pos], SRSLTE_NRE * q->pscch_nof_prb);
|
||||||
|
|
||||||
return sample_pos;
|
return sample_pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,27 +34,27 @@
|
||||||
#include "srslte/phy/utils/debug.h"
|
#include "srslte/phy/utils/debug.h"
|
||||||
#include "srslte/phy/utils/vector.h"
|
#include "srslte/phy/utils/vector.h"
|
||||||
|
|
||||||
char* input_file_name;
|
static char* input_file_name = NULL;
|
||||||
srslte_cell_sl_t cell = {.nof_prb = 6, .N_sl_id = 0, .tm = SRSLTE_SIDELINK_TM2, .cp = SRSLTE_CP_NORM};
|
static srslte_cell_sl_t cell = {.nof_prb = 6, .N_sl_id = 0, .tm = SRSLTE_SIDELINK_TM2, .cp = SRSLTE_CP_NORM};
|
||||||
bool use_standard_lte_rates = false;
|
static bool use_standard_lte_rates = false;
|
||||||
uint32_t file_offset = 0;
|
static uint32_t file_offset = 0;
|
||||||
|
|
||||||
uint32_t sf_n_samples;
|
static uint32_t sf_n_samples = 0;
|
||||||
uint32_t sf_n_re;
|
static uint32_t sf_n_re = 0;
|
||||||
cf_t* sf_buffer;
|
static cf_t* sf_buffer = NULL;
|
||||||
cf_t* equalized_sf_buffer;
|
static cf_t* equalized_sf_buffer = NULL;
|
||||||
cf_t* input_buffer;
|
static cf_t* input_buffer = NULL;
|
||||||
srslte_sci_t sci;
|
static srslte_sci_t sci = {};
|
||||||
srslte_pscch_t pscch;
|
static srslte_pscch_t pscch = {};
|
||||||
srslte_chest_sl_t pscch_chest;
|
static srslte_chest_sl_t pscch_chest = {};
|
||||||
srslte_ofdm_t fft;
|
static srslte_ofdm_t fft = {};
|
||||||
srslte_sl_comm_resource_pool_t sl_comm_resource_pool;
|
static srslte_sl_comm_resource_pool_t sl_comm_resource_pool = {};
|
||||||
uint32_t size_sub_channel = 10;
|
static uint32_t size_sub_channel = 10;
|
||||||
uint32_t num_sub_channel = 5;
|
static uint32_t num_sub_channel = 5;
|
||||||
|
|
||||||
srslte_chest_sl_cfg_t pscch_chest_sl_cfg;
|
static srslte_chest_sl_cfg_t pscch_chest_sl_cfg = {};
|
||||||
|
|
||||||
srslte_filesource_t fsrc;
|
static srslte_filesource_t fsrc = {};
|
||||||
|
|
||||||
void usage(char* prog)
|
void usage(char* prog)
|
||||||
{
|
{
|
||||||
|
@ -88,13 +88,13 @@ void parse_args(int argc, char** argv)
|
||||||
input_file_name = argv[optind];
|
input_file_name = argv[optind];
|
||||||
break;
|
break;
|
||||||
case 's':
|
case 's':
|
||||||
size_sub_channel = (int32_t)strtol(argv[optind], NULL, 10);
|
size_sub_channel = (uint32_t)strtol(argv[optind], NULL, 10);
|
||||||
break;
|
break;
|
||||||
case 'n':
|
case 'n':
|
||||||
num_sub_channel = (int32_t)strtol(argv[optind], NULL, 10);
|
num_sub_channel = (uint32_t)strtol(argv[optind], NULL, 10);
|
||||||
break;
|
break;
|
||||||
case 'p':
|
case 'p':
|
||||||
cell.nof_prb = (int32_t)strtol(argv[optind], NULL, 10);
|
cell.nof_prb = (uint32_t)strtol(argv[optind], NULL, 10);
|
||||||
break;
|
break;
|
||||||
case 't':
|
case 't':
|
||||||
switch ((int32_t)strtol(argv[optind], NULL, 10)) {
|
switch ((int32_t)strtol(argv[optind], NULL, 10)) {
|
||||||
|
@ -134,7 +134,7 @@ void parse_args(int argc, char** argv)
|
||||||
int base_init()
|
int base_init()
|
||||||
{
|
{
|
||||||
sf_n_samples = srslte_symbol_sz(cell.nof_prb) * 15;
|
sf_n_samples = srslte_symbol_sz(cell.nof_prb) * 15;
|
||||||
sf_n_re = SRSLTE_SF_LEN_RE(cell.nof_prb, cell.cp);
|
sf_n_re = SRSLTE_SF_LEN_RE(cell.nof_prb, cell.cp);
|
||||||
|
|
||||||
if (srslte_sl_comm_resource_pool_get_default_config(&sl_comm_resource_pool, cell) != SRSLTE_SUCCESS) {
|
if (srslte_sl_comm_resource_pool_get_default_config(&sl_comm_resource_pool, cell) != SRSLTE_SUCCESS) {
|
||||||
ERROR("Error initializing sl_comm_resource_pool\n");
|
ERROR("Error initializing sl_comm_resource_pool\n");
|
||||||
|
|
Loading…
Reference in New Issue