/** * Copyright 2013-2023 Software Radio Systems Limited * * This file is part of srsRAN. * * srsRAN is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * * srsRAN is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * A copy of the GNU Affero General Public License can be found in * the LICENSE file in the top-level directory of this distribution * and at http://www.gnu.org/licenses/. * */ /****************************************************************************** * File: npss.h * * Description: Narrowband Primary synchronization signal (NPSS) generation and detection. * * The srsran_npss_synch_t object provides functions for fast * computation of the crosscorrelation between the NPSS and received * signal and CFO estimation. Also, the function srsran_npss_synch_tperiodic() * is designed to be called periodically every subframe, taking * care of the correct data alignment with respect to the NPSS sequence. * * The object is designed to work with signals sampled at ?.? Mhz * centered at the carrier frequency. Thus, downsampling is required * if the signal is sampled at higher frequencies. * * Reference: 3GPP TS 36.211 version 13.2.0 Release 13 Sec. 10.x.x *****************************************************************************/ #ifndef SRSRAN_NPSS_H #define SRSRAN_NPSS_H #include #include #include "srsran/config.h" #include "srsran/phy/common/phy_common.h" #include "srsran/phy/utils/convolution.h" #define CONVOLUTION_FFT #define SRSRAN_NPSS_RETURN_PSR #define SRSRAN_NPSS_LEN 11 #define SRSRAN_NPSS_NUM_OFDM_SYMS 11 #define SRSRAN_NPSS_TOT_LEN (SRSRAN_NPSS_LEN * SRSRAN_NPSS_NUM_OFDM_SYMS) #define SRSRAN_NPSS_CORR_FILTER_LEN \ ((SRSRAN_NPSS_NUM_OFDM_SYMS * SRSRAN_NBIOT_FFT_SIZE) + \ (SRSRAN_NPSS_NUM_OFDM_SYMS - 1) * SRSRAN_CP_LEN_NORM(1, SRSRAN_NBIOT_FFT_SIZE) + \ SRSRAN_CP_LEN_NORM(0, SRSRAN_NBIOT_FFT_SIZE)) // The below value corresponds to the time-domain representation of the first // three OFDM-symbols plus cyclic prefix that are not transmitted in the sub-frame // carrying the NPSS #define SRSRAN_NPSS_CORR_OFFSET (SRSRAN_SF_LEN(SRSRAN_NBIOT_FFT_SIZE) - SRSRAN_NPSS_CORR_FILTER_LEN) // CFO estimation based on the NPSS is done using the second slot of the sub-frame #define SRSRAN_NPSS_CFO_OFFSET (SRSRAN_SF_LEN(SRSRAN_NBIOT_FFT_SIZE) / 2 - SRSRAN_NPSS_CORR_OFFSET) #define SRSRAN_NPSS_CFO_NUM_SYMS 6 // number of symbols for CFO estimation #define SRSRAN_NPSS_CFO_NUM_SAMPS \ ((SRSRAN_NPSS_CFO_NUM_SYMS * SRSRAN_NBIOT_FFT_SIZE) + \ (SRSRAN_NPSS_CFO_NUM_SYMS - 1) * SRSRAN_CP_LEN_NORM(1, SRSRAN_NBIOT_FFT_SIZE) + \ SRSRAN_CP_LEN_NORM(0, SRSRAN_NBIOT_FFT_SIZE)) // resulting number of samples // NPSS processing options #define SRSRAN_NPSS_ACCUMULATE_ABS // If enabled, accumulates the correlation absolute value on consecutive calls to // srsran_pss_synch_find_pss #define SRSRAN_NPSS_ABS_SQUARE // If enabled, compute abs square, otherwise computes absolute value only #define SRSRAN_NPSS_RETURN_PSR // If enabled returns peak to side-lobe ratio, otherwise returns absolute peak value /* Low-level API */ typedef struct SRSRAN_API { #ifdef CONVOLUTION_FFT srsran_conv_fft_cc_t conv_fft; #endif uint32_t frame_size, max_frame_size; uint32_t fft_size, max_fft_size; cf_t* npss_signal_time; cf_t* tmp_input; cf_t* conv_output; float* conv_output_abs; float ema_alpha; float* conv_output_avg; float peak_value; } srsran_npss_synch_t; // Basic functionality SRSRAN_API int srsran_npss_synch_init(srsran_npss_synch_t* q, uint32_t frame_size, uint32_t fft_size); SRSRAN_API void srsran_npss_synch_reset(srsran_npss_synch_t* q); SRSRAN_API int srsran_npss_synch_resize(srsran_npss_synch_t* q, uint32_t frame_size, uint32_t fft_size); SRSRAN_API void srsran_npss_synch_set_ema_alpha(srsran_npss_synch_t* q, float alpha); SRSRAN_API void srsran_npss_synch_free(srsran_npss_synch_t* q); SRSRAN_API int srsran_npss_sync_find(srsran_npss_synch_t* q, cf_t* input, float* corr_peak_value); // Internal functions SRSRAN_API int srsran_npss_corr_init(cf_t* npss_signal_time, uint32_t fft_size, uint32_t frame_size); SRSRAN_API int srsran_npss_generate(cf_t* signal); SRSRAN_API void srsran_npss_put_subframe(srsran_npss_synch_t* q, cf_t* npss_signal, cf_t* sf, const uint32_t nof_prb, const uint32_t nbiot_prb_offset); #endif // SRSRAN_NPSS_H