Fix memory issues in PSCCH decoder

This commit is contained in:
Xavier Arteaga 2020-04-13 17:22:50 +02:00 committed by Andre Puschmann
parent eed6240a4b
commit a0fb150e58
4 changed files with 42 additions and 66 deletions

View File

@ -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

View File

@ -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)

View File

@ -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;
} }

View File

@ -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");