/* Free DFT plans for transform precoding */ void srslte_dft_precoding_free(srslte_dft_precoding_t *q) { for (uint32_t i=1;i<=q->max_prb;i++) { if(srslte_dft_precoding_valid_prb(i)) { srslte_dft_plan_free(&q->dft_plan[i]); srslte_dft_plan_free(&q->idft_plan[i]); } } bzero(q, sizeof(srslte_dft_precoding_t)); }
int srslte_pss_synch_init_N_id_2(cf_t *pss_signal_freq, cf_t *pss_signal_time, uint32_t N_id_2, uint32_t fft_size, int cfo_i) { srslte_dft_plan_t plan; cf_t pss_signal_pad[2048]; int ret = SRSLTE_ERROR_INVALID_INPUTS; if (srslte_N_id_2_isvalid(N_id_2) && fft_size <= 2048) { srslte_pss_generate(pss_signal_freq, N_id_2); bzero(pss_signal_pad, fft_size * sizeof(cf_t)); bzero(pss_signal_time, fft_size * sizeof(cf_t)); memcpy(&pss_signal_pad[(fft_size-SRSLTE_PSS_LEN)/2+cfo_i], pss_signal_freq, SRSLTE_PSS_LEN * sizeof(cf_t)); /* Convert signal into the time domain */ if (srslte_dft_plan(&plan, fft_size, SRSLTE_DFT_BACKWARD, SRSLTE_DFT_COMPLEX)) { return SRSLTE_ERROR; } srslte_dft_plan_set_mirror(&plan, true); srslte_dft_plan_set_dc(&plan, true); srslte_dft_plan_set_norm(&plan, true); srslte_dft_run_c(&plan, pss_signal_pad, pss_signal_time); srslte_vec_conj_cc(pss_signal_time, pss_signal_time, fft_size); srslte_vec_sc_prod_cfc(pss_signal_time, 1.0/SRSLTE_PSS_LEN, pss_signal_time, fft_size); srslte_dft_plan_free(&plan); ret = SRSLTE_SUCCESS; } return ret; }
void srslte_conv_fft_cc_free(srslte_conv_fft_cc_t *q) { if (q->input_fft) { free(q->input_fft); } if (q->filter_fft) { free(q->filter_fft); } if (q->output_fft) { free(q->output_fft); } srslte_dft_plan_free(&q->input_plan); srslte_dft_plan_free(&q->filter_plan); srslte_dft_plan_free(&q->output_plan); bzero(q, sizeof(srslte_conv_fft_cc_t)); }
void srslte_pss_free(srslte_pss_t *q) { uint32_t i; if (q) { for (i=0;i<3;i++) { if (q->pss_signal_time[i]) { free(q->pss_signal_time[i]); } if(q->pss_signal_freq_full[i]){ free(q->pss_signal_freq_full[i]); } } #ifdef CONVOLUTION_FFT srslte_conv_fft_cc_free(&q->conv_fft); #endif if (q->tmp_input) { free(q->tmp_input); } if (q->conv_output) { free(q->conv_output); } if (q->conv_output_abs) { free(q->conv_output_abs); } if (q->conv_output_avg) { free(q->conv_output_avg); } srslte_dft_plan_free(&q->dftp_input); srslte_dft_plan_free(&q->idftp_input); if(q->decimate > 1) { srslte_filt_decim_cc_free(&q->filter); free(q->filter.filter_output); free(q->filter.downsampled_input); } bzero(q, sizeof(srslte_pss_t)); } }
void srslte_ofdm_free_(srslte_ofdm_t *q) { srslte_dft_plan_free(&q->fft_plan); if (q->tmp) { free(q->tmp); } if (q->shift_buffer) { free(q->shift_buffer); } bzero(q, sizeof(srslte_ofdm_t)); }
int srslte_prach_free(srslte_prach_t *p) { free(p->prach_bins); free(p->corr_spec); free(p->corr); srslte_dft_plan_free(p->ifft); free(p->ifft); free(p->ifft_in); free(p->ifft_out); srslte_dft_plan_free(p->fft); free(p->fft); srslte_dft_plan_free(p->zc_fft); free(p->zc_fft); srslte_dft_plan_free(p->zc_ifft); free(p->zc_ifft); bzero(p, sizeof(srslte_prach_t)); return 0; }
int srslte_sss_synch_realloc(srslte_sss_synch_t *q, uint32_t fft_size) { if (q != NULL && fft_size <= 2048) { srslte_dft_plan_free(&q->dftp_input); if (srslte_dft_plan(&q->dftp_input, fft_size, SRSLTE_DFT_FORWARD, SRSLTE_DFT_COMPLEX)) { srslte_sss_synch_free(q); return SRSLTE_ERROR; } srslte_dft_plan_set_mirror(&q->dftp_input, true); srslte_dft_plan_set_norm(&q->dftp_input, true); srslte_dft_plan_set_dc(&q->dftp_input, true); q->fft_size = fft_size; return SRSLTE_SUCCESS; } return SRSLTE_ERROR_INVALID_INPUTS; }
void srslte_sss_synch_free(srslte_sss_synch_t *q) { srslte_dft_plan_free(&q->dftp_input); bzero(q, sizeof(srslte_sss_synch_t)); }