












SSS/PBCH检测是在频域上做的,所以跟slot/symbol/sample这些数字是强相关的。例如:
106 RB, 1272 subcarriers, 2048 FFT
15kHz SCS: 15*2048=30720 samples per ms, 30720 samples per slot (1ms)
30kHz SCS: 30*2048=61440 samples per ms, 30720 samples per slot (0.5ms)
=> 2048 sample per symbol without CP, 2048 samples for 14 symbols
15KHz SCS: 160+144*6+160+144*6=2048
30kHz SCS: 176+144*13=2048
调用nr_search_ssb_common,包括SSS检测
1)=> 调用nr_slot_fep
分别取出SSB的符号进行频域处理
// Symbol ordering: 0=PSS, 1=PBCH, 2=SSS, 3=PBCH
for (int i = 0; i < NR_N_SYMBOLS_SSB; i++) {
nr_slot_fep(NULL, fp, 0, i, rxdataF, link_type_dl, sample_offset, (c16_t **)params->rxdata);
}
通过slot/symbol/sample_offset参数,取出SSB的某个符号,例如
第0个符号:对于30kHz SCS,sample_offset=4416=长CP+symbol+短CP+symbol=176+2048+144+2048
因为SSB所在符号都不具有长CP,因此不用考虑长CP
rx_offset会计算出去除了CP后的某个符号的起始采样点位置,相当于包括了“去CP”操作
2)=> 调用nr_symbol_fep
一个符号的频域处理。会调用dft函数,进行DFT操作
会调用pss_ch_est_nr进行基于PSS的信道估计,并对SSS进行信道补偿
AWGN下信道估计值近似为1(会有scaling),可以先调试AWGN信道(即不过信道)
好像PSS/SSS/PBCH操作中SSB的数据都在rxdata中,不同操作仅仅是指向了它的内容,如果需要修改rxdata的数据(如DFT,补偿),会进行memcpy操作,避免对rxdata造成影响
3)=> 调用rx_sss_nr,检测SSS
针对一个N_ID1(共336个)、一个phase assumption(共16个),会计算出一个metric(127个频域值的相关值)
metric_re += d[i] * ((phase_nr[phase].r * sss[i].r - phase_nr[phase].i * sss[i].i) >> SCALING_METRIC_SSS_NR);
其中d[i]是预先计算好的,它是SSS的BPSK调制值(来自38.211公式)?
for (int N_ID_2 = 0; N_ID_2 < nid_2_num; N_ID_2++) {
for (int N_ID_1 = 0; N_ID_1 < N_ID_1_NUMBER; N_ID_1++) {
m0 = 15 * (N_ID_1 / 112) + (5 * N_ID_2);
m1 = N_ID_1 % 112;
for (int n = 0; n < LENGTH_SSS_NR; n++) {
dss_current = (1 - 2 * x0[(n + m0) % (LENGTH_SSS_NR)]) * (1 - 2 * x1[(n + m1) % (LENGTH_SSS_NR)]);
/* Modulation of SSS is a BPSK TS 36.211 chapter 5.1.2 BPSK */
#if 1
d_sss[N_ID_2][N_ID_1][n] = dss_current; // * amp;
(void)amp;
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。