|
|
|
/**
|
|
|
|
* 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/.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#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 CMA or EMA power averaging
|
|
|
|
*/
|
|
|
|
typedef enum SRSRAN_API {
|
|
|
|
SRSRAN_CFR_THR_INVALID,
|
|
|
|
SRSRAN_CFR_THR_MANUAL,
|
|
|
|
SRSRAN_CFR_THR_AUTO_CMA,
|
|
|
|
SRSRAN_CFR_THR_AUTO_EMA,
|
|
|
|
SRSRAN_CFR_NOF_MODES
|
|
|
|
} 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);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Converts a string representing a CFR mode from the config files into srsran_cfr_mode_t type
|
|
|
|
*
|
|
|
|
* @param[in] mode_str the cfr.mode string coming from the config file
|
|
|
|
* @return SRSRAN_CFR_THR_INVALID if mode_str is empty,
|
|
|
|
* SRSRAN_CFR_THR_INVALID if mode_str is not recognised,
|
|
|
|
* otherwise it returns the corresponding srsran_cfr_mode_t value.
|
|
|
|
*/
|
|
|
|
SRSRAN_API srsran_cfr_mode_t srsran_cfr_str2mode(const char* mode_str);
|
|
|
|
|
|
|
|
#endif // SRSRAN_CFR_H
|