srsLTE/lib/include/srsran/phy/sync/sync.h

218 lines
7.3 KiB
C
Raw Normal View History

/**
*
* \section COPYRIGHT
*
2021-03-19 03:45:56 -07:00
* Copyright 2013-2021 Software Radio Systems Limited
2014-01-28 03:41:17 -08:00
*
* By using this file, you agree to the terms and conditions set
* forth in the LICENSE file which can be found at the top level of
* the distribution.
*
2014-01-28 03:41:17 -08:00
*/
/******************************************************************************
* File: sync.h
*
* Description: Time and frequency synchronization using the PSS and SSS signals.
*
* The object is designed to work with signals sampled at 1.92 Mhz
* centered at the carrier frequency. Thus, downsampling is required
* if the signal is sampled at higher frequencies.
*
* Correlation peak is detected comparing the maximum at the output
* of the correlator with a threshold. The comparison accepts two
* modes: absolute value or peak-to-mean ratio, which are configured
* with the functions sync_pss_det_absolute() and sync_pss_det_peakmean().
*
*
* Reference: 3GPP TS 36.211 version 10.0.0 Release 10 Sec. 6.11.1, 6.11.2
*****************************************************************************/
2021-03-19 03:45:56 -07:00
#ifndef SRSRAN_SYNC_H
#define SRSRAN_SYNC_H
2014-01-28 03:41:17 -08:00
#include <math.h>
#include <stdbool.h>
2014-03-27 09:31:25 -07:00
2021-03-19 03:45:56 -07:00
#include "srsran/config.h"
#include "srsran/phy/sync/cfo.h"
#include "srsran/phy/sync/cp.h"
#include "srsran/phy/sync/pss.h"
#include "srsran/phy/sync/sss.h"
2014-01-28 03:41:17 -08:00
2021-03-19 03:45:56 -07:00
#define SRSRAN_SYNC_FFT_SZ_MIN 64
#define SRSRAN_SYNC_FFT_SZ_MAX 2048
typedef enum { SSS_DIFF = 0, SSS_PARTIAL_3 = 2, SSS_FULL = 1 } sss_alg_t;
2014-12-09 15:29:48 -08:00
2021-03-19 03:45:56 -07:00
typedef struct SRSRAN_API {
srsran_pss_t pss;
srsran_pss_t pss_i[2];
srsran_sss_t sss;
srsran_cp_synch_t cp_synch;
cf_t* cfo_i_corr[2];
int decimate;
float threshold;
float peak_value;
uint32_t N_id_2;
uint32_t N_id_1;
uint32_t sf_idx;
uint32_t fft_size;
uint32_t frame_size;
uint32_t max_offset;
uint32_t nof_symbols;
uint32_t cp_len;
float current_cfo_tol;
sss_alg_t sss_alg;
bool detect_cp;
bool sss_en;
2021-03-19 03:45:56 -07:00
srsran_cp_t cp;
uint32_t m0;
uint32_t m1;
float m0_value;
float m1_value;
float M_norm_avg;
float M_ext_avg;
cf_t* temp;
uint32_t max_frame_size;
2021-03-19 03:45:56 -07:00
srsran_frame_type_t frame_type;
2019-04-23 01:53:11 -07:00
bool detect_frame_type;
// variables for various CFO estimation methods
bool cfo_cp_enable;
bool cfo_pss_enable;
bool cfo_i_enable;
bool cfo_cp_is_set;
bool cfo_pss_is_set;
bool cfo_i_initiated;
float cfo_cp_mean;
float cfo_pss;
float cfo_pss_mean;
int cfo_i_value;
float cfo_ema_alpha;
uint32_t cfo_cp_nsymbols;
2021-03-19 03:45:56 -07:00
srsran_cfo_t cfo_corr_frame;
srsran_cfo_t cfo_corr_symbol;
bool sss_channel_equalize;
bool pss_filtering_enabled;
2021-03-19 03:45:56 -07:00
cf_t sss_filt[SRSRAN_SYMBOL_SZ_MAX];
cf_t pss_filt[SRSRAN_SYMBOL_SZ_MAX];
2019-04-23 01:53:11 -07:00
bool sss_generated;
bool sss_detected;
bool sss_available;
float sss_corr;
2021-03-19 03:45:56 -07:00
srsran_dft_plan_t idftp_sss;
cf_t sss_recv[SRSRAN_SYMBOL_SZ_MAX];
cf_t sss_signal[2][SRSRAN_SYMBOL_SZ_MAX];
2019-04-23 01:53:11 -07:00
2021-03-19 03:45:56 -07:00
} srsran_sync_t;
2014-01-28 03:41:17 -08:00
typedef enum {
2021-03-19 03:45:56 -07:00
SRSRAN_SYNC_FOUND = 1,
SRSRAN_SYNC_FOUND_NOSPACE = 2,
SRSRAN_SYNC_NOFOUND = 0,
SRSRAN_SYNC_ERROR = -1
} srsran_sync_find_ret_t;
2014-03-27 09:31:25 -07:00
2021-03-19 03:45:56 -07:00
SRSRAN_API int srsran_sync_init(srsran_sync_t* q, uint32_t frame_size, uint32_t max_offset, uint32_t fft_size);
2021-03-19 03:45:56 -07:00
SRSRAN_API int
srsran_sync_init_decim(srsran_sync_t* q, uint32_t frame_size, uint32_t max_offset, uint32_t fft_size, int decimate);
2021-03-19 03:45:56 -07:00
SRSRAN_API void srsran_sync_free(srsran_sync_t* q);
2021-03-19 03:45:56 -07:00
SRSRAN_API int srsran_sync_resize(srsran_sync_t* q, uint32_t frame_size, uint32_t max_offset, uint32_t fft_size);
2014-03-27 09:31:25 -07:00
2021-03-19 03:45:56 -07:00
SRSRAN_API void srsran_sync_reset(srsran_sync_t* q);
/* Finds a correlation peak in the input signal around position find_offset */
2021-03-19 03:45:56 -07:00
SRSRAN_API srsran_sync_find_ret_t srsran_sync_find(srsran_sync_t* q,
const cf_t* input,
uint32_t find_offset,
uint32_t* peak_position);
2014-12-09 15:29:48 -08:00
/* Estimates the CP length */
2021-03-19 03:45:56 -07:00
SRSRAN_API srsran_cp_t srsran_sync_detect_cp(srsran_sync_t* q, const cf_t* input, uint32_t peak_pos);
2014-12-09 15:29:48 -08:00
2014-03-27 09:31:25 -07:00
/* Sets the threshold for peak comparison */
2021-03-19 03:45:56 -07:00
SRSRAN_API void srsran_sync_set_threshold(srsran_sync_t* q, float threshold);
/* Gets the subframe idx (0 or 5) */
2021-03-19 03:45:56 -07:00
SRSRAN_API uint32_t srsran_sync_get_sf_idx(srsran_sync_t* q);
2014-03-27 09:31:25 -07:00
/* Gets the peak value */
2021-03-19 03:45:56 -07:00
SRSRAN_API float srsran_sync_get_peak_value(srsran_sync_t* q);
2014-12-09 15:29:48 -08:00
/* Choose SSS detection algorithm */
2021-03-19 03:45:56 -07:00
SRSRAN_API void srsran_sync_set_sss_algorithm(srsran_sync_t* q, sss_alg_t alg);
2014-12-09 15:29:48 -08:00
/* Sets PSS exponential averaging alpha weight */
2021-03-19 03:45:56 -07:00
SRSRAN_API void srsran_sync_set_em_alpha(srsran_sync_t* q, float alpha);
/* Sets the N_id_2 to search for */
2021-03-19 03:45:56 -07:00
SRSRAN_API int srsran_sync_set_N_id_2(srsran_sync_t* q, uint32_t N_id_2);
2021-03-19 03:45:56 -07:00
SRSRAN_API int srsran_sync_set_N_id_1(srsran_sync_t* q, uint32_t N_id_1);
2019-04-23 01:53:11 -07:00
2014-03-27 09:31:25 -07:00
/* Gets the Physical CellId from the last call to synch_run() */
2021-03-19 03:45:56 -07:00
SRSRAN_API int srsran_sync_get_cell_id(srsran_sync_t* q);
/* Enables/disables filtering of the central PRBs before PSS CFO estimation or SSS correlation*/
2021-03-19 03:45:56 -07:00
SRSRAN_API void srsran_sync_set_pss_filt_enable(srsran_sync_t* q, bool enable);
2021-03-19 03:45:56 -07:00
SRSRAN_API void srsran_sync_set_sss_eq_enable(srsran_sync_t* q, bool enable);
2014-03-27 09:31:25 -07:00
/* Gets the CFO estimation from the last call to synch_run() */
2021-03-19 03:45:56 -07:00
SRSRAN_API float srsran_sync_get_cfo(srsran_sync_t* q);
/* Resets internal CFO state */
2021-03-19 03:45:56 -07:00
SRSRAN_API void srsran_sync_cfo_reset(srsran_sync_t* q, float cfo_Hz);
/* Copies CFO internal state from another object to avoid long transients */
2021-03-19 03:45:56 -07:00
SRSRAN_API void srsran_sync_copy_cfo(srsran_sync_t* q, srsran_sync_t* src_obj);
/* Enable different CFO estimation stages */
2021-03-19 03:45:56 -07:00
SRSRAN_API void srsran_sync_set_cfo_i_enable(srsran_sync_t* q, bool enable);
SRSRAN_API void srsran_sync_set_cfo_cp_enable(srsran_sync_t* q, bool enable, uint32_t nof_symbols);
2021-03-19 03:45:56 -07:00
SRSRAN_API void srsran_sync_set_cfo_pss_enable(srsran_sync_t* q, bool enable);
/* Sets CFO correctors tolerance (in Hz) */
2021-03-19 03:45:56 -07:00
SRSRAN_API void srsran_sync_set_cfo_tol(srsran_sync_t* q, float tol);
2015-11-10 08:13:08 -08:00
2021-03-19 03:45:56 -07:00
SRSRAN_API void srsran_sync_set_frame_type(srsran_sync_t* q, srsran_frame_type_t frame_type);
2019-04-23 01:53:11 -07:00
/* Sets the exponential moving average coefficient for CFO averaging */
2021-03-19 03:45:56 -07:00
SRSRAN_API void srsran_sync_set_cfo_ema_alpha(srsran_sync_t* q, float alpha);
2014-03-27 09:31:25 -07:00
/* Gets the CP length estimation from the last call to synch_run() */
2021-03-19 03:45:56 -07:00
SRSRAN_API srsran_cp_t srsran_sync_get_cp(srsran_sync_t* q);
/* Sets the CP length estimation (must do it if disabled) */
2021-03-19 03:45:56 -07:00
SRSRAN_API void srsran_sync_set_cp(srsran_sync_t* q, srsran_cp_t cp);
/* Enables/Disables SSS detection */
2021-03-19 03:45:56 -07:00
SRSRAN_API void srsran_sync_sss_en(srsran_sync_t* q, bool enabled);
2021-03-19 03:45:56 -07:00
SRSRAN_API srsran_pss_t* srsran_sync_get_cur_pss_obj(srsran_sync_t* q);
2021-03-19 03:45:56 -07:00
SRSRAN_API bool srsran_sync_sss_detected(srsran_sync_t* q);
2021-03-19 03:45:56 -07:00
SRSRAN_API float srsran_sync_sss_correlation_peak(srsran_sync_t* q);
2021-03-19 03:45:56 -07:00
SRSRAN_API bool srsran_sync_sss_available(srsran_sync_t* q);
2019-04-23 01:53:11 -07:00
/* Enables/Disables CP detection */
2021-03-19 03:45:56 -07:00
SRSRAN_API void srsran_sync_cp_en(srsran_sync_t* q, bool enabled);
2014-01-28 03:41:17 -08:00
2021-03-19 03:45:56 -07:00
#endif // SRSRAN_SYNC_H