mirror of https://github.com/pvnis/srsRAN_4G.git
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
3.9 KiB
C
119 lines
3.9 KiB
C
3 years ago
|
/**
|
||
|
*
|
||
|
* \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_CFR_H
|
||
|
#define SRSRAN_CFR_H
|
||
|
|
||
|
#include "srsran/config.h"
|
||
|
#include "srsran/phy/common/phy_common.h"
|
||
|
#include "srsran/phy/dft/dft.h"
|
||
|
|
||
|
#define CFR_EMA_INIT_AVG_PWR 0.1
|
||
|
|
||
|
/**
|
||
|
* @brief CFR manual threshold or PAPR limiting with Moving Average or EMA power averaging
|
||
|
*/
|
||
|
typedef enum SRSRAN_API {
|
||
|
SRSRAN_CFR_THR_MANUAL = 1,
|
||
|
SRSRAN_CFR_THR_AUTO_CMA = 2,
|
||
|
SRSRAN_CFR_THR_AUTO_EMA = 3
|
||
|
} srsran_cfr_mode_t;
|
||
|
|
||
|
/**
|
||
|
* @brief CFR module configuration arguments
|
||
|
*/
|
||
|
typedef struct SRSRAN_API {
|
||
|
bool cfr_enable;
|
||
|
srsran_cfr_mode_t cfr_mode;
|
||
|
// always used (mandatory)
|
||
|
uint32_t symbol_bw; ///< OFDM symbol bandwidth, in FFT bins
|
||
|
uint32_t symbol_sz; ///< OFDM symbol size (in samples). This is the FFT size
|
||
|
float alpha; ///< Alpha parameter of the clipping algorithm
|
||
|
bool dc_sc; ///< Take into account the DC subcarrier for the filter BW
|
||
|
|
||
|
// SRSRAN_CFR_THR_MANUAL mode parameters
|
||
|
float manual_thr; ///< Fixed threshold used in SRSRAN_CFR_THR_MANUAL mode
|
||
|
|
||
|
// SRSRAN_CFR_THR_AUTO_CMA and SRSRAN_CFR_THR_AUTO_EMA mode parameters
|
||
|
bool measure_out_papr; ///< Enable / disable output PAPR measurement
|
||
|
float max_papr_db; ///< Input PAPR threshold used in SRSRAN_CFR_THR_AUTO_CMA and SRSRAN_CFR_THR_AUTO_EMA modes
|
||
|
float ema_alpha; ///< EMA alpha parameter for avg power calculation, used in SRSRAN_CFR_THR_AUTO_EMA mode
|
||
|
} srsran_cfr_cfg_t;
|
||
|
|
||
|
typedef struct SRSRAN_API {
|
||
|
srsran_cfr_cfg_t cfg;
|
||
|
float max_papr_lin;
|
||
|
|
||
|
srsran_dft_plan_t fft_plan;
|
||
|
srsran_dft_plan_t ifft_plan;
|
||
|
float* lpf_spectrum; ///< FFT filter spectrum
|
||
|
uint32_t lpf_bw; ///< Bandwidth of the LPF
|
||
|
|
||
|
float* abs_buffer_in; ///< Store the input absolute value
|
||
|
float* abs_buffer_out; ///< Store the output absolute value
|
||
|
cf_t* peak_buffer;
|
||
|
|
||
|
float pwr_avg_in; ///< store the avg. input power with MA or EMA averaging
|
||
|
float pwr_avg_out; ///< store the avg. output power with MA or EMA averaging
|
||
|
|
||
|
// Power average buffers, used in SRSRAN_CFR_THR_AUTO_CMA mode
|
||
|
uint64_t cma_n;
|
||
|
} srsran_cfr_t;
|
||
|
|
||
|
SRSRAN_API int srsran_cfr_init(srsran_cfr_t* q, srsran_cfr_cfg_t* cfg);
|
||
|
|
||
|
/**
|
||
|
* @brief Applies the CFR algorithm to the time domain OFDM symbols
|
||
|
*
|
||
|
* @attention This function must be called once per symbol, and it will process q->symbol_sz samples
|
||
|
*
|
||
|
* @param[in] q The CFR object and configuration
|
||
|
* @param[in] in Input buffer containing the time domain OFDM symbol without CP
|
||
|
* @param[out] out Output buffer with the processed OFDM symbol
|
||
|
* @return SRSRAN_SUCCESS if the CFR object is initialised, otherwise SRSRAN_ERROR
|
||
|
*/
|
||
|
SRSRAN_API void srsran_cfr_process(srsran_cfr_t* q, cf_t* in, cf_t* out);
|
||
|
|
||
|
SRSRAN_API void srsran_cfr_free(srsran_cfr_t* q);
|
||
|
|
||
|
/**
|
||
|
* @brief Checks the validity of the CFR algorithm parameters.
|
||
|
*
|
||
|
* @attention Does not check symbol size and bandwidth
|
||
|
*
|
||
|
* @param[in] cfr_conf the CFR configuration
|
||
|
* @return true if the configuration is valid, false otherwise
|
||
|
*/
|
||
|
SRSRAN_API bool srsran_cfr_params_valid(srsran_cfr_cfg_t* cfr_conf);
|
||
|
|
||
|
/**
|
||
|
* @brief Sets the manual threshold of the CFR (used in manual mode).
|
||
|
*
|
||
|
* @attention this is not thread-safe
|
||
|
*
|
||
|
* @param[in] q the CFR object
|
||
|
* @return SRSRAN_SUCCESS if successful, SRSRAN_ERROR or SRSRAN_ERROR_INVALID_INPUTS otherwise
|
||
|
*/
|
||
|
SRSRAN_API int srsran_cfr_set_threshold(srsran_cfr_t* q, float thres);
|
||
|
|
||
|
/**
|
||
|
* @brief Sets the papr target of the CFR (used in auto modes).
|
||
|
*
|
||
|
* @attention this is not thread-safe
|
||
|
*
|
||
|
* @param[in] q the CFR object
|
||
|
* @return SRSRAN_SUCCESS if successful, SRSRAN_ERROR or SRSRAN_ERROR_INVALID_INPUTS otherwise
|
||
|
*/
|
||
|
SRSRAN_API int srsran_cfr_set_papr(srsran_cfr_t* q, float papr);
|
||
|
|
||
|
#endif // SRSRAN_CFR_H
|