From ded17137b0c3d6b58c752209736ed8663f088c89 Mon Sep 17 00:00:00 2001 From: Ismael Gomez Date: Tue, 30 Aug 2016 00:49:31 +0200 Subject: [PATCH] fixed bugs from coverty analysis --- matlab/tests/equalizer_test.m | 17 ++---- matlab/tests/pdsch_decode_signal.m | 9 ++- matlab/tests/pdsch_equal.m | 11 +++- srslte/examples/pdsch_ue.c | 7 +-- srslte/include/srslte/dft/dft_precoding.h | 4 +- srslte/lib/ch_estimation/chest_dl.c | 1 + srslte/lib/ch_estimation/chest_ul.c | 8 +-- srslte/lib/ch_estimation/refsignal_ul.c | 60 +++++++++++-------- srslte/lib/ch_estimation/test/chest_test_ul.c | 2 +- srslte/lib/fec/convcoder.c | 2 +- srslte/lib/fec/parity.c | 2 +- srslte/lib/phch/cqi.c | 17 ++++-- srslte/lib/phch/dci.c | 4 +- srslte/lib/phch/pdcch.c | 53 ++++++++-------- srslte/lib/phch/pdsch.c | 27 +++++---- srslte/lib/phch/prach.c | 28 ++++++--- srslte/lib/phch/pucch.c | 4 +- srslte/lib/phch/ra.c | 5 +- srslte/lib/phch/regs.c | 10 +++- srslte/lib/phch/sch.c | 4 +- srslte/lib/phch/test/pdsch_test_mex.c | 4 +- srslte/lib/rf/rf_blade_imp.c | 5 +- srslte/lib/rf/rf_uhd_imp.c | 2 + srslte/lib/sync/cfo.c | 2 +- srslte/lib/sync/pss.c | 2 + srslte/lib/sync/sss.c | 13 ++-- srslte/lib/sync/sync.c | 9 ++- srslte/lib/ue/ue_sync.c | 3 +- srslte/lib/ue/ue_ul.c | 4 +- 29 files changed, 190 insertions(+), 129 deletions(-) diff --git a/matlab/tests/equalizer_test.m b/matlab/tests/equalizer_test.m index 1391d5e53..816a29957 100644 --- a/matlab/tests/equalizer_test.m +++ b/matlab/tests/equalizer_test.m @@ -6,11 +6,11 @@ clear plot_noise_estimation_only=false; -SNR_values_db=100;%linspace(20,35,8); -Nrealizations=1; +SNR_values_db=linspace(0,30,8); +Nrealizations=10; w1=0.1; -w2=0.3; +w2=0.2; enb.NDLRB = 6; % Number of resource blocks @@ -55,7 +55,7 @@ L = gridsize(2); % Number of OFDM symbols in one subframe Ports = gridsize(3); % Number of transmit antenna ports %% Allocate memory -Ntests=2; +Ntests=4; hest=cell(1,Ntests); tmpnoise=cell(1,Ntests); for i=1:Ntests @@ -181,8 +181,8 @@ for i=1:10 rxGrid_sf = rxGrid(:,(i-1)*14+1:i*14); %% Channel Estimation with Matlab - [hest{1}(:,(1:14)+(i-1)*14), tmpnoise{1}(i), hls(:,(1:4*P)+(i-1)*4*P)] = ... - lteDLChannelEstimate2(enb,cec,rxGrid_sf); + [hest{1}(:,(1:14)+(i-1)*14), tmpnoise{1}(i)] = ... + lteDLChannelEstimate(enb,cec,rxGrid_sf); tmpnoise{1}(i)=tmpnoise{1}(i)*sqrt(2)*enb.CellRefP; %% LS-Linear estimation with srsLTE @@ -233,11 +233,6 @@ if (length(SNR_values_db) == 1) fprintf('Mean MMSE Robust %.2f dB\n', 10*log10(MSE(4,nreal,snr_idx))) fprintf('Mean MMSE matlab %.2f dB\n', 10*log10(MSE(1,nreal,snr_idx))) -<<<<<<< HEAD - -======= - ->>>>>>> master end end diff --git a/matlab/tests/pdsch_decode_signal.m b/matlab/tests/pdsch_decode_signal.m index d376c5c3f..72b733eb5 100644 --- a/matlab/tests/pdsch_decode_signal.m +++ b/matlab/tests/pdsch_decode_signal.m @@ -1,6 +1,6 @@ -enb=struct('NCellID',137,'NDLRB',50,'NSubframe',8,'CFI',1,'CyclicPrefix','Normal','CellRefP',2,'Ng','One','PHICHDuration','Normal','DuplexMode','FDD'); +enb=struct('NCellID',313,'NDLRB',75,'NSubframe',5,'CFI',1,'CyclicPrefix','Normal','CellRefP',2,'Ng','One','PHICHDuration','Normal','DuplexMode','FDD'); -RNTI=5; +RNTI=65535; addpath('../../build/srslte/lib/phch/test') @@ -44,12 +44,15 @@ if ~isempty(dci) [sib1, crc] = lteDLSCHDecode(enb, pdsch, trblklen, dlschBits); - [dec2, data, pdschRx2, pdschSymbols2, e_bits] = srslte_pdsch(enb, pdsch, ... + [dec2, data, pdschRx2, pdschSymbols2, e_bits, ce] = srslte_pdsch(enb, pdsch, ... trblklen, ... subframe_rx); + subplot(2,1,1) scatter(real(pdschSymbols{1}),imag(pdschSymbols{1})) + subplot(2,1,2) + scatter(real(pdschSymbols2),imag(pdschSymbols2)) if crc == 0 fprintf('PDSCH Matlab OK.\n\n'); diff --git a/matlab/tests/pdsch_equal.m b/matlab/tests/pdsch_equal.m index 665ff8047..1ad1d86dc 100644 --- a/matlab/tests/pdsch_equal.m +++ b/matlab/tests/pdsch_equal.m @@ -116,7 +116,7 @@ for snr_idx=1:length(SNR_values) rmccFgOut.TotSubframes=1; % Perform channel estimation - [hest, nest,estimates] = lteDLChannelEstimate2(rmccFgOut, cec, subframe_rx); + [hest, nest] = lteDLChannelEstimate(rmccFgOut, cec, subframe_rx); [cws,symbols] = ltePDSCHDecode(rmccFgOut,rmccFgOut.PDSCH,subframe_rx,hest,nest); [trblkout,blkcrc,dstate] = lteDLSCHDecode(rmccFgOut,rmccFgOut.PDSCH, ... @@ -127,7 +127,7 @@ for snr_idx=1:length(SNR_values) %% Same with srsLTE if (rmccFgOut.PDSCH.TrBlkSizes(sf_idx+1) > 0) - [dec2, data, pdschRx, pdschSymbols2, cws2] = srslte_pdsch(rmccFgOut, rmccFgOut.PDSCH, ... + [dec2, data, pdschRx, pdschSymbols2, cws2, ce] = srslte_pdsch(rmccFgOut, rmccFgOut.PDSCH, ... rmccFgOut.PDSCH.TrBlkSizes(sf_idx+1), ... subframe_rx); else @@ -155,7 +155,12 @@ if (length(SNR_values)>1) ylabel('BLER') axis([min(SNR_values) max(SNR_values) 1/Npackets/(Nsf+1) 1]) else - scatter(real(symbols{1}),imag(symbols{1})) + subplot(2,1,1) + scatter(real(pdschSymbols2),imag(pdschSymbols2)) + %plot(real(hest)) + subplot(2,1,2) + %plot(1:180,angle(ce(1:180)),1:180,angle(hest(:,1))) + plot(abs(ce-hest(:))) fprintf('Matlab: %d OK\nsrsLTE: %d OK\n',decoded, decoded_srslte); end diff --git a/srslte/examples/pdsch_ue.c b/srslte/examples/pdsch_ue.c index b0a9c5fd6..f8cf033a9 100644 --- a/srslte/examples/pdsch_ue.c +++ b/srslte/examples/pdsch_ue.c @@ -512,13 +512,12 @@ int main(int argc, char **argv) { srslte_ue_sync_get_sfidx(&ue_sync), SRSLTE_SIRNTI, rv); - /* - if (!n) { + if (n>0) { printf("Saving signal...\n"); - srslte_ue_dl_save_signal(&ue_dl, &ue_dl.softbuffer, sfn*10+srslte_ue_sync_get_sfidx(&ue_sync), rv); + srslte_ue_dl_save_signal(&ue_dl, &ue_dl.softbuffer, sfn*10+srslte_ue_sync_get_sfidx(&ue_sync), rv, prog_args.rnti); exit(-1); } - */ + } if (n < 0) { // fprintf(stderr, "Error decoding UE DL\n");fflush(stdout); diff --git a/srslte/include/srslte/dft/dft_precoding.h b/srslte/include/srslte/dft/dft_precoding.h index eac79e6c8..e860e5b7b 100644 --- a/srslte/include/srslte/dft/dft_precoding.h +++ b/srslte/include/srslte/dft/dft_precoding.h @@ -44,8 +44,8 @@ typedef struct SRSLTE_API { uint32_t max_prb; - srslte_dft_plan_t dft_plan[SRSLTE_MAX_PRB]; - srslte_dft_plan_t idft_plan[SRSLTE_MAX_PRB]; + srslte_dft_plan_t dft_plan[SRSLTE_MAX_PRB+1]; + srslte_dft_plan_t idft_plan[SRSLTE_MAX_PRB+1]; }srslte_dft_precoding_t; diff --git a/srslte/lib/ch_estimation/chest_dl.c b/srslte/lib/ch_estimation/chest_dl.c index beb7518d2..541f98646 100644 --- a/srslte/lib/ch_estimation/chest_dl.c +++ b/srslte/lib/ch_estimation/chest_dl.c @@ -293,6 +293,7 @@ static void average_pilots(srslte_chest_dl_t *q, cf_t *input, cf_t *output, uint uint32_t nsymbols = srslte_refsignal_cs_nof_symbols(port_id); uint32_t nref = 2*q->cell.nof_prb; + // Average in the frequency domain for (int l=0;lsmooth_filter, &output[l*nref], nref, q->smooth_filter_len); } diff --git a/srslte/lib/ch_estimation/chest_ul.c b/srslte/lib/ch_estimation/chest_ul.c index 4286854c0..c61e88c7d 100644 --- a/srslte/lib/ch_estimation/chest_ul.c +++ b/srslte/lib/ch_estimation/chest_ul.c @@ -91,11 +91,11 @@ int srslte_chest_ul_init(srslte_chest_ul_t *q, srslte_cell_t cell) q->smooth_filter_len = 3; srslte_chest_ul_set_smooth_filter3_coeff(q, 0.3333); - + + q->dmrs_signal_configured = false; + } - - q->dmrs_signal_configured = false; - + ret = SRSLTE_SUCCESS; clean_exit: diff --git a/srslte/lib/ch_estimation/refsignal_ul.c b/srslte/lib/ch_estimation/refsignal_ul.c index 3c7dcfb02..30aa7da08 100644 --- a/srslte/lib/ch_estimation/refsignal_ul.c +++ b/srslte/lib/ch_estimation/refsignal_ul.c @@ -177,6 +177,8 @@ int srslte_refsignal_ul_init(srslte_refsignal_ul_t * q, srslte_cell_t cell) if (q != NULL && srslte_cell_isvalid(&cell)) { + ret = SRSLTE_ERROR; + bzero(q, sizeof(srslte_refsignal_ul_t)); q->cell = cell; @@ -275,11 +277,13 @@ static uint32_t get_q(uint32_t u, uint32_t v, uint32_t N_sz) { static void arg_r_uv_mprb(float *arg, uint32_t M_sc, uint32_t u, uint32_t v) { uint32_t N_sz = largest_prime_lower_than(M_sc); - float q = get_q(u,v,N_sz); - float n_sz = (float) N_sz; - for (uint32_t i = 0; i < M_sc; i++) { - float m = (float) (i%N_sz); - arg[i] = -M_PI * q * m * (m + 1) / n_sz; + if (N_sz > 0) { + float q = get_q(u,v,N_sz); + float n_sz = (float) N_sz; + for (uint32_t i = 0; i < M_sc; i++) { + float m = (float) (i%N_sz); + arg[i] = -M_PI * q * m * (m + 1) / n_sz; + } } } @@ -478,29 +482,35 @@ static uint32_t get_pucch_dmrs_symbol(uint32_t m, srslte_pucch_format_t format, case SRSLTE_PUCCH_FORMAT_1A: case SRSLTE_PUCCH_FORMAT_1B: if (SRSLTE_CP_ISNORM(cp)) { - if (m < 4) { + if (m < 3) { return pucch_dmrs_symbol_format1_cpnorm[m]; } } else { - if (m < 3) { + if (m < 2) { return pucch_dmrs_symbol_format1_cpext[m]; } } + break; case SRSLTE_PUCCH_FORMAT_2: if (SRSLTE_CP_ISNORM(cp)) { - if (m < 3) { + if (m < 2) { return pucch_dmrs_symbol_format2_cpnorm[m]; } } else { - if (m < 2) { + if (m < 1) { return pucch_dmrs_symbol_format2_cpext[m]; } } + break; case SRSLTE_PUCCH_FORMAT_2A: case SRSLTE_PUCCH_FORMAT_2B: - if (m < 3) { + if (m < 2) { return pucch_dmrs_symbol_format2_cpnorm[m]; } + break; + default: + fprintf(stderr, "Unsupported format %d\n", format); + return 0; } return 0; } @@ -759,21 +769,23 @@ uint32_t srslte_refsignal_srs_rb_L_cs(uint32_t bw_cfg, uint32_t nof_prb) { } uint32_t srs_Fb(srslte_refsignal_srs_cfg_t *cfg, uint32_t b, uint32_t nof_prb, uint32_t tti) { - uint32_t n_srs = tti/T_srs_table(cfg->I_srs); - uint32_t N_b = Nb[srsbwtable_idx(nof_prb)][b][cfg->bw_cfg]; - - uint32_t prod_1=1; - for (uint32_t bp=cfg->b_hop+1;bpbw_cfg]; + uint32_t Fb = 0; + uint32_t T = T_srs_table(cfg->I_srs); + if (T) { + uint32_t n_srs = tti/T; + uint32_t N_b = Nb[srsbwtable_idx(nof_prb)][b][cfg->bw_cfg]; + + uint32_t prod_1=1; + for (uint32_t bp=cfg->b_hop+1;bpbw_cfg]; + } + uint32_t prod_2 = prod_1*Nb[srsbwtable_idx(nof_prb)][b][cfg->bw_cfg]; + if ((N_b%2) == 0) { + Fb = (N_b/2)*((n_srs%prod_2)/prod_1)+((n_srs%prod_2)/prod_1/2); + } else { + Fb = (N_b/2)*(n_srs/prod_1); + } } - uint32_t prod_2 = prod_1*Nb[srsbwtable_idx(nof_prb)][b][cfg->bw_cfg]; - uint32_t Fb; - if ((N_b%2) == 0) { - Fb = (N_b/2)*((n_srs%prod_2)/prod_1)+((n_srs%prod_2)/prod_1/2); - } else { - Fb = (N_b/2)*(n_srs/prod_1); - } - return Fb; } diff --git a/srslte/lib/ch_estimation/test/chest_test_ul.c b/srslte/lib/ch_estimation/test/chest_test_ul.c index 93953dcbc..b3b2331da 100644 --- a/srslte/lib/ch_estimation/test/chest_test_ul.c +++ b/srslte/lib/ch_estimation/test/chest_test_ul.c @@ -178,7 +178,7 @@ int main(int argc, char **argv) { /* Generate random input */ bzero(input, sizeof(cf_t) * num_re); for (i=0;itail_biting ? frame_length : (frame_length + q->K - 1); if (q != NULL && input != NULL && output != NULL && frame_length > q->K + 1) { + uint32_t len = q->tail_biting ? frame_length : (frame_length + q->K - 1); if (q->tail_biting) { sr = 0; for (i=frame_length - q->K + 1; i>= 1; + ti >>= 1; } Partab[i] = cnt & 1; } diff --git a/srslte/lib/phch/cqi.c b/srslte/lib/phch/cqi.c index a19060961..df46152b0 100644 --- a/srslte/lib/phch/cqi.c +++ b/srslte/lib/phch/cqi.c @@ -129,12 +129,12 @@ bool srslte_cqi_send(uint32_t I_cqi_pmi, uint32_t tti) { } else if (I_cqi_pmi <= 1023) { return false; } - - if ((tti-N_offset)%N_p == 0) { - return true; - } else { - return false; + if (N_p) { + if ((tti-N_offset)%N_p == 0) { + return true; + } } + return false; } @@ -181,5 +181,10 @@ int srslte_cqi_hl_get_subband_size(int nof_prb) */ int srslte_cqi_hl_get_no_subbands(int nof_prb) { - return (int)ceil(nof_prb/(float)srslte_cqi_hl_get_subband_size(nof_prb)); + int hl_size = srslte_cqi_hl_get_subband_size(nof_prb); + if (hl_size > 0) { + return (int)ceil((float)nof_prb/hl_size); + } else { + return 0; + } } diff --git a/srslte/lib/phch/dci.c b/srslte/lib/phch/dci.c index b4262f857..276768c67 100644 --- a/srslte/lib/phch/dci.c +++ b/srslte/lib/phch/dci.c @@ -170,7 +170,7 @@ int srslte_dci_msg_to_ul_grant(srslte_dci_msg_t *msg, uint32_t nof_prb, ret = SRSLTE_ERROR; bzero(ul_dci, sizeof(srslte_ra_ul_dci_t)); - bzero(grant, sizeof(srslte_ra_ul_dci_t)); + bzero(grant, sizeof(srslte_ra_ul_grant_t)); if (srslte_dci_msg_unpack_pusch(msg, ul_dci, nof_prb)) { return ret; @@ -392,7 +392,7 @@ uint32_t srslte_dci_format_sizeof(srslte_dci_format_t format, uint32_t nof_prb, } uint32_t srslte_dci_format_sizeof_lut(srslte_dci_format_t format, uint32_t nof_prb) { - if (nof_prb <= 100 && format < 11) { + if (nof_prb < 101 && format < 4) { return dci_sz_table[nof_prb][format]; } else { return 0; diff --git a/srslte/lib/phch/pdcch.c b/srslte/lib/phch/pdcch.c index 8a67f8d0f..d0db566eb 100644 --- a/srslte/lib/phch/pdcch.c +++ b/srslte/lib/phch/pdcch.c @@ -275,33 +275,36 @@ int srslte_pdcch_dci_decode(srslte_pdcch_t *q, float *e, uint8_t *data, uint32_t uint16_t p_bits, crc_res; uint8_t *x; - if (q != NULL && - data != NULL && - E <= q->max_bits && - nof_bits <= SRSLTE_DCI_MAX_BITS) - { - bzero(q->rm_f, sizeof(float)*3 * (SRSLTE_DCI_MAX_BITS + 16)); - - uint32_t coded_len = 3 * (nof_bits + 16); - - /* unrate matching */ - srslte_rm_conv_rx(e, E, q->rm_f, coded_len); - - /* viterbi decoder */ - srslte_viterbi_decode_f(&q->decoder, q->rm_f, data, nof_bits + 16); + if (q != NULL) { + if (data != NULL && + E <= q->max_bits && + nof_bits <= SRSLTE_DCI_MAX_BITS) + { + bzero(q->rm_f, sizeof(float)*3 * (SRSLTE_DCI_MAX_BITS + 16)); + + uint32_t coded_len = 3 * (nof_bits + 16); + + /* unrate matching */ + srslte_rm_conv_rx(e, E, q->rm_f, coded_len); + + /* viterbi decoder */ + srslte_viterbi_decode_f(&q->decoder, q->rm_f, data, nof_bits + 16); - x = &data[nof_bits]; - p_bits = (uint16_t) srslte_bit_pack(&x, 16); - crc_res = ((uint16_t) srslte_crc_checksum(&q->crc, data, nof_bits) & 0xffff); - - if (crc) { - *crc = p_bits ^ crc_res; + x = &data[nof_bits]; + p_bits = (uint16_t) srslte_bit_pack(&x, 16); + crc_res = ((uint16_t) srslte_crc_checksum(&q->crc, data, nof_bits) & 0xffff); + + if (crc) { + *crc = p_bits ^ crc_res; + } + + return SRSLTE_SUCCESS; + } else { + fprintf(stderr, "Invalid parameters: E: %d, max_bits: %d, nof_bits: %d\n", E, q->max_bits, nof_bits); + return SRSLTE_ERROR_INVALID_INPUTS; } - - return SRSLTE_SUCCESS; } else { - fprintf(stderr, "Invalid parameters: E: %d, max_bits: %d, nof_bits: %d\n", E, q->max_bits, nof_bits); - return SRSLTE_ERROR_INVALID_INPUTS; + return SRSLTE_ERROR_INVALID_INPUTS; } } @@ -525,7 +528,7 @@ int srslte_pdcch_encode(srslte_pdcch_t *q, srslte_dci_msg_t *msg, srslte_dci_loc ret = SRSLTE_ERROR; if (location.ncce + PDCCH_FORMAT_NOF_CCE(location.L) <= q->nof_cce && - msg->nof_bits < SRSLTE_DCI_MAX_BITS) + msg->nof_bits < SRSLTE_DCI_MAX_BITS - 16) { DEBUG("Encoding DCI: Nbits: %d, E: %d, nCCE: %d, L: %d, RNTI: 0x%x\n", msg->nof_bits, e_bits, location.ncce, location.L, rnti); diff --git a/srslte/lib/phch/pdsch.c b/srslte/lib/phch/pdsch.c index 10b50bf43..174b8715a 100644 --- a/srslte/lib/phch/pdsch.c +++ b/srslte/lib/phch/pdsch.c @@ -316,19 +316,22 @@ void srslte_pdsch_free(srslte_pdsch_t *q) { */ int srslte_pdsch_cfg(srslte_pdsch_cfg_t *cfg, srslte_cell_t cell, srslte_ra_dl_grant_t *grant, uint32_t cfi, uint32_t sf_idx, uint32_t rvidx) { - - if (cfg && grant) { - memcpy(&cfg->grant, grant, sizeof(srslte_ra_dl_grant_t)); - } - if (srslte_cbsegm(&cfg->cb_segm, cfg->grant.mcs.tbs)) { - fprintf(stderr, "Error computing Codeblock segmentation for TBS=%d\n", cfg->grant.mcs.tbs); - return SRSLTE_ERROR; - } - srslte_ra_dl_grant_to_nbits(&cfg->grant, cfi, cell, sf_idx, &cfg->nbits); - cfg->sf_idx = sf_idx; - cfg->rv = rvidx; + if (cfg) { + if (grant) { + memcpy(&cfg->grant, grant, sizeof(srslte_ra_dl_grant_t)); + } + if (srslte_cbsegm(&cfg->cb_segm, cfg->grant.mcs.tbs)) { + fprintf(stderr, "Error computing Codeblock segmentation for TBS=%d\n", cfg->grant.mcs.tbs); + return SRSLTE_ERROR; + } + srslte_ra_dl_grant_to_nbits(&cfg->grant, cfi, cell, sf_idx, &cfg->nbits); + cfg->sf_idx = sf_idx; + cfg->rv = rvidx; - return SRSLTE_SUCCESS; + return SRSLTE_SUCCESS; + } else { + return SRSLTE_ERROR_INVALID_INPUTS; + } } diff --git a/srslte/lib/phch/prach.c b/srslte/lib/phch/prach.c index cf47babc5..39114ec8e 100644 --- a/srslte/lib/phch/prach.c +++ b/srslte/lib/phch/prach.c @@ -264,7 +264,7 @@ int srslte_prach_gen_seqs(srslte_prach_t *p) if(((p_*u) % p->N_zc) == 1) break; } - if(p_ >= 0 && p_ < p->N_zc/2){ + if(p_ < p->N_zc/2){ d_u = p_; }else{ d_u = p->N_zc - p_; @@ -342,8 +342,7 @@ int srslte_prach_init(srslte_prach_t *p, if(p != NULL && N_ifft_ul < 2049 && config_idx < 16 && - root_seq_index < MAX_ROOTS && - zero_corr_zone_config < 16) + root_seq_index < MAX_ROOTS) { uint32_t preamble_format = srslte_prach_get_preamble_format(config_idx); p->config_idx = config_idx; @@ -356,14 +355,29 @@ int srslte_prach_init(srslte_prach_t *p, // Determine N_zc and N_cs if(4 == preamble_format){ - p->N_zc = 139; - p->N_cs = prach_Ncs_format4[p->zczc]; + if (p->zczc < 7) { + p->N_zc = 139; + p->N_cs = prach_Ncs_format4[p->zczc]; + } else { + fprintf(stderr, "Invalid zeroCorrelationZoneConfig=%d for format4\n", p->zczc); + return SRSLTE_ERROR; + } }else{ p->N_zc = 839; if(p->hs){ - p->N_cs = prach_Ncs_restricted[p->zczc]; + if (p->zczc < 15) { + p->N_cs = prach_Ncs_restricted[p->zczc]; + } else { + fprintf(stderr, "Invalid zeroCorrelationZoneConfig=%d for restricted set\n", p->zczc); + return SRSLTE_ERROR; + } }else{ - p->N_cs = prach_Ncs_unrestricted[p->zczc]; + if (p->zczc < 16) { + p->N_cs = prach_Ncs_unrestricted[p->zczc]; + } else { + fprintf(stderr, "Invalid zeroCorrelationZoneConfig=%d\n", p->zczc); + return SRSLTE_ERROR; + } } } diff --git a/srslte/lib/phch/pucch.c b/srslte/lib/phch/pucch.c index 9c55768e1..fb2419be0 100644 --- a/srslte/lib/phch/pucch.c +++ b/srslte/lib/phch/pucch.c @@ -136,7 +136,7 @@ uint32_t get_pucch_symbol(uint32_t m, srslte_pucch_format_t format, srslte_cp_t case SRSLTE_PUCCH_FORMAT_1: case SRSLTE_PUCCH_FORMAT_1A: case SRSLTE_PUCCH_FORMAT_1B: - if (m < 5) { + if (m < 4) { if (SRSLTE_CP_ISNORM(cp)) { return pucch_symbol_format1_cpnorm[m]; } else { @@ -147,7 +147,7 @@ uint32_t get_pucch_symbol(uint32_t m, srslte_pucch_format_t format, srslte_cp_t case SRSLTE_PUCCH_FORMAT_2: case SRSLTE_PUCCH_FORMAT_2A: case SRSLTE_PUCCH_FORMAT_2B: - if (m < 6) { + if (m < 5) { if (SRSLTE_CP_ISNORM(cp)) { return pucch_symbol_format2_cpnorm[m]; } else { diff --git a/srslte/lib/phch/ra.c b/srslte/lib/phch/ra.c index f005cd9aa..3ea7b9c30 100644 --- a/srslte/lib/phch/ra.c +++ b/srslte/lib/phch/ra.c @@ -595,7 +595,10 @@ int srslte_ra_tbs_to_table_idx(uint32_t tbs, uint32_t n_prb) { if (tbs <= tbs_table[0][n_prb-1]) { return 0; } - for (idx = 0; idx < 27; idx++) { + if (tbs >= tbs_table[26][n_prb-1]) { + return 27; + } + for (idx = 0; idx < 26; idx++) { if (tbs_table[idx][n_prb-1] <= tbs && tbs_table[idx+1][n_prb-1] >= tbs) { return idx+1; } diff --git a/srslte/lib/phch/regs.c b/srslte/lib/phch/regs.c index 9c2764866..8ada33e7f 100644 --- a/srslte/lib/phch/regs.c +++ b/srslte/lib/phch/regs.c @@ -247,6 +247,10 @@ int regs_phich_init(srslte_regs_t *h) { srslte_regs_reg_t **regs_phich[3]; int ret = SRSLTE_ERROR; + for (int i=0;i<3;i++) { + regs_phich[i] = NULL; + } + switch(h->phich_res) { case SRSLTE_PHICH_R_1_6: ng = (float) 1/6; @@ -768,8 +772,10 @@ int srslte_regs_init(srslte_regs_t *h, srslte_cell_t cell) { ret = SRSLTE_SUCCESS; } clean_and_exit: - if (ret != SRSLTE_SUCCESS) { - srslte_regs_free(h); + if (h) { + if (ret != SRSLTE_SUCCESS) { + srslte_regs_free(h); + } } return ret; } diff --git a/srslte/lib/phch/sch.c b/srslte/lib/phch/sch.c index 0550a492f..0655b5cd1 100644 --- a/srslte/lib/phch/sch.c +++ b/srslte/lib/phch/sch.c @@ -58,7 +58,7 @@ float beta_cqi_offset[16] = {-1.0, -1.0, 1.125, 1.25, 1.375, 1.625, 1.750, 2.0, float srslte_sch_beta_cqi(uint32_t I_cqi) { - if (I_cqi <= 16) { + if (I_cqi < 16) { return beta_cqi_offset[I_cqi]; } else { return 0; @@ -463,7 +463,7 @@ static int decode_tb(srslte_sch_t *q, par_tx = ((uint32_t) parity[0])<<16 | ((uint32_t) parity[1])<<8 | ((uint32_t) parity[2]); if (!par_rx) { - printf("Warning: Received all-zero transport block\n\n", 0); + printf("Warning: Received all-zero transport block\n\n"); } if (par_rx == par_tx && par_rx) { diff --git a/srslte/lib/phch/test/pdsch_test_mex.c b/srslte/lib/phch/test/pdsch_test_mex.c index 699fbb1f6..9deaef2cb 100644 --- a/srslte/lib/phch/test/pdsch_test_mex.c +++ b/srslte/lib/phch/test/pdsch_test_mex.c @@ -271,7 +271,9 @@ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) if (nlhs >= 5) { mexutils_write_s(pdsch.e, &plhs[4], cfg.nbits.nof_bits, 1); } - + if (nlhs >= 6) { + mexutils_write_cf(ce[0], &plhs[5], SRSLTE_SF_LEN_RE(cell.nof_prb, cell.cp), 1); + } srslte_softbuffer_rx_free(&softbuffer); srslte_chest_dl_free(&chest); srslte_pdsch_free(&pdsch); diff --git a/srslte/lib/rf/rf_blade_imp.c b/srslte/lib/rf/rf_blade_imp.c index ee7185c88..af2916f65 100644 --- a/srslte/lib/rf/rf_blade_imp.c +++ b/srslte/lib/rf/rf_blade_imp.c @@ -478,10 +478,12 @@ int rf_blade_send_timed(void *h, if (is_end_of_burst) { meta.flags |= BLADERF_META_FLAG_TX_BURST_END; } + srslte_rf_error_t error; + bzero(&error, sizeof(srslte_rf_error_t)); + status = bladerf_sync_tx(handler->dev, handler->tx_buffer, nsamples, &meta, 2000); if (status == BLADERF_ERR_TIME_PAST) { if (blade_error_handler) { - srslte_rf_error_t error; error.type = SRSLTE_RF_ERROR_LATE; blade_error_handler(error); } else { @@ -492,7 +494,6 @@ int rf_blade_send_timed(void *h, return status; } else if (meta.status == BLADERF_META_STATUS_UNDERRUN) { if (blade_error_handler) { - srslte_rf_error_t error; error.type = SRSLTE_RF_ERROR_UNDERFLOW; blade_error_handler(error); } else { diff --git a/srslte/lib/rf/rf_uhd_imp.c b/srslte/lib/rf/rf_uhd_imp.c index 73e7af981..c0b4cc71a 100644 --- a/srslte/lib/rf/rf_uhd_imp.c +++ b/srslte/lib/rf/rf_uhd_imp.c @@ -62,6 +62,8 @@ srslte_rf_error_handler_t uhd_error_handler = NULL; void msg_handler(const char *msg) { srslte_rf_error_t error; + bzero(&error, sizeof(srslte_rf_error_t)); + if(0 == strcmp(msg, "O")) { error.type = SRSLTE_RF_ERROR_OVERFLOW; } else if(0 == strcmp(msg, "D")) { diff --git a/srslte/lib/sync/cfo.c b/srslte/lib/sync/cfo.c index 84997dc3f..f9304576a 100644 --- a/srslte/lib/sync/cfo.c +++ b/srslte/lib/sync/cfo.c @@ -62,7 +62,7 @@ void srslte_cfo_free(srslte_cfo_t *h) { if (h->cur_cexp) { free(h->cur_cexp); } - bzero(h, sizeof(cf_t)); + bzero(h, sizeof(srslte_cfo_t)); } void srslte_cfo_set_tol(srslte_cfo_t *h, float tol) { diff --git a/srslte/lib/sync/pss.c b/srslte/lib/sync/pss.c index 16efa4f1b..f7edbb353 100644 --- a/srslte/lib/sync/pss.c +++ b/srslte/lib/sync/pss.c @@ -94,6 +94,8 @@ int srslte_pss_synch_init_fft_offset(srslte_pss_synch_t *q, uint32_t frame_size, if (q != NULL) { + ret = SRSLTE_ERROR; + uint32_t N_id_2; uint32_t buffer_size; bzero(q, sizeof(srslte_pss_synch_t)); diff --git a/srslte/lib/sync/sss.c b/srslte/lib/sync/sss.c index d64c0db1d..27818866a 100644 --- a/srslte/lib/sync/sss.c +++ b/srslte/lib/sync/sss.c @@ -139,14 +139,15 @@ uint32_t srslte_sss_synch_subframe(uint32_t m0, uint32_t m1) { /** Returns the N_id_1 value based on the m0 and m1 values */ int srslte_sss_synch_N_id_1(srslte_sss_synch_t *q, uint32_t m0, uint32_t m1) { - if (m0==m1 || m0 > 30 || m1 > 30) { - return SRSLTE_ERROR; - } - int N_id_1; + int N_id_1 = -1; if (m1 > m0) { - N_id_1 = q->N_id_1_table[m0][m1 - 1]; + if (m0 < 30 && m1 - 1 < 30) { + N_id_1 = q->N_id_1_table[m0][m1 - 1]; + } } else { - N_id_1 = q->N_id_1_table[m1][m0 - 1]; + if (m1 < 30 && m0 - 1 < 30) { + N_id_1 = q->N_id_1_table[m1][m0 - 1]; + } } return N_id_1; } diff --git a/srslte/lib/sync/sync.c b/srslte/lib/sync/sync.c index 41a4c5efc..df44ed77b 100644 --- a/srslte/lib/sync/sync.c +++ b/srslte/lib/sync/sync.c @@ -79,7 +79,7 @@ int srslte_sync_init(srslte_sync_t *q, uint32_t frame_size, uint32_t max_offset, } // Set a CFO tolerance of approx 100 Hz - srslte_cfo_set_tol(&q->cfocorr, 100/(15000*q->fft_size)); + srslte_cfo_set_tol(&q->cfocorr, 100.0/(15000.0*q->fft_size)); for (int i=0;i<2;i++) { q->cfo_i_corr[i] = srslte_vec_malloc(sizeof(cf_t)*q->frame_size); @@ -398,8 +398,11 @@ srslte_sync_find_ret_t srslte_sync_find(srslte_sync_t *q, cf_t *input, uint32_t srslte_sync_find_ret_t ret = SRSLTE_SYNC_ERROR; - if (q != NULL && - input != NULL && + if (!q) { + return SRSLTE_ERROR_INVALID_INPUTS; + } + + if (input != NULL && srslte_N_id_2_isvalid(q->N_id_2) && fft_size_isvalid(q->fft_size)) { diff --git a/srslte/lib/ue/ue_sync.c b/srslte/lib/ue/ue_sync.c index d04c5c303..7a9b7cb64 100644 --- a/srslte/lib/ue/ue_sync.c +++ b/srslte/lib/ue/ue_sync.c @@ -44,7 +44,7 @@ cf_t dummy[MAX_TIME_OFFSET]; #define TRACK_MAX_LOST 4 #define TRACK_FRAME_SIZE 32 #define FIND_NOF_AVG_FRAMES 4 -#define DEFAULT_SAMPLE_OFFSET_CORRECT_PERIOD 5 +#define DEFAULT_SAMPLE_OFFSET_CORRECT_PERIOD 0 #define DEFAULT_SFO_EMA_COEFF 0.1 cf_t dummy_offset_buffer[1024*1024]; @@ -358,7 +358,6 @@ static int track_peak_ok(srslte_ue_sync_t *q, uint32_t track_idx) { { INFO("Warning: Expected SF idx %d but got %d! (%d frames)\n", q->sf_idx, srslte_sync_get_sf_idx(&q->strack), q->frame_no_cnt); - q->sf_idx = srslte_sync_get_sf_idx(&q->strack); q->frame_no_cnt++; if (q->frame_no_cnt >= TRACK_MAX_LOST) { INFO("\n%d frames lost. Going back to FIND\n", (int) q->frame_no_cnt); diff --git a/srslte/lib/ue/ue_ul.c b/srslte/lib/ue/ue_ul.c index 1e5d7a51f..1d8a371e4 100644 --- a/srslte/lib/ue/ue_ul.c +++ b/srslte/lib/ue/ue_ul.c @@ -434,12 +434,14 @@ int srslte_ue_ul_pusch_encode_rnti_softbuffer(srslte_ue_ul_t *q, { int ret = SRSLTE_ERROR_INVALID_INPUTS; - bzero(q->sf_symbols, sizeof(cf_t)*SRSLTE_SF_LEN_RE(q->cell.nof_prb, q->cell.cp)); if (q != NULL && softbuffer != NULL && output_signal != NULL) { + + bzero(q->sf_symbols, sizeof(cf_t)*SRSLTE_SF_LEN_RE(q->cell.nof_prb, q->cell.cp)); + if (srslte_pusch_uci_encode_rnti(&q->pusch, &q->pusch_cfg, softbuffer, data, uci_data, rnti, q->sf_symbols)) { fprintf(stderr, "Error encoding TB\n"); return ret;