slot_fep_nr.c 17 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/*
 * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The OpenAirInterface Software Alliance licenses this file to You under
 * the OAI Public License, Version 1.1  (the "License"); you may not use this file
 * except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.openairinterface.org/?page_id=698
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *-------------------------------------------------------------------------------
 * For more information about the OpenAirInterface (OAI) Software Alliance:
 *      contact@openairinterface.org
 */

#include "PHY/defs_nr_UE.h"
23
#include "PHY/defs_gNB.h"
24
#include "modulation_UE.h"
25
#include "nr_modulation.h"
26 27
#include "PHY/LTE_ESTIMATION/lte_estimation.h"
#include "PHY/NR_UE_ESTIMATION/nr_estimation.h"
laurent's avatar
laurent committed
28
#include <common/utils/LOG/log.h>
29

30
//#define DEBUG_FEP
31 32 33

#define SOFFSET 0

34
/*#ifdef LOG_I
35 36
#undef LOG_I
#define LOG_I(A,B...) printf(A)
37
#endif*/
38

39
int nr_slot_fep(PHY_VARS_NR_UE *ue,
yilmazt's avatar
yilmazt committed
40 41 42 43
                unsigned char symbol,
                unsigned char Ns,
                int sample_offset,
                int no_prefix)
44 45 46 47
{
  NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
  NR_UE_COMMON *common_vars   = &ue->common_vars;
  unsigned char aa;
Francesco Mani's avatar
Francesco Mani committed
48 49
  unsigned int nb_prefix_samples;
  unsigned int nb_prefix_samples0;
50
  unsigned int abs_symbol;
Francesco Mani's avatar
Francesco Mani committed
51 52 53 54 55 56 57 58
  if (ue->is_synchronized) {
    nb_prefix_samples = (no_prefix ? 0 : frame_parms->nb_prefix_samples);
    nb_prefix_samples0 = (no_prefix ? 0 : frame_parms->nb_prefix_samples0);
  }
  else {
    nb_prefix_samples = (no_prefix ? 0 : frame_parms->nb_prefix_samples);
    nb_prefix_samples0 = (no_prefix ? 0 : frame_parms->nb_prefix_samples);
  }
Hongzhi Wang's avatar
Hongzhi Wang committed
59
  //unsigned int subframe_offset;//,subframe_offset_F;
60 61 62 63
  unsigned int slot_offset;
  //int i;
  unsigned int frame_length_samples = frame_parms->samples_per_subframe * 10;
  unsigned int rx_offset;
64

65

frtabu's avatar
frtabu committed
66
  dft_size_idx_t dftsize;
Raymond Knopp's avatar
Raymond Knopp committed
67
  int tmp_dft_in[8192] __attribute__ ((aligned (32)));  // This is for misalignment issues for 6 and 15 PRBs
68 69 70

  switch (frame_parms->ofdm_symbol_size) {
  case 128:
frtabu's avatar
frtabu committed
71
    dftsize = DFT_128;
72 73 74
    break;

  case 256:
frtabu's avatar
frtabu committed
75
    dftsize = DFT_256;
76 77 78
    break;

  case 512:
frtabu's avatar
frtabu committed
79
    dftsize = DFT_512;
80 81 82
    break;

  case 1024:
frtabu's avatar
frtabu committed
83
    dftsize = DFT_1024;
84 85 86
    break;

  case 1536:
frtabu's avatar
frtabu committed
87
    dftsize = DFT_1536;
88 89 90
    break;

  case 2048:
frtabu's avatar
frtabu committed
91
    dftsize = DFT_2048;
92 93
    break;

94
  case 3072:
frtabu's avatar
frtabu committed
95
    dftsize = DFT_3072;
96 97
    break;

Raymond Knopp's avatar
Raymond Knopp committed
98
  case 4096:
frtabu's avatar
frtabu committed
99
    dftsize = DFT_4096;
Raymond Knopp's avatar
Raymond Knopp committed
100 101 102
    break;

  case 8192:
frtabu's avatar
frtabu committed
103
    dftsize = DFT_8192;
Raymond Knopp's avatar
Raymond Knopp committed
104 105
    break;

106
  default:
107 108
    printf("unsupported ofdm symbol size \n");
    assert(0);
109 110 111
  }

  if (no_prefix) {
112
    slot_offset = frame_parms->ofdm_symbol_size * (frame_parms->symbols_per_slot) * (Ns);
113
  } else {
Sakthivel Velumani's avatar
Sakthivel Velumani committed
114
    slot_offset = frame_parms->get_samples_slot_timestamp(Ns,frame_parms,0);
115 116 117 118 119 120 121
  }

  /*if (l<0 || l>=7-frame_parms->Ncp) {
    printf("slot_fep: l must be between 0 and %d\n",7-frame_parms->Ncp);
    return(-1);
    }*/

Sakthivel Velumani's avatar
Sakthivel Velumani committed
122
  if (Ns<0 || Ns>(frame_parms->slots_per_frame-1)) {
123
    printf("slot_fep: Ns must be between 0 and %d\n",frame_parms->slots_per_frame-1);
124 125 126 127
    return(-1);
  }

  for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
128
    memset(&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int));
129

130
    rx_offset = sample_offset + slot_offset - SOFFSET;
131 132 133
    // Align with 256 bit
    //    rx_offset = rx_offset&0xfffffff8;

134 135
#ifdef DEBUG_FEP
      //  if (ue->frame <100)
136 137
    /*LOG_I(PHY,*/printf("slot_fep: slot %d, symbol %d, nb_prefix_samples %u, nb_prefix_samples0 %u, slot_offset %u, sample_offset %d,rx_offset %u, frame_length_samples %u\n",
			 Ns, symbol, nb_prefix_samples, nb_prefix_samples0, slot_offset, sample_offset, rx_offset, frame_length_samples);
138 139
#endif

140 141 142
    abs_symbol = Ns * frame_parms->symbols_per_slot + symbol;
    
    for (int idx_symb = Ns*frame_parms->symbols_per_slot; idx_symb < abs_symbol; idx_symb++)
Sakthivel Velumani's avatar
Sakthivel Velumani committed
143
      rx_offset += (idx_symb%(0x7<<frame_parms->numerology_index)) ? nb_prefix_samples : nb_prefix_samples0;
144

145 146 147 148
    rx_offset += frame_parms->ofdm_symbol_size * symbol;

    if (abs_symbol%(0x7<<frame_parms->numerology_index)) {

149
      rx_offset += nb_prefix_samples;
150
      if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size))
151 152
        memcpy((short*) &common_vars->rxdata[aa][frame_length_samples],
               (short*) &common_vars->rxdata[aa][0],
153 154 155 156
               frame_parms->ofdm_symbol_size*sizeof(int));

      if ((rx_offset&7)!=0) {  // if input to dft is not 256-bit aligned, issue for size 6,15 and 25 PRBs
        memcpy((void *)tmp_dft_in,
157
               (void *) &common_vars->rxdata[aa][rx_offset % frame_length_samples],
158
               frame_parms->ofdm_symbol_size*sizeof(int));
frtabu's avatar
frtabu committed
159
        dft(dftsize,(int16_t *)tmp_dft_in,
160
            (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
161 162 163 164 165
      } else { // use dft input from RX buffer directly
#if UE_TIMING_TRACE
          start_meas(&ue->rx_dft_stats);
#endif

frtabu's avatar
frtabu committed
166
        dft(dftsize,(int16_t *) &common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
167
            (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
168 169 170 171 172
#if UE_TIMING_TRACE
        stop_meas(&ue->rx_dft_stats);
#endif
      }
    } else {
173

174
      rx_offset += nb_prefix_samples0;
175
      if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size))
176 177
        memcpy((void *) &common_vars->rxdata[aa][frame_length_samples],
               (void *) &common_vars->rxdata[aa][0],
178 179 180 181 182 183 184
               frame_parms->ofdm_symbol_size*sizeof(int));
#if UE_TIMING_TRACE
      start_meas(&ue->rx_dft_stats);
#endif

      if ((rx_offset&7)!=0) {  // if input to dft is not 128-bit aligned, issue for size 6 and 15 PRBs
        memcpy((void *)tmp_dft_in,
185
               (void *) &common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
186
               frame_parms->ofdm_symbol_size*sizeof(int));
frtabu's avatar
frtabu committed
187
        dft(dftsize,(int16_t *)tmp_dft_in,
188
            (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
189 190
      } else { // use dft input from RX buffer directly

frtabu's avatar
frtabu committed
191
        dft(dftsize,(int16_t *) &common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
192
            (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
193 194 195 196 197 198 199 200
      }
#if UE_TIMING_TRACE
      stop_meas(&ue->rx_dft_stats);
#endif


    }

201 202
#ifdef DEBUG_FEP
    //  if (ue->frame <100)
203
    printf("slot_fep: symbol %d rx_offset %u\n", symbol, rx_offset);
204 205 206 207 208 209 210 211 212 213 214
#endif
    
    int symb_offset = (Ns%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot;
    int32_t rot2 = ((uint32_t*)frame_parms->symbol_rotation)[symbol+symb_offset];
    ((int16_t*)&rot2)[1]=-((int16_t*)&rot2)[1];
    rotate_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
		      (int16_t*)&rot2,
		      (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
		      frame_parms->ofdm_symbol_size,
		      15);
    
215
  }
216
  
217

218 219 220 221 222 223 224
#ifdef DEBUG_FEP
  printf("slot_fep: done\n");
#endif
  return(0);
}

int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
Francesco Mani's avatar
Francesco Mani committed
225 226 227 228
                          unsigned char symbol,
                          unsigned char Ns,
                          int sample_offset,
                          int no_prefix)
229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250
{
  NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
  NR_UE_COMMON *common_vars   = &ue->common_vars;
  unsigned char aa;
  unsigned int nb_prefix_samples;
  unsigned int nb_prefix_samples0;
  unsigned int abs_symbol;
  if (ue->is_synchronized) {
    nb_prefix_samples = (no_prefix ? 0 : frame_parms->nb_prefix_samples);
    nb_prefix_samples0 = (no_prefix ? 0 : frame_parms->nb_prefix_samples0);
  }
  else {
    nb_prefix_samples = (no_prefix ? 0 : frame_parms->nb_prefix_samples);
    nb_prefix_samples0 = (no_prefix ? 0 : frame_parms->nb_prefix_samples);
  }
  //unsigned int subframe_offset;//,subframe_offset_F;
  unsigned int slot_offset;
  //int i;
  unsigned int frame_length_samples = frame_parms->samples_per_subframe * 10;
  unsigned int rx_offset;


frtabu's avatar
frtabu committed
251
  dft_size_idx_t dftsize;
252 253 254 255
  int tmp_dft_in[8192] __attribute__ ((aligned (32)));  // This is for misalignment issues for 6 and 15 PRBs

  switch (frame_parms->ofdm_symbol_size) {
  case 128:
frtabu's avatar
frtabu committed
256
    dftsize = DFT_128;
257 258 259
    break;

  case 256:
frtabu's avatar
frtabu committed
260
    dftsize = DFT_256;
261 262 263
    break;

  case 512:
frtabu's avatar
frtabu committed
264
    dftsize = DFT_512;
265 266 267
    break;

  case 1024:
frtabu's avatar
frtabu committed
268
    dftsize = DFT_1024;
269 270 271
    break;

  case 1536:
frtabu's avatar
frtabu committed
272
    dftsize = DFT_1536;
273 274 275
    break;

  case 2048:
frtabu's avatar
frtabu committed
276
    dftsize = DFT_2048;
277 278 279
    break;

  case 3072:
frtabu's avatar
frtabu committed
280
    dftsize = DFT_3072;
281 282 283
    break;

  case 4096:
frtabu's avatar
frtabu committed
284
    dftsize = DFT_4096;
285 286 287
    break;

  case 8192:
frtabu's avatar
frtabu committed
288
    dftsize = DFT_8192;
289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320
    break;

  default:
    printf("unsupported ofdm symbol size \n");
    assert(0);
  }

  if (no_prefix) {
    slot_offset = frame_parms->ofdm_symbol_size * (frame_parms->symbols_per_slot) * (Ns);
  } else {
    slot_offset = frame_parms->get_samples_slot_timestamp(Ns,frame_parms,0);
  }

  /*if (l<0 || l>=7-frame_parms->Ncp) {
    printf("slot_fep: l must be between 0 and %d\n",7-frame_parms->Ncp);
    return(-1);
    }*/

  if (Ns<0 || Ns>(frame_parms->slots_per_frame-1)) {
    printf("slot_fep: Ns must be between 0 and %d\n",frame_parms->slots_per_frame-1);
    return(-1);
  }

  for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
    memset(&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int));

    rx_offset = sample_offset + slot_offset - SOFFSET;
    // Align with 256 bit
    //    rx_offset = rx_offset&0xfffffff8;

#ifdef DEBUG_FEP
      //  if (ue->frame <100)
321 322
    /*LOG_I(PHY,*/printf("slot_fep: slot %d, symbol %d, nb_prefix_samples %u, nb_prefix_samples0 %u, slot_offset %u, sample_offset %d,rx_offset %u, frame_length_samples %u\n",
    		Ns, symbol, nb_prefix_samples, nb_prefix_samples0, slot_offset, sample_offset, rx_offset, frame_length_samples);
323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343
#endif

    abs_symbol = Ns * frame_parms->symbols_per_slot + symbol;
    
    for (int idx_symb = Ns*frame_parms->symbols_per_slot; idx_symb < abs_symbol; idx_symb++)
      rx_offset += (abs_symbol%(0x7<<frame_parms->numerology_index)) ? nb_prefix_samples : nb_prefix_samples0;

    rx_offset += frame_parms->ofdm_symbol_size * symbol;

    if (abs_symbol%(0x7<<frame_parms->numerology_index)) {

      rx_offset += nb_prefix_samples;
      if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size))
        memcpy((short*) &common_vars->rxdata[aa][frame_length_samples],
               (short*) &common_vars->rxdata[aa][0],
               frame_parms->ofdm_symbol_size*sizeof(int));

      if ((rx_offset&7)!=0) {  // if input to dft is not 256-bit aligned, issue for size 6,15 and 25 PRBs
        memcpy((void *)tmp_dft_in,
               (void *) &common_vars->rxdata[aa][rx_offset],
               frame_parms->ofdm_symbol_size*sizeof(int));
frtabu's avatar
frtabu committed
344
        dft(dftsize,(int16_t *)tmp_dft_in,
345 346 347 348 349 350
            (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
      } else { // use dft input from RX buffer directly
#if UE_TIMING_TRACE
          start_meas(&ue->rx_dft_stats);
#endif

frtabu's avatar
frtabu committed
351

352
        dft(dftsize,(int16_t *) &common_vars->rxdata[aa][rx_offset],
353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372
            (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
#if UE_TIMING_TRACE
        stop_meas(&ue->rx_dft_stats);
#endif
      }
    } else {

      rx_offset += nb_prefix_samples0;
      if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size))
        memcpy((void *) &common_vars->rxdata[aa][frame_length_samples],
               (void *) &common_vars->rxdata[aa][0],
               frame_parms->ofdm_symbol_size*sizeof(int));
#if UE_TIMING_TRACE
      start_meas(&ue->rx_dft_stats);
#endif

      if ((rx_offset&7)!=0) {  // if input to dft is not 128-bit aligned, issue for size 6 and 15 PRBs
        memcpy((void *)tmp_dft_in,
               (void *) &common_vars->rxdata[aa][rx_offset],
               frame_parms->ofdm_symbol_size*sizeof(int));
frtabu's avatar
frtabu committed
373
        dft(dftsize,(int16_t *)tmp_dft_in,
374 375
            (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
      } else { // use dft input from RX buffer directly
376
        dft(dftsize,(int16_t *) &common_vars->rxdata[aa][rx_offset],
377 378 379 380 381 382 383 384 385
            (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
      }
#if UE_TIMING_TRACE
      stop_meas(&ue->rx_dft_stats);
#endif


    }

386 387 388
    int symb_offset = (Ns%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot;
    int32_t rot2 = ((uint32_t*)frame_parms->symbol_rotation)[symbol+symb_offset];
    ((int16_t*)&rot2)[1]=-((int16_t*)&rot2)[1];
389 390 391 392 393 394 395

#ifdef DEBUG_FEP
    //  if (ue->frame <100)
    printf("slot_fep: slot %d, symbol %d rx_offset %u, rotation symbol %d %d.%d\n", Ns,symbol, rx_offset,
	   symbol+symb_offset,((int16_t*)&rot2)[0],((int16_t*)&rot2)[1]);
#endif

396 397 398 399 400 401
    rotate_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
		      (int16_t*)&rot2,
		      (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
		      frame_parms->ofdm_symbol_size,
		      15);
    
402 403 404
  }


405 406 407 408 409 410
#ifdef DEBUG_FEP
  printf("slot_fep: done\n");
#endif
  return(0);
}

411

412 413 414
int nr_slot_fep_ul(NR_DL_FRAME_PARMS *frame_parms,
                   int32_t *rxdata,
                   int32_t *rxdataF,
415 416 417 418 419
                   unsigned char symbol,
                   unsigned char Ns,
                   int sample_offset,
                   int no_prefix)
{
420
  int32_t slot_offset, rxdata_offset;
421 422 423 424

  unsigned int nb_prefix_samples  = (no_prefix ? 0 : frame_parms->nb_prefix_samples);
  unsigned int nb_prefix_samples0 = (no_prefix ? 0 : frame_parms->nb_prefix_samples0);
  
425 426
  int tmp_dft_in[8192] __attribute__ ((aligned (32)));

frtabu's avatar
frtabu committed
427
  dft_size_idx_t dftsize;
428 429 430

  switch (frame_parms->ofdm_symbol_size) {
    case 128:
frtabu's avatar
frtabu committed
431
      dftsize = DFT_128;
432 433 434
      break;

    case 256:
frtabu's avatar
frtabu committed
435
      dftsize = DFT_256;
436 437 438
      break;

    case 512:
frtabu's avatar
frtabu committed
439
      dftsize = DFT_512;
440 441 442
      break;

    case 1024:
frtabu's avatar
frtabu committed
443
      dftsize = DFT_1024;
444 445 446
      break;

    case 1536:
frtabu's avatar
frtabu committed
447
      dftsize = DFT_1536;
448 449 450
      break;

    case 2048:
frtabu's avatar
frtabu committed
451
      dftsize = DFT_2048;
452 453 454
      break;

    case 4096:
frtabu's avatar
frtabu committed
455
      dftsize = DFT_4096;
456 457 458
      break;

    case 8192:
frtabu's avatar
frtabu committed
459
      dftsize = DFT_8192;
460 461 462
      break;

    default:
frtabu's avatar
frtabu committed
463
      dftsize = DFT_512;
464 465 466
      break;
  }
  
Sakthivel Velumani's avatar
Sakthivel Velumani committed
467
  slot_offset   = frame_parms->get_samples_slot_timestamp(Ns,frame_parms,0);
468

469 470 471 472
  if(symbol == 0)
    rxdata_offset = slot_offset + nb_prefix_samples0 - SOFFSET;
  else
    rxdata_offset = slot_offset + nb_prefix_samples0 + (symbol * (frame_parms->ofdm_symbol_size + nb_prefix_samples)) - SOFFSET;
473

474
  if(sample_offset>rxdata_offset) {
475
    memcpy1((void *)tmp_dft_in,
476 477 478
           (void *) &rxdata[frame_parms->samples_per_frame-sample_offset+rxdata_offset],
           (sample_offset-rxdata_offset)*sizeof(int));

479
    memcpy1((void *)&tmp_dft_in[sample_offset-rxdata_offset],
480 481 482
           (void *) &rxdata[0],
           (frame_parms->ofdm_symbol_size-sample_offset+rxdata_offset)*sizeof(int));

483
    dft(dftsize,(int16_t *)&tmp_dft_in,
484 485
        (int16_t *)&rxdataF[symbol * frame_parms->ofdm_symbol_size], 1);
  }
486 487 488 489 490 491 492
  else {
    //dft(dftsize,(int16_t *)&rxdata[rxdata_offset-sample_offset],
      //  (int16_t *)&rxdataF[symbol * frame_parms->ofdm_symbol_size], 1);
    memcpy((void *)tmp_dft_in,
           (void *) &rxdata[rxdata_offset-sample_offset],
           (frame_parms->ofdm_symbol_size)*sizeof(int));
    dft(dftsize,(int16_t *)&tmp_dft_in,
493
        (int16_t *)&rxdataF[symbol * frame_parms->ofdm_symbol_size], 1);
494
  }
495

496 497
  // clear DC carrier from OFDM symbols
  rxdataF[symbol * frame_parms->ofdm_symbol_size] = 0;
498

Laurent's avatar
Laurent committed
499

500
  int symb_offset = (Ns%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot;
501
  uint32_t rot2 = ((uint32_t*)frame_parms->symbol_rotation)[symbol+symb_offset];
502
  ((int16_t*)&rot2)[1]=-((int16_t*)&rot2)[1];
503
  LOG_D(PHY,"slot %d, symb_offset %d rotating by %d.%d\n",Ns,symb_offset,((int16_t*)&rot2)[0],((int16_t*)&rot2)[1]);
504 505 506 507 508
  rotate_cpx_vector((int16_t *)&rxdataF[frame_parms->ofdm_symbol_size*symbol],
		    (int16_t*)&rot2,
		    (int16_t *)&rxdataF[frame_parms->ofdm_symbol_size*symbol],
		    frame_parms->ofdm_symbol_size,
		    15);
laurent's avatar
laurent committed
509

510 511
  return(0);
}