Set secondary Serving cell synchronism bandwidth at cell selection and skip at configuration set-up

master
Xavier Arteaga 4 years ago committed by Xavier Arteaga
parent b8b27709b9
commit 326c5bc25e

@ -50,6 +50,7 @@ private:
uint32_t channel = 0; uint32_t channel = 0;
srslte_sync_t find_pss = {}; srslte_sync_t find_pss = {};
int32_t sf_len = 0; int32_t sf_len = 0;
int32_t cell_id = -1;
std::array<cf_t, 2 * SRSLTE_SF_LEN_MAX> temp = {}; std::array<cf_t, 2 * SRSLTE_SF_LEN_MAX> temp = {};
std::mutex mutex; ///< Used for avoiding reconfiguring (set_cell) while it is searching std::mutex mutex; ///< Used for avoiding reconfiguring (set_cell) while it is searching
@ -71,7 +72,6 @@ private:
// Run PSS search // Run PSS search
switch (srslte_sync_find(&find_pss, temp.data(), 0, &peak_pos)) { switch (srslte_sync_find(&find_pss, temp.data(), 0, &peak_pos)) {
case SRSLTE_SYNC_FOUND: case SRSLTE_SYNC_FOUND:
if (callback != nullptr) { if (callback != nullptr) {
// Calculate Sample Offset from TTI difference // Calculate Sample Offset from TTI difference
@ -123,6 +123,32 @@ public:
~sync() { srslte_sync_free(&find_pss); }; ~sync() { srslte_sync_free(&find_pss); };
void set_bw(const uint32_t nof_prb)
{
// Protect DSP objects and buffers; As it is called by asynchronous thread, it can wait to finish current processing
std::unique_lock<std::mutex> lock(mutex);
uint32_t symbol_sz = srslte_symbol_sz(nof_prb);
int32_t new_sf_len = SRSLTE_SF_LEN_PRB(nof_prb);
// Skip if no BW is changed
if (new_sf_len == sf_len) {
return;
}
// Resize
if (srslte_sync_resize(&find_pss, 2 * new_sf_len, 2 * new_sf_len, symbol_sz) != SRSLTE_SUCCESS) {
ERROR("Error setting cell sync find");
}
// Update values
sf_len = new_sf_len;
cell_id = -1; // Force next set_cell to set the ID
// Reset state to idle
state = STATE_IDLE;
}
/** /**
* Sets the cell for the synchronizer * Sets the cell for the synchronizer
*/ */
@ -131,25 +157,37 @@ public:
// Protect DSP objects and buffers; As it is called by asynchronous thread, it can wait to finish current processing // Protect DSP objects and buffers; As it is called by asynchronous thread, it can wait to finish current processing
std::unique_lock<std::mutex> lock(mutex); std::unique_lock<std::mutex> lock(mutex);
uint32_t symbol_sz = srslte_symbol_sz(cell.nof_prb); uint32_t symbol_sz = srslte_symbol_sz(cell.nof_prb);
sf_len = SRSLTE_SF_LEN_PRB(cell.nof_prb); int32_t new_sf_len = SRSLTE_SF_LEN_PRB(cell.nof_prb);
int32_t new_cell_id = cell.id;
// Resize Sync object // Resize Sync object
if (srslte_sync_resize(&find_pss, 2 * sf_len, 2 * sf_len, symbol_sz) != SRSLTE_SUCCESS) { if (new_sf_len != sf_len) {
ERROR("Error setting cell sync find"); if (srslte_sync_resize(&find_pss, 2 * new_sf_len, 2 * new_sf_len, symbol_sz) != SRSLTE_SUCCESS) {
ERROR("Error setting cell sync find");
}
// Force cell_id set
cell_id = -1;
} }
// Configure // Configure
srslte_sync_set_frame_type(&find_pss, cell.frame_type); if (cell_id != new_cell_id) {
srslte_sync_set_N_id_2(&find_pss, cell.id % SRSLTE_NOF_NID_2); srslte_sync_set_frame_type(&find_pss, cell.frame_type);
srslte_sync_set_N_id_1(&find_pss, cell.id / SRSLTE_NOF_NID_2); srslte_sync_set_N_id_2(&find_pss, new_cell_id % SRSLTE_NOF_NID_2);
srslte_sync_set_cfo_ema_alpha(&find_pss, 0.1); srslte_sync_set_N_id_1(&find_pss, new_cell_id / SRSLTE_NOF_NID_2);
srslte_sync_set_em_alpha(&find_pss, 1); srslte_sync_set_cfo_ema_alpha(&find_pss, 0.1);
srslte_sync_set_threshold(&find_pss, 3.0); srslte_sync_set_em_alpha(&find_pss, 1);
srslte_sync_set_threshold(&find_pss, 3.0);
}
// Reset Temporal buffer // Reset Temporal buffer
srslte_vec_cf_zero(temp.data(), 2 * sf_len); srslte_vec_cf_zero(temp.data(), 2 * sf_len);
// Update new values
sf_len = new_sf_len;
cell_id = new_cell_id;
// Go to search PSS // Go to search PSS
state = STATE_SEARCH_PSS; state = STATE_SEARCH_PSS;
} }

@ -340,6 +340,12 @@ bool sync::cell_select_start(phy_cell_t new_cell)
// Reconfigure first intra-frequency measurement // Reconfigure first intra-frequency measurement
intra_freq_meas[0]->set_primary_cell(current_earfcn, cell); intra_freq_meas[0]->set_primary_cell(current_earfcn, cell);
// Reconfigure secondary serving cell synchronization assuming the same BW than the primary
// The secondary serving cell synchronization will not resize again when the SCell gets configured
for (auto& e : scell_sync) {
e.second->set_bw(cell.nof_prb);
}
// Change sampling rate if necessary // Change sampling rate if necessary
if (srate_mode != SRATE_CAMP) { if (srate_mode != SRATE_CAMP) {
phy_logger.info("Cell Select: Setting CAMPING sampling rate"); phy_logger.info("Cell Select: Setting CAMPING sampling rate");

Loading…
Cancel
Save