From dfd3ad267eff779dc6f5e7483833895d534143cf Mon Sep 17 00:00:00 2001 From: alexjiao Date: Wed, 5 Nov 2025 22:41:29 +0800 Subject: [PATCH] Refactor pss_search_time_nr() with configurable search window Add search_start and search_length parameters to pss_search_time_nr() to support targeted PSS searches within specific time windows. --- openair1/PHY/NR_REFSIG/pss_nr.h | 12 +++++ openair1/PHY/NR_UE_TRANSPORT/pss_nr.c | 72 +++++++++++++++------------ 2 files changed, 53 insertions(+), 31 deletions(-) diff --git a/openair1/PHY/NR_REFSIG/pss_nr.h b/openair1/PHY/NR_REFSIG/pss_nr.h index cf705a7ee6..8034d7f362 100644 --- a/openair1/PHY/NR_REFSIG/pss_nr.h +++ b/openair1/PHY/NR_REFSIG/pss_nr.h @@ -86,6 +86,18 @@ int pss_synchro_nr(const c16_t **rxdata, int *f_off, int *pssPeak, int *pssAvg); +int pss_search_time_nr(const c16_t **rxdata, + const NR_DL_FRAME_PARMS *frame_parms, + const c16_t pssTime[NUMBER_PSS_SEQUENCE][frame_parms->ofdm_symbol_size], + bool fo_flag, + int is, + int target_Nid_cell, + int *nid2, + int *f_off, + int *pssPeak, + int *pssAvg, + int search_start, + int search_length); void generate_pss_nr_time(const NR_DL_FRAME_PARMS *fp, const int N_ID_2, int ssbFirstSCS, c16_t pssTime[fp->ofdm_symbol_size]); int16_t *get_primary_synchro_nr2(const int nid2); diff --git a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c index 180ca99918..08ed65945c 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c @@ -50,16 +50,18 @@ //#define DBG_PSS_NR static time_stats_t generic_time[TIME_LAST]; -static int pss_search_time_nr(const c16_t **rxdata, - const NR_DL_FRAME_PARMS *frame_parms, - const c16_t pssTime[NUMBER_PSS_SEQUENCE][frame_parms->ofdm_symbol_size], - bool fo_flag, - int is, - int target_Nid_cell, - int *nid2, - int *f_off, - int *pssPeak, - int *pssAvg); +int pss_search_time_nr(const c16_t **rxdata, + const NR_DL_FRAME_PARMS *frame_parms, + const c16_t pssTime[NUMBER_PSS_SEQUENCE][frame_parms->ofdm_symbol_size], + bool fo_flag, + int is, + int target_Nid_cell, + int *nid2, + int *f_off, + int *pssPeak, + int *pssAvg, + int search_start, + int search_length); static int16_t primary_synchro_nr2[NUMBER_PSS_SEQUENCE][LENGTH_PSS_NR] = {0}; static c16_t primary_synchro[NUMBER_PSS_SEQUENCE][LENGTH_PSS_NR] = {0}; @@ -407,7 +409,7 @@ int pss_synchro_nr(const c16_t **rxdata, VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PSS_SEARCH_TIME_NR, VCD_FUNCTION_IN); int synchro_position = - pss_search_time_nr(rxdata, frame_parms, pssTime, fo_flag, is, target_Nid_cell, nid2, f_off, pssPeak, pssAvg); + pss_search_time_nr(rxdata, frame_parms, pssTime, fo_flag, is, target_Nid_cell, nid2, f_off, pssPeak, pssAvg, -1, -1); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PSS_SEARCH_TIME_NR, VCD_FUNCTION_OUT); @@ -496,30 +498,38 @@ int pss_synchro_nr(const c16_t **rxdata, * *********************************************************************/ -static int pss_search_time_nr(const c16_t **rxdata, - const NR_DL_FRAME_PARMS *frame_parms, - const c16_t pssTime[NUMBER_PSS_SEQUENCE][frame_parms->ofdm_symbol_size], - bool fo_flag, - int is, - int target_Nid_cell, - int *nid2, - int *f_off, - int *pssPeak, - int *pssAvg) +int pss_search_time_nr(const c16_t **rxdata, + const NR_DL_FRAME_PARMS *frame_parms, + const c16_t pssTime[NUMBER_PSS_SEQUENCE][frame_parms->ofdm_symbol_size], + bool fo_flag, + int is, + int target_Nid_cell, + int *nid2, + int *f_off, + int *pssPeak, + int *pssAvg, + int search_start, + int search_length) { unsigned int n, ar, peak_position, pss_source; int64_t peak_value; int64_t avg[NUMBER_PSS_SEQUENCE] = {0}; double ffo_est = 0; - // performing the correlation on a frame length plus one symbol for the first of the two frame - // to take into account the possibility of PSS in between the two frames - unsigned int length; - if (is==0) - length = frame_parms->samples_per_frame + (2*frame_parms->ofdm_symbol_size); - else - length = frame_parms->samples_per_frame; - + // Determine search window + unsigned int start, length; + if (search_start >= 0 && search_length > 0) { + // Use provided search window for known neighboring cells + start = search_start; + length = search_length; + } else { + // For initial cell search + start = 0; + if (is == 0) + length = frame_parms->samples_per_frame + (2 * frame_parms->ofdm_symbol_size); + else + length = frame_parms->samples_per_frame; + } AssertFatal(length>0,"illegal length %d\n",length); peak_value = 0; @@ -547,7 +557,7 @@ static int pss_search_time_nr(const c16_t **rxdata, } for (int pss_index = pss_index_start; pss_index < pss_index_end; pss_index++) { - for (n = 0; n < length; n += 4) { // + for (n = start; n < start + length; n += 4) { // int64_t pss_corr_ue=0; /* calculate dot product of primary_synchro_time_nr and rxdata[ar][n] @@ -627,7 +637,7 @@ static int pss_search_time_nr(const c16_t **rxdata, dB_fixed64(avg[pss_source]), ffo_est); - if (peak_value < 5*avg[pss_source]) + if ((search_start < 0 || search_length == 0) && peak_value < 5 * avg[pss_source]) return(-1);