changed names. Added tutorial examples. MMSE not working correctly due to erroneous noise estimation under time misalignment

master
ismagom 10 years ago
parent a85a29afba
commit 1a5e064bbf

@ -4,9 +4,9 @@
clear clear
plot_noise_estimation_only=true; plot_noise_estimation_only=false;
SNR_values_db=linspace(0,30,8); SNR_values_db=20;%linspace(0,30,8);
Nrealizations=1 ; Nrealizations=1 ;
preEVM = zeros(length(SNR_values_db),Nrealizations); preEVM = zeros(length(SNR_values_db),Nrealizations);
@ -80,7 +80,7 @@ for sf = 0:10
subframe = lteDLResourceGrid(enb); subframe = lteDLResourceGrid(enb);
% Map input symbols to grid % Map input symbols to grid
%subframe(:) = inputSym; subframe(:) = inputSym;
% Generate synchronizing signals % Generate synchronizing signals
pssSym = ltePSS(enb); pssSym = ltePSS(enb);
@ -141,13 +141,13 @@ rxWaveform = rxWaveform + noise;
%% Synchronization %% Synchronization
offset = lteDLFrameOffset(enb,rxWaveform); offset = lteDLFrameOffset(enb,rxWaveform);
rxWaveform = rxWaveform(1+offset:end,:); rxWaveform = rxWaveform(1+offset+2:end,:);
%% OFDM Demodulation %% OFDM Demodulation
rxGrid = lteOFDMDemodulate(enb,rxWaveform); rxGrid = lteOFDMDemodulate(enb,rxWaveform);
rxGrid = rxGrid(:,1:140); rxGrid = rxGrid(:,1:140);
addpath('../../debug/lte/phy/lib/ch_estimation/test') addpath('../../debug/srslte/lib/ch_estimation/test')
%% Channel Estimation %% Channel Estimation
[estChannel, noiseEst(snr_idx)] = lteDLChannelEstimate(enb,cec,rxGrid); [estChannel, noiseEst(snr_idx)] = lteDLChannelEstimate(enb,cec,rxGrid);

@ -47,3 +47,5 @@ ADD_CUSTOM_TARGET (add_srslte_headers SOURCES ${HEADERS_ALL})
ADD_SUBDIRECTORY(lib) ADD_SUBDIRECTORY(lib)
ADD_SUBDIRECTORY(examples) ADD_SUBDIRECTORY(examples)
add_subdirectory(tutorial_examples)

@ -43,7 +43,7 @@ typedef enum SRSLTE_API {
typedef struct SRSLTE_API { typedef struct SRSLTE_API {
float sigma; // noise power float sigma; // noise power
srslte_demod_soft_alg_t alg_type; // soft demapping algorithm (SRSLTE_DEMOD_SOFT_ALG_EXACT or SRSLTE_DEMOD_SOFT_ALG_APPROX) srslte_demod_soft_alg_t alg_type; // soft demapping algorithm (SRSLTE_DEMOD_SOFT_ALG_EXACT or SRSLTE_DEMOD_SOFT_ALG_APPROX)
srslte_srslte_modem_table_t *table; // symbol mapping table (see modem_table.h) srslte_modem_table_t *table; // symbol mapping table (see modem_table.h)
uint32_t *zones; uint32_t *zones;
float *dd; float *dd;
uint32_t max_symbols; uint32_t max_symbols;
@ -55,7 +55,7 @@ SRSLTE_API int srslte_demod_soft_init(srslte_demod_soft_t *q,
SRSLTE_API void srslte_demod_soft_free(srslte_demod_soft_t *q); SRSLTE_API void srslte_demod_soft_free(srslte_demod_soft_t *q);
SRSLTE_API void srslte_demod_soft_table_set(srslte_demod_soft_t *q, SRSLTE_API void srslte_demod_soft_table_set(srslte_demod_soft_t *q,
srslte_srslte_modem_table_t *table); srslte_modem_table_t *table);
SRSLTE_API void srslte_demod_soft_alg_set(srslte_demod_soft_t *q, SRSLTE_API void srslte_demod_soft_alg_set(srslte_demod_soft_t *q,
srslte_demod_soft_alg_t alg_type); srslte_demod_soft_alg_t alg_type);
@ -72,7 +72,7 @@ SRSLTE_API int srslte_demod_soft_demodulate(srslte_demod_soft_t *q,
/* High-level API */ /* High-level API */
typedef struct SRSLTE_API { typedef struct SRSLTE_API {
srslte_demod_soft_t obj; srslte_demod_soft_t obj;
srslte_srslte_modem_table_t table; srslte_modem_table_t table;
struct srslte_demod_soft_init{ struct srslte_demod_soft_init{
srslte_mod_t std; // symbol mapping standard (see modem_table.h) srslte_mod_t std; // symbol mapping standard (see modem_table.h)

@ -35,14 +35,14 @@
#include "srslte/config.h" #include "srslte/config.h"
#include "modem_table.h" #include "modem_table.h"
SRSLTE_API int srslte_mod_modulate(srslte_srslte_modem_table_t* table, SRSLTE_API int srslte_mod_modulate(srslte_modem_table_t* table,
uint8_t *bits, uint8_t *bits,
cf_t* symbols, cf_t* symbols,
uint32_t nbits); uint32_t nbits);
/* High-level API */ /* High-level API */
typedef struct SRSLTE_API { typedef struct SRSLTE_API {
srslte_srslte_modem_table_t obj; srslte_modem_table_t obj;
struct mod_init { struct mod_init {
srslte_mod_t std; // symbol mapping standard (see modem_table.h) srslte_mod_t std; // symbol mapping standard (see modem_table.h)
} init; } init;

@ -49,22 +49,22 @@ typedef struct SRSLTE_API {
srslte_soft_table_t soft_table; // symbol-to-bit mapping (used in soft demodulating) srslte_soft_table_t soft_table; // symbol-to-bit mapping (used in soft demodulating)
uint32_t nsymbols; // number of modulation symbols uint32_t nsymbols; // number of modulation symbols
uint32_t nbits_x_symbol; // number of bits per symbol uint32_t nbits_x_symbol; // number of bits per symbol
}srslte_srslte_modem_table_t; }srslte_modem_table_t;
SRSLTE_API void srslte_modem_table_init(srslte_srslte_modem_table_t* q); SRSLTE_API void srslte_modem_table_init(srslte_modem_table_t* q);
SRSLTE_API void srslte_modem_table_free(srslte_srslte_modem_table_t* q); SRSLTE_API void srslte_modem_table_free(srslte_modem_table_t* q);
SRSLTE_API void srslte_modem_table_reset(srslte_srslte_modem_table_t* q); SRSLTE_API void srslte_modem_table_reset(srslte_modem_table_t* q);
SRSLTE_API int srslte_modem_table_set(srslte_srslte_modem_table_t* q, SRSLTE_API int srslte_modem_table_set(srslte_modem_table_t* q,
cf_t* table, cf_t* table,
srslte_soft_table_t *soft_table, srslte_soft_table_t *soft_table,
uint32_t nsymbols, uint32_t nsymbols,
uint32_t nbits_x_symbol); uint32_t nbits_x_symbol);
SRSLTE_API int srslte_modem_table_lte(srslte_srslte_modem_table_t* q, SRSLTE_API int srslte_modem_table_lte(srslte_modem_table_t* q,
srslte_mod_t modulation, srslte_mod_t modulation,
bool compute_soft_demod); bool compute_soft_demod);

@ -69,7 +69,7 @@ typedef struct SRSLTE_API {
uint32_t frame_idx; uint32_t frame_idx;
/* tx & rx objects */ /* tx & rx objects */
srslte_srslte_modem_table_t mod; srslte_modem_table_t mod;
srslte_demod_soft_t demod; srslte_demod_soft_t demod;
srslte_sequence_t seq; srslte_sequence_t seq;
srslte_viterbi_t decoder; srslte_viterbi_t decoder;

@ -64,7 +64,7 @@ typedef struct SRSLTE_API {
float data_f[PCFICH_CFI_LEN]; float data_f[PCFICH_CFI_LEN];
/* tx & rx objects */ /* tx & rx objects */
srslte_srslte_modem_table_t mod; srslte_modem_table_t mod;
srslte_demod_soft_t demod; srslte_demod_soft_t demod;
srslte_sequence_t seq[SRSLTE_NSUBFRAMES_X_FRAME]; srslte_sequence_t seq[SRSLTE_NSUBFRAMES_X_FRAME];
srslte_precoding_t precoding; srslte_precoding_t precoding;

@ -69,7 +69,7 @@ typedef struct SRSLTE_API {
float *llr; float *llr;
/* tx & rx objects */ /* tx & rx objects */
srslte_srslte_modem_table_t mod; srslte_modem_table_t mod;
srslte_demod_soft_t demod; srslte_demod_soft_t demod;
srslte_sequence_t seq[SRSLTE_NSUBFRAMES_X_FRAME]; srslte_sequence_t seq[SRSLTE_NSUBFRAMES_X_FRAME];
srslte_viterbi_t decoder; srslte_viterbi_t decoder;

@ -62,7 +62,7 @@ typedef struct SRSLTE_API {
void *e; void *e;
/* tx & rx objects */ /* tx & rx objects */
srslte_srslte_modem_table_t mod[4]; srslte_modem_table_t mod[4];
srslte_demod_soft_t demod; srslte_demod_soft_t demod;
srslte_sequence_t seq[SRSLTE_NSUBFRAMES_X_FRAME]; srslte_sequence_t seq[SRSLTE_NSUBFRAMES_X_FRAME];
srslte_precoding_t precoding; srslte_precoding_t precoding;

@ -76,7 +76,7 @@ typedef struct SRSLTE_API {
uint8_t data[SRSLTE_PHICH_NBITS]; uint8_t data[SRSLTE_PHICH_NBITS];
/* tx & rx objects */ /* tx & rx objects */
srslte_srslte_modem_table_t mod; srslte_modem_table_t mod;
srslte_demod_hard_t demod; srslte_demod_hard_t demod;
srslte_sequence_t seq[SRSLTE_NSUBFRAMES_X_FRAME]; srslte_sequence_t seq[SRSLTE_NSUBFRAMES_X_FRAME];
srslte_precoding_t precoding; srslte_precoding_t precoding;

@ -81,7 +81,7 @@ typedef struct SRSLTE_API {
void *g; void *g;
/* tx & rx objects */ /* tx & rx objects */
srslte_srslte_modem_table_t mod[4]; srslte_modem_table_t mod[4];
srslte_demod_soft_t demod; srslte_demod_soft_t demod;
srslte_sequence_t seq[SRSLTE_NSUBFRAMES_X_FRAME]; srslte_sequence_t seq[SRSLTE_NSUBFRAMES_X_FRAME];
srslte_sequence_t seq_type2_fo; srslte_sequence_t seq_type2_fo;

@ -71,6 +71,8 @@ typedef struct SRSLTE_API {
cf_t *sf_symbols; cf_t *sf_symbols;
cf_t *ce[SRSLTE_MAX_PORTS]; cf_t *ce[SRSLTE_MAX_PORTS];
srslte_dci_format_t dci_format;
uint32_t cfi;
uint64_t pkt_errors; uint64_t pkt_errors;
uint64_t pkts_total; uint64_t pkts_total;
uint64_t nof_detected; uint64_t nof_detected;

@ -94,6 +94,7 @@ typedef struct SRSLTE_API {
uint32_t sf_idx; uint32_t sf_idx;
bool decode_sss_on_track; bool decode_sss_on_track;
bool correct_cfo;
uint32_t peak_idx; uint32_t peak_idx;
int time_offset; int time_offset;

@ -92,7 +92,6 @@ int srslte_chest_dl_init(srslte_chest_dl_t *q, srslte_cell_t cell)
perror("malloc"); perror("malloc");
goto clean_exit; goto clean_exit;
} }
bzero(q->tmp_timeavg_mult, sizeof(cf_t) * 2*cell.nof_prb);
for (int i=0;i<cell.nof_ports;i++) { for (int i=0;i<cell.nof_ports;i++) {
q->pilot_estimates[i] = srslte_vec_malloc(sizeof(cf_t) * SRSLTE_REFSIGNAL_NUM_SF(cell.nof_prb, i)); q->pilot_estimates[i] = srslte_vec_malloc(sizeof(cf_t) * SRSLTE_REFSIGNAL_NUM_SF(cell.nof_prb, i));
@ -123,13 +122,13 @@ int srslte_chest_dl_init(srslte_chest_dl_t *q, srslte_cell_t cell)
} }
/* Set default time/freq filters */ /* Set default time/freq filters */
//float f[3]={0.1, 0.8, 0.1}; //float f[3]={0.2, 0.6, 0.2};
//srslte_chest_dl_set_filter_freq(q, f, 3); //srslte_chest_dl_set_filter_freq(q, f, 3);
float f[5]={0.05, 0.2, 0.5, 0.2, 0.05}; float f[5]={0.1, 0.2, 0.4, 0.2, 0.1};
srslte_chest_dl_set_filter_freq(q, f, 5); srslte_chest_dl_set_filter_freq(q, f, 5);
float t[2]={0.1, 0.9}; float t[2]={0.5, 0.5};
srslte_chest_dl_set_filter_time(q, t, 0); srslte_chest_dl_set_filter_time(q, t, 0);
q->cell = cell; q->cell = cell;
@ -269,14 +268,18 @@ static void average_pilots(srslte_chest_dl_t *q, uint32_t port_id)
for (i=0;i<q->filter_time_len-1;i++) { for (i=0;i<q->filter_time_len-1;i++) {
memcpy(q->tmp_timeavg[i], q->tmp_timeavg[i+1], nref*sizeof(cf_t)); memcpy(q->tmp_timeavg[i], q->tmp_timeavg[i+1], nref*sizeof(cf_t));
} }
/* Put last symbol to buffer */ /* Save last symbol to buffer */
memcpy(q->tmp_timeavg[i], &pilot_tmp(0), nref*sizeof(cf_t)); memcpy(q->tmp_timeavg[q->filter_time_len-1], &pilot_tmp(0), nref*sizeof(cf_t));
/* Multiply all symbols by filter and add them */ /* Multiply all symbols by filter and add them */
bzero(&pilot_avg(0), nref * sizeof(cf_t)); if (l > 0) {
for (i=0;i<q->filter_time_len;i++) { bzero(&pilot_avg(0), nref * sizeof(cf_t));
srslte_vec_sc_prod_cfc(q->tmp_timeavg[i], q->filter_time[i], q->tmp_timeavg[i], nref); for (i=0;i<q->filter_time_len;i++) {
srslte_vec_sum_ccc(q->tmp_timeavg[i], &pilot_avg(0), &pilot_avg(0), nref); srslte_vec_sc_prod_cfc(q->tmp_timeavg[i], q->filter_time[i], q->tmp_timeavg_mult, nref);
srslte_vec_sum_ccc(q->tmp_timeavg_mult, &pilot_avg(0), &pilot_avg(0), nref);
}
} else {
memcpy(&pilot_avg(0), &pilot_tmp(0), nref * sizeof(cf_t));
} }
} else { } else {
memcpy(&pilot_avg(0), &pilot_tmp(0), nref * sizeof(cf_t)); memcpy(&pilot_avg(0), &pilot_tmp(0), nref * sizeof(cf_t));

@ -71,7 +71,7 @@ void srslte_demod_soft_free(srslte_demod_soft_t *q) {
bzero((void*)q,sizeof(srslte_demod_soft_t)); bzero((void*)q,sizeof(srslte_demod_soft_t));
} }
void srslte_demod_soft_table_set(srslte_demod_soft_t *q, srslte_srslte_modem_table_t *table) { void srslte_demod_soft_table_set(srslte_demod_soft_t *q, srslte_modem_table_t *table) {
q->table = table; q->table = table;
} }

@ -35,7 +35,7 @@
/** Low-level API */ /** Low-level API */
int srslte_mod_modulate(srslte_srslte_modem_table_t* q, uint8_t *bits, cf_t* symbols, uint32_t nbits) { int srslte_mod_modulate(srslte_modem_table_t* q, uint8_t *bits, cf_t* symbols, uint32_t nbits) {
uint32_t i,j,idx; uint32_t i,j,idx;
uint8_t *b_ptr=(uint8_t*) bits; uint8_t *b_ptr=(uint8_t*) bits;
j=0; j=0;

@ -38,26 +38,26 @@
#include "lte_tables.h" #include "lte_tables.h"
/** Internal functions */ /** Internal functions */
static int table_create(srslte_srslte_modem_table_t* q) { static int table_create(srslte_modem_table_t* q) {
q->symbol_table = malloc(q->nsymbols*sizeof(cf_t)); q->symbol_table = malloc(q->nsymbols*sizeof(cf_t));
return q->symbol_table==NULL; return q->symbol_table==NULL;
} }
void srslte_modem_table_init(srslte_srslte_modem_table_t* q) { void srslte_modem_table_init(srslte_modem_table_t* q) {
bzero((void*)q,sizeof(srslte_srslte_modem_table_t)); bzero((void*)q,sizeof(srslte_modem_table_t));
} }
void srslte_modem_table_free(srslte_srslte_modem_table_t* q) { void srslte_modem_table_free(srslte_modem_table_t* q) {
if (q->symbol_table) { if (q->symbol_table) {
free(q->symbol_table); free(q->symbol_table);
} }
bzero(q, sizeof(srslte_srslte_modem_table_t)); bzero(q, sizeof(srslte_modem_table_t));
} }
void srslte_modem_table_reset(srslte_srslte_modem_table_t* q) { void srslte_modem_table_reset(srslte_modem_table_t* q) {
srslte_modem_table_free(q); srslte_modem_table_free(q);
srslte_modem_table_init(q); srslte_modem_table_init(q);
} }
int srslte_modem_table_set(srslte_srslte_modem_table_t* q, cf_t* table, srslte_soft_table_t *soft_table, uint32_t nsymbols, uint32_t nbits_x_symbol) { int srslte_modem_table_set(srslte_modem_table_t* q, cf_t* table, srslte_soft_table_t *soft_table, uint32_t nsymbols, uint32_t nbits_x_symbol) {
if (q->nsymbols) { if (q->nsymbols) {
return SRSLTE_ERROR; return SRSLTE_ERROR;
} }
@ -71,7 +71,7 @@ int srslte_modem_table_set(srslte_srslte_modem_table_t* q, cf_t* table, srslte_s
return SRSLTE_SUCCESS; return SRSLTE_SUCCESS;
} }
int srslte_modem_table_lte(srslte_srslte_modem_table_t* q, srslte_mod_t modulation, bool compute_soft_demod) { int srslte_modem_table_lte(srslte_modem_table_t* q, srslte_mod_t modulation, bool compute_soft_demod) {
switch(modulation) { switch(modulation) {
case SRSLTE_MOD_BPSK: case SRSLTE_MOD_BPSK:
q->nbits_x_symbol = 1; q->nbits_x_symbol = 1;

@ -94,7 +94,7 @@ void parse_args(int argc, char **argv) {
int main(int argc, char **argv) { int main(int argc, char **argv) {
int i; int i;
srslte_srslte_modem_table_t mod; srslte_modem_table_t mod;
srslte_demod_hard_t demod_hard; srslte_demod_hard_t demod_hard;
srslte_demod_soft_t demod_soft; srslte_demod_soft_t demod_soft;
uint8_t *input, *output; uint8_t *input, *output;

@ -108,7 +108,7 @@ float mse_threshold() {
int main(int argc, char **argv) { int main(int argc, char **argv) {
int i; int i;
srslte_srslte_modem_table_t mod; srslte_modem_table_t mod;
srslte_demod_soft_t demod_soft; srslte_demod_soft_t demod_soft;
uint8_t *input, *output; uint8_t *input, *output;
cf_t *symbols; cf_t *symbols;

@ -802,13 +802,13 @@ int srslte_dci_msg_unpack_pusch(srslte_dci_msg_t *msg, srslte_ra_pusch_t *data,
} }
srslte_dci_format_t srslte_dci_format_from_string(char *str) { srslte_dci_format_t srslte_dci_format_from_string(char *str) {
if (!strcmp(str, "SRSLTE_DCI_FORMAT0")) { if (!strcmp(str, "Format0")) {
return SRSLTE_DCI_FORMAT0; return SRSLTE_DCI_FORMAT0;
} else if (!strcmp(str, "SRSLTE_DCI_FORMAT1")) { } else if (!strcmp(str, "Format1")) {
return SRSLTE_DCI_FORMAT1; return SRSLTE_DCI_FORMAT1;
} else if (!strcmp(str, "SRSLTE_DCI_FORMAT1A")) { } else if (!strcmp(str, "Format1A")) {
return SRSLTE_DCI_FORMAT1A; return SRSLTE_DCI_FORMAT1A;
} else if (!strcmp(str, "SRSLTE_DCI_FORMAT1C")) { } else if (!strcmp(str, "Format1C")) {
return SRSLTE_DCI_FORMAT1C; return SRSLTE_DCI_FORMAT1C;
} else { } else {
return SRSLTE_DCI_FORMAT_ERROR; return SRSLTE_DCI_FORMAT_ERROR;
@ -818,13 +818,13 @@ srslte_dci_format_t srslte_dci_format_from_string(char *str) {
char* srslte_dci_format_string(srslte_dci_format_t format) { char* srslte_dci_format_string(srslte_dci_format_t format) {
switch (format) { switch (format) {
case SRSLTE_DCI_FORMAT0: case SRSLTE_DCI_FORMAT0:
return "SRSLTE_DCI_FORMAT0"; return "Format0";
case SRSLTE_DCI_FORMAT1: case SRSLTE_DCI_FORMAT1:
return "SRSLTE_DCI_FORMAT1"; return "Format1";
case SRSLTE_DCI_FORMAT1A: case SRSLTE_DCI_FORMAT1A:
return "SRSLTE_DCI_FORMAT1A"; return "Format1A";
case SRSLTE_DCI_FORMAT1C: case SRSLTE_DCI_FORMAT1C:
return "SRSLTE_DCI_FORMAT1C"; return "Format1C";
default: default:
return "N/A"; // fatal error return "N/A"; // fatal error
} }

@ -36,7 +36,7 @@
#include "srslte/sync/cfo.h" #include "srslte/sync/cfo.h"
#define MEANPEAK_EMA_ALPHA 0.2 #define MEANPEAK_EMA_ALPHA 0.2
#define CFO_EMA_ALPHA 0.01 #define CFO_EMA_ALPHA 0.1
#define CP_EMA_ALPHA 0.2 #define CP_EMA_ALPHA 0.2
static bool fft_size_isvalid(uint32_t fft_size) { static bool fft_size_isvalid(uint32_t fft_size) {

@ -196,7 +196,7 @@ int srslte_ue_dl_decode_fft_estimate(srslte_ue_dl_t *q, cf_t *input, uint32_t sf
} }
/* Extract all PDCCH symbols and get LLRs */ /* Extract all PDCCH symbols and get LLRs */
if (srslte_pdcch_extract_llr(&q->pdcch, q->sf_symbols, q->ce, srslte_chest_dl_get_noise_estimate(&q->chest), sf_idx, *cfi)) { if (srslte_pdcch_extract_llr(&q->pdcch, q->sf_symbols, q->ce, 0, sf_idx, *cfi)) {
fprintf(stderr, "Error extracting LLRs\n"); fprintf(stderr, "Error extracting LLRs\n");
return SRSLTE_ERROR; return SRSLTE_ERROR;
} }
@ -228,7 +228,7 @@ int srslte_ue_dl_decode_rnti_rv_packet(srslte_ue_dl_t *q, srslte_dci_msg_t *dci_
} }
if (q->harq_process[0].mcs.mod > 0 && q->harq_process[0].mcs.tbs >= 0) { if (q->harq_process[0].mcs.mod > 0 && q->harq_process[0].mcs.tbs >= 0) {
ret = srslte_pdsch_decode_rnti(&q->pdsch, &q->harq_process[0], q->sf_symbols, ret = srslte_pdsch_decode_rnti(&q->pdsch, &q->harq_process[0], q->sf_symbols,
q->ce, srslte_chest_dl_get_noise_estimate(&q->chest), q->ce, 0,
rnti, data); rnti, data);
if (ret == SRSLTE_ERROR) { if (ret == SRSLTE_ERROR) {
q->pkt_errors++; q->pkt_errors++;
@ -262,7 +262,7 @@ int srslte_ue_dl_find_ul_dci(srslte_ue_dl_t *q, srslte_dci_msg_t *dci_msg, uint3
int srslte_ue_dl_decode_rnti_rv(srslte_ue_dl_t *q, cf_t *input, uint8_t *data, uint32_t sf_idx, uint16_t rnti, uint32_t rvidx) int srslte_ue_dl_decode_rnti_rv(srslte_ue_dl_t *q, cf_t *input, uint8_t *data, uint32_t sf_idx, uint16_t rnti, uint32_t rvidx)
{ {
uint32_t cfi, i; uint32_t i;
srslte_dci_msg_t dci_msg; srslte_dci_msg_t dci_msg;
srslte_dci_location_t locations[MAX_CANDIDATES]; srslte_dci_location_t locations[MAX_CANDIDATES];
uint32_t nof_locations; uint32_t nof_locations;
@ -271,17 +271,17 @@ int srslte_ue_dl_decode_rnti_rv(srslte_ue_dl_t *q, cf_t *input, uint8_t *data, u
uint32_t nof_formats; uint32_t nof_formats;
srslte_dci_format_t *formats = NULL; srslte_dci_format_t *formats = NULL;
if ((ret = srslte_ue_dl_decode_fft_estimate(q, input, sf_idx, &cfi)) < 0) { if ((ret = srslte_ue_dl_decode_fft_estimate(q, input, sf_idx, &q->cfi)) < 0) {
return ret; return ret;
} }
/* Generate PDCCH candidates */ /* Generate PDCCH candidates */
if (rnti == SRSLTE_SIRNTI) { if (rnti == SRSLTE_SIRNTI) {
nof_locations = srslte_pdcch_common_locations(&q->pdcch, locations, MAX_CANDIDATES, cfi); nof_locations = srslte_pdcch_common_locations(&q->pdcch, locations, MAX_CANDIDATES, q->cfi);
formats = common_formats; formats = common_formats;
nof_formats = nof_common_formats; nof_formats = nof_common_formats;
} else { } else {
nof_locations = srslte_pdcch_ue_locations(&q->pdcch, locations, MAX_CANDIDATES, sf_idx, cfi, rnti); nof_locations = srslte_pdcch_ue_locations(&q->pdcch, locations, MAX_CANDIDATES, sf_idx, q->cfi, rnti);
formats = ue_formats; formats = ue_formats;
nof_formats = nof_ue_formats; nof_formats = nof_ue_formats;
} }
@ -299,8 +299,9 @@ int srslte_ue_dl_decode_rnti_rv(srslte_ue_dl_t *q, cf_t *input, uint8_t *data, u
INFO("Decoded DCI message RNTI: 0x%x\n", srslte_crc_rem); INFO("Decoded DCI message RNTI: 0x%x\n", srslte_crc_rem);
if (srslte_crc_rem == rnti) { if (srslte_crc_rem == rnti) {
q->dci_format = formats[f];
found_dci++; found_dci++;
ret = srslte_ue_dl_decode_rnti_rv_packet(q, &dci_msg, data, cfi, sf_idx, rnti, rvidx); ret = srslte_ue_dl_decode_rnti_rv_packet(q, &dci_msg, data, q->cfi, sf_idx, rnti, rvidx);
} }
} }
} }

@ -63,7 +63,7 @@ int srslte_ue_sync_init_file(srslte_ue_sync_t *q, uint32_t nof_prb, char *file_n
goto clean_exit; goto clean_exit;
} }
q->input_buffer = srslte_vec_malloc(q->sf_len * sizeof(cf_t)); q->input_buffer = srslte_vec_malloc(2 * q->sf_len * sizeof(cf_t));
if (!q->input_buffer) { if (!q->input_buffer) {
perror("malloc"); perror("malloc");
goto clean_exit; goto clean_exit;
@ -102,6 +102,7 @@ int srslte_ue_sync_init(srslte_ue_sync_t *q,
q->fft_size = srslte_symbol_sz(q->cell.nof_prb); q->fft_size = srslte_symbol_sz(q->cell.nof_prb);
q->sf_len = SRSLTE_SF_LEN(q->fft_size); q->sf_len = SRSLTE_SF_LEN(q->fft_size);
q->file_mode = false; q->file_mode = false;
q->correct_cfo = true;
if (cell.id == 1000) { if (cell.id == 1000) {
/* If the cell is unkown, decode SSS on track state */ /* If the cell is unkown, decode SSS on track state */
@ -449,7 +450,7 @@ int srslte_ue_sync_get_buffer(srslte_ue_sync_t *q, cf_t **sf_symbols) {
} }
/* Do CFO Correction if not done in track and deliver the frame */ /* Do CFO Correction if not done in track and deliver the frame */
if (!q->strack.correct_cfo) { if (!q->strack.correct_cfo && q->correct_cfo) {
srslte_cfo_correct(&q->sfind.cfocorr, srslte_cfo_correct(&q->sfind.cfocorr,
q->input_buffer, q->input_buffer,
q->input_buffer, q->input_buffer,

Loading…
Cancel
Save