|
|
|
/**
|
|
|
|
*
|
|
|
|
* \section COPYRIGHT
|
|
|
|
*
|
|
|
|
* Copyright 2013-2021 Software Radio Systems Limited
|
|
|
|
*
|
|
|
|
* 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.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef SRSRAN_UE_SYNC_NR_H
|
|
|
|
#define SRSRAN_UE_SYNC_NR_H
|
|
|
|
|
|
|
|
#include "srsran/phy/common/timestamp.h"
|
|
|
|
#include "srsran/phy/sync/ssb.h"
|
|
|
|
|
|
|
|
#define SRSRAN_RECV_CALLBACK_TEMPLATE(NAME) int (*NAME)(void*, cf_t**, uint32_t, srsran_timestamp_t*)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Describes NR UE synchronization object internal states
|
|
|
|
*/
|
|
|
|
typedef enum SRSRAN_API {
|
|
|
|
SRSRAN_UE_SYNC_NR_STATE_IDLE = 0, ///< Initial state, the object has no configuration
|
|
|
|
SRSRAN_UE_SYNC_NR_STATE_FIND, ///< State just after configuring, baseband is not aligned
|
|
|
|
SRSRAN_UE_SYNC_NR_STATE_TRACK ///< Baseband is aligned with subframes
|
|
|
|
} srsran_ue_sync_nr_state_t;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Describes a UE sync NR object arguments
|
|
|
|
*/
|
|
|
|
typedef struct SRSRAN_API {
|
|
|
|
// Memory allocation constraints
|
|
|
|
double max_srate_hz; ///< Maximum sampling rate in Hz, set to zero to use default
|
|
|
|
srsran_subcarrier_spacing_t min_scs; ///< Minimum subcarrier spacing
|
|
|
|
uint32_t nof_rx_channels; ///< Number of receive channels, set to 0 for 1
|
|
|
|
|
|
|
|
// Enable/Disable features
|
|
|
|
bool disable_cfo; ///< Set to true for disabling the CFO compensation close loop
|
|
|
|
|
|
|
|
// Signal detection thresholds and averaging coefficients
|
|
|
|
float pbch_dmrs_thr; ///< NR-PBCH DMRS threshold for blind decoding, set to 0 for default
|
|
|
|
float cfo_alpha; ///< Exponential Moving Average (EMA) alpha coefficient for CFO
|
|
|
|
|
|
|
|
// Receive callback
|
|
|
|
void* recv_obj; ///< Receive object
|
|
|
|
SRSRAN_RECV_CALLBACK_TEMPLATE(recv_callback); ///< Receive callback
|
|
|
|
} srsran_ue_sync_nr_args_t;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Describes a UE sync NR object configuration
|
|
|
|
*/
|
|
|
|
typedef struct SRSRAN_API {
|
|
|
|
srsran_ssb_cfg_t ssb; ///< SSB configuration
|
|
|
|
uint32_t N_id; ///< Physical cell identifier
|
|
|
|
} srsran_ue_sync_nr_cfg_t;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Describes a UE sync NR object
|
|
|
|
*/
|
|
|
|
typedef struct SRSRAN_API {
|
|
|
|
// State
|
|
|
|
srsran_ue_sync_nr_state_t state; ///< Internal state
|
|
|
|
int32_t next_rf_sample_offset; ///< Next RF sample offset
|
|
|
|
uint32_t ssb_idx; ///< Tracking SSB candidate index
|
|
|
|
uint32_t sf_idx; ///< Current subframe index (0-9)
|
|
|
|
uint32_t sfn; ///< Current system frame number (0-1023)
|
|
|
|
srsran_csi_trs_measurements_t feedback; ///< Feedback measurements
|
|
|
|
|
|
|
|
// Components
|
|
|
|
srsran_ssb_t ssb; ///< SSB internal object
|
|
|
|
cf_t** tmp_buffer; ///< Temporal buffer pointers
|
|
|
|
|
|
|
|
// Initialised arguments
|
|
|
|
uint32_t nof_rx_channels; ///< Number of receive channels
|
|
|
|
bool disable_cfo; ///< Set to true for disabling the CFO compensation close loop
|
|
|
|
float cfo_alpha; ///< Exponential Moving Average (EMA) alpha coefficient for CFO
|
|
|
|
void* recv_obj; ///< Receive object
|
|
|
|
SRSRAN_RECV_CALLBACK_TEMPLATE(recv_callback); ///< Receive callback
|
|
|
|
|
|
|
|
// Current configuration
|
|
|
|
uint32_t N_id; ///< Current physical cell identifier
|
|
|
|
double srate_hz; ///< Current sampling rate in Hz
|
|
|
|
uint32_t sf_sz; ///< Current subframe size
|
|
|
|
|
|
|
|
// Metrics
|
|
|
|
float cfo_hz; ///< Current CFO in Hz
|
|
|
|
float avg_delay_us; ///< Current average delay
|
|
|
|
} srsran_ue_sync_nr_t;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Describes a UE sync NR zerocopy outcome
|
|
|
|
*/
|
|
|
|
typedef struct SRSRAN_API {
|
|
|
|
bool in_sync; ///< Indicates whether the received baseband is synchronized
|
|
|
|
uint32_t sf_idx; ///< Subframe index
|
|
|
|
uint32_t sfn; ///< System Frame Number
|
|
|
|
srsran_timestamp_t timestamp; ///< Last received timestamp
|
|
|
|
float cfo_hz; ///< Current CFO in Hz
|
|
|
|
float delay_us; ///< Current average delay in microseconds
|
|
|
|
} srsran_ue_sync_nr_outcome_t;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Initialises a UE sync NR object
|
|
|
|
* @param q NR UE synchronization object
|
|
|
|
* @param[in] args NR UE synchronization initialization arguments
|
|
|
|
* @return SRSRAN_SUCCESS if no error occurs, SRSRAN_ERROR code otherwise
|
|
|
|
*/
|
|
|
|
SRSRAN_API int srsran_ue_sync_nr_init(srsran_ue_sync_nr_t* q, const srsran_ue_sync_nr_args_t* args);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Deallocate an NR UE synchronization object
|
|
|
|
* @param q NR UE synchronization object
|
|
|
|
*/
|
|
|
|
SRSRAN_API void srsran_ue_sync_nr_free(srsran_ue_sync_nr_t* q);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Configures a UE sync NR object
|
|
|
|
* @param q NR UE synchronization object
|
|
|
|
* @param[in] cfg NR UE synchronization configuration
|
|
|
|
* @return SRSRAN_SUCCESS if no error occurs, SRSRAN_ERROR code otherwise
|
|
|
|
*/
|
|
|
|
SRSRAN_API int srsran_ue_sync_nr_set_cfg(srsran_ue_sync_nr_t* q, const srsran_ue_sync_nr_cfg_t* cfg);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Runs the NR UE synchronization object, tries to find and track the configured SSB leaving in buffer the
|
|
|
|
* received baseband subframe
|
|
|
|
* @param q NR UE synchronization object
|
|
|
|
* @param buffer 2D complex buffer
|
|
|
|
* @param outcome zerocopy outcome
|
|
|
|
* @return SRSRAN_SUCCESS if no error occurs, SRSRAN_ERROR code otherwise
|
|
|
|
*/
|
|
|
|
SRSRAN_API int srsran_ue_sync_nr_zerocopy(srsran_ue_sync_nr_t* q, cf_t** buffer, srsran_ue_sync_nr_outcome_t* outcome);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Feedback Channel State Information from Tracking Reference Signals into a UE synchronization object
|
|
|
|
* @param q NR UE synchronization object
|
|
|
|
* @param measurements CSI-TRS feedback measurement
|
|
|
|
* @return SRSRAN_SUCCESS if no error occurs, SRSRAN_ERROR code otherwise
|
|
|
|
*/
|
|
|
|
SRSRAN_API int srsran_ue_sync_nr_feedback(srsran_ue_sync_nr_t* q, const srsran_csi_trs_measurements_t* measurements);
|
|
|
|
|
|
|
|
#endif // SRSRAN_UE_SYNC_NR_H
|