Skip to content

Commit fc08bf0

Browse files
committed
rf: allow 5G custom tx/rx frequencies
Signed-off-by: Nikos Apostolakis <nikos.apostolakis@srs.io>
1 parent 6bcbd9e commit fc08bf0

File tree

5 files changed

+40
-10
lines changed

5 files changed

+40
-10
lines changed

lib/include/srsran/interfaces/ue_nr_interfaces.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,8 @@ struct phy_args_nr_t {
231231
float trs_sinr_ema_alpha = 0.1f; ///< SINR measurement exponential average alpha
232232
float trs_cfo_ema_alpha = 0.1f; ///< RSRP measurement exponential average alpha
233233
bool enable_worker_cfo = true; ///< Enable/Disable open loop CFO correction at the workers
234+
float dl_freq = -1.0f;
235+
float ul_freq = -1.0f;
234236

235237
phy_args_nr_t()
236238
{

srsue/hdr/phy/nr/sync_sa.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ class sync_sa : public srsran::thread, public srsran::phy_common_interface
5454
float pbch_dmrs_thr = 0.0f; ///< PBCH DMRS correlation detection threshold (0 means auto)
5555
float cfo_alpha = 0.0f; ///< CFO averaging alpha (0 means auto)
5656
int thread_priority = 1;
57+
double dl_freq_override_hz = -1;
58+
double ul_freq_override_hz = -1;
5759

5860
cell_search::args_t get_cell_search() const
5961
{
@@ -115,6 +117,8 @@ class sync_sa : public srsran::thread, public srsran::phy_common_interface
115117
const static uint32_t cell_search_max_trials = 100;
116118
uint32_t sfn_sync_nof_trials = 0;
117119
const static uint32_t sfn_sync_max_trials = 100;
120+
double dl_freq_override_hz = -1;
121+
double ul_freq_override_hz = -1;
118122

119123
cell_search::ret_t cs_ret;
120124
cell_search searcher;

srsue/src/phy/phy_nr_sa.cc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ phy_nr_sa::phy_nr_sa(const char* logname) :
6868
logger_phy_lib(srslog::fetch_basic_logger("PHY_LIB")),
6969
sync(logger, workers),
7070
workers(logger, 4)
71-
{}
71+
{
72+
}
7273

7374
int phy_nr_sa::init(const phy_args_nr_t& args_, stack_interface_phy_nr* stack_, srsran::radio_interface_phy* radio_)
7475
{
@@ -106,6 +107,8 @@ void phy_nr_sa::init_background()
106107
nr::sync_sa::args_t sync_args = {};
107108
sync_args.srate_hz = args.srate_hz;
108109
sync_args.thread_priority = args.slot_recv_thread_prio;
110+
sync_args.ul_freq_override_hz = args.ul_freq;
111+
sync_args.dl_freq_override_hz = args.dl_freq;
109112
if (not sync.init(sync_args, stack, radio)) {
110113
logger.error("Error initialising SYNC");
111114
return;

srsue/src/phy/sync_sa.cc

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ namespace srsue {
2626
namespace nr {
2727
sync_sa::sync_sa(srslog::basic_logger& logger_, worker_pool& workers_) :
2828
logger(logger_), workers(workers_), slot_synchronizer(logger_), searcher(logger_), ta(logger_), srsran::thread("SYNC")
29-
{}
29+
{
30+
}
3031

3132
sync_sa::~sync_sa()
3233
{
@@ -37,10 +38,12 @@ sync_sa::~sync_sa()
3738

3839
bool sync_sa::init(const args_t& args, stack_interface_phy_nr* stack_, srsran::radio_interface_phy* radio_)
3940
{
40-
stack = stack_;
41-
radio = radio_;
42-
srate_hz = args.srate_hz;
43-
slot_sz = (uint32_t)(args.srate_hz / 1000.0f);
41+
stack = stack_;
42+
radio = radio_;
43+
srate_hz = args.srate_hz;
44+
slot_sz = (uint32_t)(args.srate_hz / 1000.0f);
45+
dl_freq_override_hz = args.dl_freq_override_hz;
46+
ul_freq_override_hz = args.ul_freq_override_hz;
4447

4548
// Initialise cell search internal object
4649
if (not searcher.init(args.get_cell_search())) {
@@ -149,7 +152,12 @@ cell_search::ret_t sync_sa::cell_search_run(const cell_search::cfg_t& cfg)
149152

150153
// tune radio
151154
logger.info("Tuning Rx channel %d to %.2f MHz", 0, cfg.center_freq_hz / 1e6);
152-
radio->set_rx_freq(0, cfg.center_freq_hz);
155+
double dl_freq_applied = cfg.center_freq_hz;
156+
if (dl_freq_override_hz > 0) {
157+
dl_freq_applied = dl_freq_override_hz;
158+
logger.info("Overriding Rx channel %d to %.2f MHz", 0, dl_freq_override_hz / 1e6);
159+
}
160+
radio->set_rx_freq(0, dl_freq_applied);
153161

154162
if (not searcher.start(cfg)) {
155163
logger.error("Sync: failed to start cell search");
@@ -185,9 +193,20 @@ rrc_interface_phy_nr::cell_select_result_t sync_sa::cell_select_run(const phy_in
185193

186194
// tune radio
187195
logger.info("Tuning Rx channel %d to %.2f MHz", 0, req.carrier.dl_center_frequency_hz / 1e6);
188-
radio->set_rx_freq(0, req.carrier.dl_center_frequency_hz);
196+
double dl_freq_applied = req.carrier.dl_center_frequency_hz;
197+
if (dl_freq_override_hz > 0) {
198+
dl_freq_applied = dl_freq_override_hz;
199+
logger.info("Overriding Rx channel %d to %.2f MHz", 0, dl_freq_override_hz / 1e6);
200+
}
201+
radio->set_rx_freq(0, dl_freq_applied);
202+
189203
logger.info("Tuning Tx channel %d to %.2f MHz", 0, req.carrier.ul_center_frequency_hz / 1e6);
190-
radio->set_tx_freq(0, req.carrier.ul_center_frequency_hz);
204+
double ul_freq_applied = req.carrier.ul_center_frequency_hz;
205+
if (ul_freq_override_hz > 0) {
206+
ul_freq_applied = ul_freq_override_hz;
207+
logger.info("Overriding Rx channel %d to %.2f MHz", 0, ul_freq_override_hz / 1e6);
208+
}
209+
radio->set_tx_freq(0, ul_freq_applied);
191210

192211
// Configure cell
193212
srsran_ue_sync_nr_cfg_t cfg = {};

srsue/src/ue.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@ int ue::init(const all_args_t& args_)
9292
phy_args_nr.log = args.phy.log;
9393
phy_args_nr.store_pdsch_ko = args.phy.nr_store_pdsch_ko;
9494
phy_args_nr.srate_hz = args.rf.srate_hz;
95+
phy_args_nr.dl_freq = args.phy.dl_freq;
96+
phy_args_nr.ul_freq = args.phy.ul_freq;
9597

9698
// init layers
9799
if (args.phy.nof_lte_carriers == 0) {
@@ -279,7 +281,7 @@ int ue::parse_args(const all_args_t& args_)
279281
// Consider Carrier Aggregation support if more than one
280282
args.stack.rrc.nof_lte_carriers = args.phy.nof_lte_carriers;
281283
args.stack.rrc.nof_nr_carriers = args.phy.nof_nr_carriers;
282-
args.stack.rrc.support_ca = (args.phy.nof_lte_carriers > 1);
284+
args.stack.rrc.support_ca = (args.phy.nof_lte_carriers > 1);
283285

284286
// Make sure fix sampling rate is set for SA mode
285287
if (args.phy.nof_lte_carriers == 0 and not std::isnormal(args.rf.srate_hz)) {

0 commit comments

Comments
 (0)