From 767606f9f24da7606219b16dcd63bd08f55b7e05 Mon Sep 17 00:00:00 2001
From: hbilel <haithem.bilel@alcatelonetouch.com>
Date: Thu, 20 Jul 2017 10:09:43 +0200
Subject: [PATCH] - fix init prach struct + fix TO compensation for 20MHz
case
---
openair1/PHY/INIT/lte_init.c | 4 ++
openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c | 68 ++++++++++++++-----
.../PHY/LTE_ESTIMATION/lte_ue_measurements.c | 6 +-
openair1/PHY/LTE_TRANSPORT/dci_tools.c | 44 ++++++------
openair1/PHY/LTE_TRANSPORT/initial_sync.c | 3 +
openair1/PHY/defs.h | 1 +
openair1/SCHED/phy_procedures_lte_ue.c | 7 +-
targets/RT/USER/lte-ue.c | 1 +
8 files changed, 90 insertions(+), 44 deletions(-)
diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c
index 4b0255806d..04611f7b56 100644
--- a/openair1/PHY/INIT/lte_init.c
+++ b/openair1/PHY/INIT/lte_init.c
@@ -1089,6 +1089,7 @@ int phy_init_lte_ue(PHY_VARS_UE *ue,
LTE_UE_COMMON* const common_vars = &ue->common_vars;
LTE_UE_PDSCH** const pdsch_vars_SI = ue->pdsch_vars_SI;
LTE_UE_PDSCH** const pdsch_vars_ra = ue->pdsch_vars_ra;
+ LTE_UE_PDSCH** const pdsch_vars_p = ue->pdsch_vars_p;
LTE_UE_PDSCH** const pdsch_vars_mch = ue->pdsch_vars_MCH;
LTE_UE_PDSCH* (*pdsch_vars_th)[][NUMBER_OF_CONNECTED_eNB_MAX+1] = &ue->pdsch_vars;
LTE_UE_PDCCH* (*pdcch_vars_th)[][NUMBER_OF_CONNECTED_eNB_MAX] = &ue->pdcch_vars;
@@ -1184,6 +1185,7 @@ int phy_init_lte_ue(PHY_VARS_UE *ue,
pdsch_vars_SI[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH));
pdsch_vars_ra[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH));
+ pdsch_vars_p[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH));
pdsch_vars_mch[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH));
prach_vars[eNB_id] = (LTE_UE_PRACH *)malloc16_clear(sizeof(LTE_UE_PRACH));
pbch_vars[eNB_id] = (LTE_UE_PBCH *)malloc16_clear(sizeof(LTE_UE_PBCH));
@@ -1247,6 +1249,7 @@ int phy_init_lte_ue(PHY_VARS_UE *ue,
}
phy_init_lte_ue__PDSCH( pdsch_vars_SI[eNB_id], fp );
phy_init_lte_ue__PDSCH( pdsch_vars_ra[eNB_id], fp );
+ phy_init_lte_ue__PDSCH( pdsch_vars_p[eNB_id], fp );
phy_init_lte_ue__PDSCH( pdsch_vars_mch[eNB_id], fp );
// 100 PRBs * 12 REs/PRB * 4 PDCCH SYMBOLS * 2 LLRs/RE
@@ -1311,6 +1314,7 @@ int phy_init_lte_ue(PHY_VARS_UE *ue,
pdsch_vars_SI[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear( sizeof(LTE_UE_PDSCH) );
pdsch_vars_ra[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear( sizeof(LTE_UE_PDSCH) );
+ pdsch_vars_p[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear( sizeof(LTE_UE_PDSCH) );
if (abstraction_flag == 0) {
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c
index 7e90116180..bc30b9ffbb 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c
@@ -40,6 +40,8 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms,
{
static int max_pos_fil = 0;
+ static int count_max_pos_ok = 0;
+ static int first_time = 1;
int temp = 0, i, aa, max_val = 0, max_pos = 0;
int diff;
short Re,Im,ncoef;
@@ -76,30 +78,60 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms,
max_pos_fil = ((max_pos_fil * coef) + (max_pos * ncoef)) >> 15;
// do not filter to have proactive timing adjustment
- max_pos_fil = max_pos;
-
- diff = max_pos_fil - (frame_parms->nb_prefix_samples>>3);
-
- if ( abs(diff) < SYNCH_HYST )
- ue->rx_offset = 0;
- else
- ue->rx_offset = diff;
-
- if ( ue->rx_offset < 0 )
- ue->rx_offset += FRAME_LENGTH_COMPLEX_SAMPLES;
+ //max_pos_fil = max_pos;
+
+ if(subframe == 6)
+ {
+ diff = max_pos_fil - (frame_parms->nb_prefix_samples>>3);
+
+ if ( abs(diff) < SYNCH_HYST )
+ ue->rx_offset = 0;
+ else
+ ue->rx_offset = diff;
+
+ if(abs(diff)<5)
+ count_max_pos_ok ++;
+ else
+ count_max_pos_ok = 0;
+
+ if(count_max_pos_ok > 10 && first_time == 1)
+ {
+ first_time = 0;
+ ue->time_sync_cell = 1;
+ if (ue->mac_enabled==1) {
+ LOG_I(PHY,"[UE%d] Sending synch status to higher layers\n",ue->Mod_id);
+ //mac_resynch();
+ mac_xface->dl_phy_sync_success(ue->Mod_id,ue->proc.proc_rxtx[0].frame_rx,0,1);//ue->common_vars.eNb_id);
+ ue->UE_mode[0] = PRACH;
+ }
+ else {
+ ue->UE_mode[0] = PUSCH;
+ }
+ }
- if ( ue->rx_offset >= FRAME_LENGTH_COMPLEX_SAMPLES )
- ue->rx_offset -= FRAME_LENGTH_COMPLEX_SAMPLES;
+ if ( ue->rx_offset < 0 )
+ ue->rx_offset += FRAME_LENGTH_COMPLEX_SAMPLES;
+ if ( ue->rx_offset >= FRAME_LENGTH_COMPLEX_SAMPLES )
+ ue->rx_offset -= FRAME_LENGTH_COMPLEX_SAMPLES;
-#ifdef DEBUG_PHY
- LOG_D(PHY,"AbsSubframe %d.%d: rx_offset (after) = %d : max_pos = %d,max_pos_fil = %d (peak %d) target_pos %d \n",
- ue->proc.proc_rxtx[0].frame_rx,subframe,ue->rx_offset,max_pos,max_pos_fil,temp,(frame_parms->nb_prefix_samples>>3));
-#endif //DEBUG_PHY
- VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_OUT);
+ #ifdef DEBUG_PHY
+ LOG_D(PHY,"AbsSubframe %d.%d: diff =%i rx_offset (final) = %i : clear %d,max_pos = %d,max_pos_fil = %d (peak %d) max_val %d target_pos %d \n",
+ ue->proc.proc_rxtx[subframe%RX_NB_TH].frame_rx,
+ subframe,
+ diff,
+ ue->rx_offset,
+ clear,
+ max_pos,
+ max_pos_fil,
+ temp,max_val,
+ (frame_parms->nb_prefix_samples>>3));
+ #endif //DEBUG_PHY
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_OUT);
+ }
}
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c
index cc676ce467..87ce1f6cb6 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c
@@ -215,7 +215,7 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
}
else
{
- rxF_sss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[(subframe+1)%RX_NB_TH].rxdataF[aarx][(13*ue->frame_parms.ofdm_symbol_size)];
+ rxF_sss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[(subframe-1)%RX_NB_TH].rxdataF[aarx][(13*ue->frame_parms.ofdm_symbol_size)];
rxF_pss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe%RX_NB_TH].rxdataF[aarx][(2*ue->frame_parms.ofdm_symbol_size)];
}
//-ve spectrum from SSS
@@ -239,7 +239,7 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
}
else
{
- rxF_sss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[(subframe+1)%RX_NB_TH].rxdataF[aarx][(14*ue->frame_parms.ofdm_symbol_size)];
+ rxF_sss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[(subframe-1)%RX_NB_TH].rxdataF[aarx][(14*ue->frame_parms.ofdm_symbol_size)];
rxF_pss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe%RX_NB_TH].rxdataF[aarx][(3*ue->frame_parms.ofdm_symbol_size)];
}
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71]));
@@ -278,7 +278,7 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
rxdataF = ue->common_vars.common_vars_rx_data_per_thread[(subframe%RX_NB_TH)].rxdataF;
rxF_pss = (int16_t *) &rxdataF[aarx][((pss_symb*(ue->frame_parms.ofdm_symbol_size)))];
- rxdataF = ue->common_vars.common_vars_rx_data_per_thread[(subframe+1)%RX_NB_TH].rxdataF;
+ rxdataF = ue->common_vars.common_vars_rx_data_per_thread[(subframe-1)%RX_NB_TH].rxdataF;
rxF_sss = (int16_t *) &rxdataF[aarx][((sss_symb*(ue->frame_parms.ofdm_symbol_size)))];
//-ve spectrum from SSS
diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
index 6cc42f4582..53e98ded77 100644
--- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c
+++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
@@ -5291,29 +5291,31 @@ void prepare_dl_decoding_format1_1A(DCI_format_t dci_format,
pdlsch0_harq->first_tx = 0;
pdlsch0_harq->status = ACTIVE;
+ }else if (rv1 != 0 )
+ //NDI has not been toggled but rv was increased by eNB: retransmission
+ {
+ if (pdlsch0_harq->status == SCH_IDLE)
+ //packet was actually decoded in previous transmission (ACK was missed by eNB)
+ //However, the round is not a good check as it might have been decoded in a retransmission prior to this one.
+ {
+ LOG_D(PHY,"skip pdsch decoding and report ack\n");
+ // skip pdsch decoding and report ack
+ //pdlsch0_harq->status = SCH_IDLE;
+ pdlsch0->active = 0;
+ pdlsch0->harq_ack[subframe].ack = 1;
+ pdlsch0->harq_ack[subframe].harq_id = harq_pid;
+ pdlsch0->harq_ack[subframe].send_harq_status = 1;
+
+ //pdlsch0_harq->first_tx = 0;
+ }
+ else //normal retransmission
+ {
+ // nothing special to do
+ }
}
-
- else if (rv1 != 0 )
- //NDI has not been toggled but rv was increased by eNB: retransmission
- {
- if (pdlsch0_harq->status == SCH_IDLE)
- //packet was actually decoded in previous transmission (ACK was missed by eNB)
- //However, the round is not a good check as it might have been decoded in a retransmission prior to this one.
+ else
{
- LOG_D(PHY,"skip pdsch decoding and report ack\n");
- // skip pdsch decoding and report ack
- //pdlsch0_harq->status = SCH_IDLE;
- pdlsch0->active = 0;
- pdlsch0->harq_ack[subframe].ack = 1;
- pdlsch0->harq_ack[subframe].harq_id = harq_pid;
- pdlsch0->harq_ack[subframe].send_harq_status = 1;
-
- //pdlsch0_harq->first_tx = 0;
- }
- else //normal retransmission
- {
- // nothing special to do
- }
+ pdlsch0_harq->status = ACTIVE;
}
}
diff --git a/openair1/PHY/LTE_TRANSPORT/initial_sync.c b/openair1/PHY/LTE_TRANSPORT/initial_sync.c
index e2c0ce3112..0c828d44aa 100644
--- a/openair1/PHY/LTE_TRANSPORT/initial_sync.c
+++ b/openair1/PHY/LTE_TRANSPORT/initial_sync.c
@@ -493,6 +493,8 @@ int initial_sync(PHY_VARS_UE *ue, runmode_t mode)
ue->common_vars.freq_offset );
#endif
+// send sync status to higher layers later when timing offset converge to target timing
+#if 0
if (ue->mac_enabled==1) {
LOG_I(PHY,"[UE%d] Sending synch status to higher layers\n",ue->Mod_id);
//mac_resynch();
@@ -502,6 +504,7 @@ int initial_sync(PHY_VARS_UE *ue, runmode_t mode)
else {
ue->UE_mode[0] = PUSCH;
}
+#endif
generate_pcfich_reg_mapping(frame_parms);
generate_phich_reg_mapping(frame_parms);
diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h
index fc52148b8f..f93afa3585 100644
--- a/openair1/PHY/defs.h
+++ b/openair1/PHY/defs.h
@@ -838,6 +838,7 @@ typedef struct {
uint8_t decode_MIB;
int rx_offset; /// Timing offset
int rx_offset_diff; /// Timing adjustment for ofdm symbol0 on HW USRP
+ int time_sync_cell;
int timing_advance; ///timing advance signalled from eNB
int hw_timing_advance;
int N_TA_offset; ///timing offset used in TDD
diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c
index 85bff1e886..2d6034030a 100644
--- a/openair1/SCHED/phy_procedures_lte_ue.c
+++ b/openair1/SCHED/phy_procedures_lte_ue.c
@@ -271,7 +271,7 @@ void phy_reset_ue(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index)
PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id];
//[NUMBER_OF_RX_THREAD=2][NUMBER_OF_CONNECTED_eNB_MAX][2];
- for(int l=0; l<2; l++) {
+ for(int l=0; l<RX_NB_TH; l++) {
for(i=0; i<NUMBER_OF_CONNECTED_eNB_MAX; i++) {
for(j=0; j<2; j++) {
//DL HARQ
@@ -336,6 +336,7 @@ void ra_succeeded(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index)
PHY_vars_UE_g[Mod_id][CC_id]->ulsch[eNB_index]->harq_processes[i]->status=IDLE;
PHY_vars_UE_g[Mod_id][CC_id]->dlsch[0][eNB_index][0]->harq_processes[i]->round=0;
PHY_vars_UE_g[Mod_id][CC_id]->dlsch[1][eNB_index][0]->harq_processes[i]->round=0;
+ PHY_vars_UE_g[Mod_id][CC_id]->ulsch[eNB_index]->harq_processes[i]->subframe_scheduling_flag=0;
}
}
@@ -2662,7 +2663,8 @@ void ue_measurement_procedures(
}
- if ((subframe_rx==0) && (slot == 0) && (l==(4-frame_parms->Ncp))) {
+ // accumulate and filter timing offset estimation every subframe (instead of every frame)
+ if (( (slot%2) == 0) && (l==(4-frame_parms->Ncp))) {
// AGC
@@ -5636,6 +5638,7 @@ void phy_procedures_UE_lte(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,u
if (ue->mac_enabled==1) {
if (slot==0) {
+ //LOG_I(PHY,"[UE %d] Frame %d, subframe %d, star ue_scheduler\n", ue->Mod_id,frame_rx,subframe_tx);
ret = mac_xface->ue_scheduler(ue->Mod_id,
frame_rx,
subframe_rx,
diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c
index fb22f29961..66448229b7 100644
--- a/targets/RT/USER/lte-ue.c
+++ b/targets/RT/USER/lte-ue.c
@@ -725,6 +725,7 @@ void *UE_thread(void *arg) {
UE->frame_parms.nb_antennas_rx),"");
}
UE->rx_offset=0;
+ UE->time_sync_cell=0;
//UE->proc.proc_rxtx[0].frame_rx++;
//UE->proc.proc_rxtx[1].frame_rx++;
for (th_id=0; th_id < RX_NB_TH; th_id++) {
--
GitLab