phy: use fftshift'ed buffer for txdataF

So far txdataF buffer has DC RE as the first element. This was prefered
most likely to avoid memcpy before iFFT but comes with a small
complexity in RE mapping functions.

Instead, we use a flat buffer that holds freq domain data starting from
first negative SC. After resource mapping is done on all channels, each
OFDM symbol is shifted before iFFT so that the buffer start with DC RE.

This reduces complexity in mapping functions and later on when passing
beam IDs to 7.2 split RU especially when a beam is associated to
interleaved RB and/or REs.

There is already a memcpy in place to copy txdataF from gNB stuct to RU
struct. So this change does not introduce new memcpy.
This commit is contained in:
Sakthivel Velumani
2026-03-09 18:27:27 +00:00
parent d7512bdc8b
commit 044ca835d6
16 changed files with 185 additions and 217 deletions
+18 -3
View File
@@ -1141,9 +1141,17 @@ int main(int argc, char **argv)
//TODO: loop over slots
for (aa=0; aa<gNB->frame_parms.nb_antennas_tx; aa++) {
c16_t fft_in_buff[frame_parms->ofdm_symbol_size * frame_parms->symbols_per_slot] __attribute__((aligned(64)));
memset(fft_in_buff, 0, sizeof(fft_in_buff));
if (cyclic_prefix_type == 1) {
PHY_ofdm_mod((int *)gNB->common_vars.txdataF[0][aa],
fft_shift(gNB->common_vars.txdataF[0][aa],
frame_parms->ofdm_symbol_size,
frame_parms->N_RB_DL,
fft_in_buff,
frame_parms->ofdm_symbol_size,
0,
12);
PHY_ofdm_mod((int *)fft_in_buff,
(int *)&txdata[aa][slot_offset],
frame_parms->ofdm_symbol_size,
12,
@@ -1154,7 +1162,14 @@ int main(int argc, char **argv)
for (int i = 0; i < 14; i++) {
was_symbol_used[i] = true;
}
nr_normal_prefix_mod(gNB->common_vars.txdataF[0][aa],
fft_shift(gNB->common_vars.txdataF[0][aa],
frame_parms->ofdm_symbol_size,
frame_parms->N_RB_DL,
fft_in_buff,
frame_parms->ofdm_symbol_size,
0,
14);
nr_normal_prefix_mod(fft_in_buff,
&txdata[aa][slot_offset],
14,
frame_parms,
+26 -6
View File
@@ -525,17 +525,28 @@ int main(int argc, char **argv)
nr_common_signal_procedures (gNB,frame,slot, &ssb_pdu[i]);
int samp = get_samples_slot_timestamp(frame_parms, slot);
for (aa=0; aa<gNB->frame_parms.nb_antennas_tx; aa++) {
for (aa = 0; aa < gNB->frame_parms.nb_antennas_tx; aa++) {
c16_t fft_in_buff[frame_parms->ofdm_symbol_size * frame_parms->symbols_per_slot] __attribute__((aligned(64)));
memset(fft_in_buff, 0, sizeof(fft_in_buff));
if (cyclic_prefix_type == 1) {
apply_nr_rotation_TX(frame_parms,
gNB->common_vars.txdataF[0][aa],
true,
frame_parms->symbol_rotation[0],
slot,
frame_parms->N_RB_DL,
0,
12);
PHY_ofdm_mod((int *)gNB->common_vars.txdataF[0][aa],
fft_shift(gNB->common_vars.txdataF[0][aa],
frame_parms->ofdm_symbol_size,
frame_parms->N_RB_DL,
fft_in_buff,
frame_parms->ofdm_symbol_size,
0,
12);
PHY_ofdm_mod((int *)fft_in_buff,
(int *)&txdata[aa][samp],
frame_parms->ofdm_symbol_size,
12,
@@ -544,21 +555,30 @@ int main(int argc, char **argv)
} else {
apply_nr_rotation_TX(frame_parms,
gNB->common_vars.txdataF[0][aa],
true,
frame_parms->symbol_rotation[0],
slot,
frame_parms->N_RB_DL,
0,
14);
PHY_ofdm_mod((int *)gNB->common_vars.txdataF[0][aa],
(int*)&txdata[aa][samp],
fft_shift(gNB->common_vars.txdataF[0][aa],
frame_parms->ofdm_symbol_size,
frame_parms->N_RB_DL,
fft_in_buff,
frame_parms->ofdm_symbol_size,
0,
14);
PHY_ofdm_mod((int *)fft_in_buff,
(int *)&txdata[aa][samp],
frame_parms->ofdm_symbol_size,
1,
frame_parms->nb_prefix_samples0,
CYCLIC_PREFIX);
PHY_ofdm_mod((int *)&gNB->common_vars.txdataF[0][aa][frame_parms->ofdm_symbol_size],
(int*)&txdata[aa][samp + frame_parms->nb_prefix_samples0 + frame_parms->ofdm_symbol_size],
PHY_ofdm_mod((int *)fft_in_buff + frame_parms->ofdm_symbol_size,
(int *)&txdata[aa][samp + frame_parms->nb_prefix_samples0 + frame_parms->ofdm_symbol_size],
frame_parms->ofdm_symbol_size,
13,
frame_parms->nb_prefix_samples,