From 0a4dd140090684de1d26bc3e849fb4a6b82459f2 Mon Sep 17 00:00:00 2001 From: Javier Morgade Date: Thu, 11 Apr 2019 21:50:21 +0200 Subject: [PATCH] FeMBMS 1.25KHz Carrier Spacing OFDM demodulation and Channel Estimation Procedures --- openair1/PHY/MODULATION/slot_fep_mbsfn.c | 109 +++++++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/openair1/PHY/MODULATION/slot_fep_mbsfn.c b/openair1/PHY/MODULATION/slot_fep_mbsfn.c index 272cbc5d60..0a19b427fc 100644 --- a/openair1/PHY/MODULATION/slot_fep_mbsfn.c +++ b/openair1/PHY/MODULATION/slot_fep_mbsfn.c @@ -204,3 +204,112 @@ int slot_fep_mbsfn(PHY_VARS_UE *ue, #endif return(0); } + +#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) +int slot_fep_mbsfn_khz_1dot25(PHY_VARS_UE *ue, + int subframe, + int sample_offset) +{ + + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + LTE_UE_COMMON *common_vars = &ue->common_vars; + uint8_t eNB_id = 0;//ue_common_vars->eNb_id; + + unsigned char aa; + unsigned char frame_type = frame_parms->frame_type; // Frame Type: 0 - FDD, 1 - TDD; + unsigned int nb_prefix_samples; + int ofdm_symbol_size; + unsigned int subframe_offset; + unsigned int frame_length_samples = frame_parms->samples_per_tti * 10; + +void (*dft)(int16_t *,int16_t *, int); + + AssertFatal(frame_parms->frame_type == FDD, "Frame is TDD!\n"); + + switch (frame_parms->ofdm_symbol_size) { + + case 128: + dft = dft1536; + ofdm_symbol_size=1536; + nb_prefix_samples=384; + break; + case 256: + AssertFatal(1==0,"FeMBMS dft3072 not implemented\n"); + dft = dft3072; + ofdm_symbol_size=3072; + nb_prefix_samples=768; + break; + + case 512: + dft = dft6144; + nb_prefix_samples=1536; + ofdm_symbol_size=6144; + break; + + case 1024: + dft = dft12288; + nb_prefix_samples=3072; + ofdm_symbol_size=12288; + break; + + case 1536: + dft = dft18432; + nb_prefix_samples=4608; + ofdm_symbol_size=18432; + break; + + case 2048: + dft = dft24576; + nb_prefix_samples=6144; + ofdm_symbol_size=24576; + break; + + default: + AssertFatal(1==0,"Illegal ofdm symbol size %d\n",frame_parms->ofdm_symbol_size); + break; + } + + subframe_offset = frame_parms->samples_per_tti * subframe; + +#ifdef DEBUG_FEP + LOG_D(PHY,"slot_fep_mbsfn125: subframe %d, nb_prefix_samples %d, subframe_offset %d, sample_offset %d\n", subframe, nb_prefix_samples,subframe_offset, + sample_offset); +#endif + + for (aa=0; aanb_antennas_rx; aa++) { + memset(&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aa][0],0,ofdm_symbol_size*sizeof(int)); +#if UE_TIMING_TRACE + start_meas(&ue->rx_dft_stats); +#endif + dft((int16_t *)&common_vars->rxdata[aa][(sample_offset + + nb_prefix_samples + + subframe_offset - + SOFFSET) % frame_length_samples], + (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aa][0],1); + +#if UE_TIMING_TRACE + stop_meas(&ue->rx_dft_stats); +#endif + } + + + for (aa=0; aanb_antennas_tx; aa++) { + if (ue->perfect_ce == 0) { +#ifdef DEBUG_FEP + LOG_D(PHY,"Channel estimation eNB %d, aatx %d, subframe %d\n",eNB_id,aa,subframe); +#endif + lte_dl_mbsfn_khz_1dot25_channel_estimation(ue, + eNB_id, + 0, + subframe); + } + } + +#ifdef DEBUG_FEP + LOG_D(PHY,"slot_fep_mbsfn: done\n"); +#endif + + return(0); +} +#endif +