Commit 039232ba authored by Raymond Knopp's avatar Raymond Knopp

correction of 7.5kHz handling during initial synchronization. Increase in...

correction of 7.5kHz handling during initial synchronization. Increase in dynamic range of SSS detection
parent 42e4dce7
...@@ -47,13 +47,24 @@ int32_t sync_tmp[2048*4] __attribute__((aligned(32))); ...@@ -47,13 +47,24 @@ int32_t sync_tmp[2048*4] __attribute__((aligned(32)));
int16_t syncF_tmp[2048*2] __attribute__((aligned(32))); int16_t syncF_tmp[2048*2] __attribute__((aligned(32)));
extern int16_t s6n_kHz_7_5[1920];
extern int16_t s6e_kHz_7_5[1920];
extern int16_t s25n_kHz_7_5[7680];
extern int16_t s25e_kHz_7_5[7680];
extern int16_t s50n_kHz_7_5[15360];
extern int16_t s50e_kHz_7_5[15360];
extern int16_t s75n_kHz_7_5[24576];
extern int16_t s75e_kHz_7_5[24576];
extern int16_t s100n_kHz_7_5[30720];
extern int16_t s100e_kHz_7_5[30720];
int lte_sync_time_init(LTE_DL_FRAME_PARMS *frame_parms ) // LTE_UE_COMMON *common_vars int lte_sync_time_init(LTE_DL_FRAME_PARMS *frame_parms ) // LTE_UE_COMMON *common_vars
{ {
int i,k; int i,k;
sync_corr_ue0 = (int32_t *)malloc16(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(int32_t)*frame_parms->samples_per_tti); sync_corr_ue0 = (int32_t *)malloc16(4*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(int32_t)*frame_parms->samples_per_tti);
sync_corr_ue1 = (int32_t *)malloc16(4*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(int32_t)*frame_parms->samples_per_tti); sync_corr_ue1 = (int32_t *)malloc16(4*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(int32_t)*frame_parms->samples_per_tti);
sync_corr_ue2 = (int32_t *)malloc16(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(int32_t)*frame_parms->samples_per_tti); sync_corr_ue2 = (int32_t *)malloc16(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(int32_t)*frame_parms->samples_per_tti);
...@@ -124,24 +135,37 @@ int lte_sync_time_init(LTE_DL_FRAME_PARMS *frame_parms ) // LTE_UE_COMMON *com ...@@ -124,24 +135,37 @@ int lte_sync_time_init(LTE_DL_FRAME_PARMS *frame_parms ) // LTE_UE_COMMON *com
primary_synch0SL_time = (int16_t *)malloc16((frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)*sizeof(int16_t)*2); primary_synch0SL_time = (int16_t *)malloc16((frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)*sizeof(int16_t)*2);
if (primary_synch0SL_time) { if (primary_synch0SL_time) {
// bzero(primary_synch0_time,(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)*sizeof(int));
bzero(primary_synch0SL_time,(frame_parms->ofdm_symbol_size)*sizeof(int16_t)*2); bzero(primary_synch0SL_time,(frame_parms->ofdm_symbol_size)*sizeof(int16_t)*2);
#ifdef DEBUG_PHY #ifdef DEBUG_PHY
LOG_D(PHY,"[openair][LTE_PHY][SYNC] primary_synch0SL_time allocated at %p\n", primary_synch0SL_time); LOG_D(PHY,"[openair][LTE_PHY][SYNC] primary_synch0SL_time allocated at %p\n", primary_synch0SL_time);
#endif #endif
} else AssertFatal(1==0,"primary_synch0SL_time not allocated\n"); } else AssertFatal(1==0,"primary_synch0SL_time not allocated\n");
primary_synch0SL_time_rx = (int16_t *)malloc16(2*(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)*sizeof(int16_t)*2);
if (primary_synch0SL_time_rx) {
bzero(primary_synch0SL_time_rx,(frame_parms->ofdm_symbol_size)*sizeof(int16_t)*2);
#ifdef DEBUG_PHY
LOG_D(PHY,"[openair][LTE_PHY][SYNC] primary_synch0SL_time_rx allocated at %p\n", primary_synch0SL_time);
#endif
} else AssertFatal(1==0,"primary_synch0SL_time_rx not allocated\n");
// primary_synch1_time = (int *)malloc16((frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)*sizeof(int));
primary_synch1SL_time = (int16_t *)malloc16((frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)*sizeof(int16_t)*2); primary_synch1SL_time = (int16_t *)malloc16(((frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples))*sizeof(int16_t)*2);
if (primary_synch1SL_time) { if (primary_synch1SL_time) {
// bzero(primary_synch1_time,(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)*sizeof(int)); bzero(primary_synch1SL_time,(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)*sizeof(int16_t)*2);
bzero(primary_synch1SL_time,(frame_parms->ofdm_symbol_size)*sizeof(int16_t)*2);
#ifdef DEBUG_PHY #ifdef DEBUG_PHY
LOG_D(PHY,"[openair][LTE_PHY][SYNC] primary_synch1SL_time allocated at %p\n", primary_synch1SL_time); LOG_D(PHY,"[openair][LTE_PHY][SYNC] primary_synch1SL_time allocated at %p\n", primary_synch1SL_time);
#endif #endif
} else AssertFatal(1==0,"primary_synch1SL_time not allocated\n"); } else AssertFatal(1==0,"primary_synch1SL_time not allocated\n");
primary_synch1SL_time_rx = (int16_t *)malloc16(2*(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)*sizeof(int16_t)*2);
if (primary_synch1SL_time_rx) {
bzero(primary_synch1SL_time_rx,2*(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)*sizeof(int16_t)*2);
#ifdef DEBUG_PHY
LOG_D(PHY,"[openair][LTE_PHY][SYNC] primary_synch1SL_time_rx allocated at %p\n", primary_synch1SL_time);
#endif
} else AssertFatal(1==0,"primary_synch1SL_time_rx not allocated\n");
// generate oversampled sync_time sequences // generate oversampled sync_time sequences
...@@ -301,41 +325,62 @@ int lte_sync_time_init(LTE_DL_FRAME_PARMS *frame_parms ) // LTE_UE_COMMON *com ...@@ -301,41 +325,62 @@ int lte_sync_time_init(LTE_DL_FRAME_PARMS *frame_parms ) // LTE_UE_COMMON *com
} }
} }
uint16_t *kHz7_5ptr;
switch (frame_parms->N_RB_DL) { switch (frame_parms->N_RB_DL) {
case 6: case 6:
idft128((int16_t*)syncF_tmp, /// complex input idft128((int16_t*)syncF_tmp, /// complex input
(int16_t*)sync_tmp, /// complex output (int16_t*)sync_tmp, /// complex output
1); 1);
kHz7_5ptr = (frame_parms->Ncp==0) ? (((uint32_t*)s6n_kHz_7_5)+138): (((uint32_t*)s6e_kHz_7_5)+160);
break; break;
case 25: case 25:
idft512((int16_t*)syncF_tmp, /// complex input idft512((int16_t*)syncF_tmp, /// complex input
(int16_t*)sync_tmp, /// complex output (int16_t*)sync_tmp, /// complex output
1); 1);
kHz7_5ptr = (frame_parms->Ncp==0) ? (((uint32_t*)s25n_kHz_7_5)+552) : (((uint32_t*)s25e_kHz_7_5)+640);
break; break;
case 50: case 50:
idft1024((int16_t*)syncF_tmp, /// complex input idft1024((int16_t*)syncF_tmp, /// complex input
(int16_t*)sync_tmp, /// complex output (int16_t*)sync_tmp, /// complex output
1); 1);
kHz7_5ptr = (frame_parms->Ncp==0) ? &s50n_kHz_7_5[2*1104] : s50e_kHz_7_5[2*1280];
printf("%p\n",kHz7_5ptr);
break; break;
case 75: case 75:
idft1536((int16_t*)syncF_tmp, /// complex input idft1536((int16_t*)syncF_tmp, /// complex input
(int16_t*)sync_tmp, (int16_t*)sync_tmp,
1); /// complex output 1); /// complex output
kHz7_5ptr = (frame_parms->Ncp==0) ? (((uint32_t*)s75n_kHz_7_5)+1656) : (((uint32_t*)s75e_kHz_7_5)+1920);
break; break;
case 100: case 100:
idft2048((int16_t*)syncF_tmp, /// complex input idft2048((int16_t*)syncF_tmp, /// complex input
(int16_t*)sync_tmp, /// complex output (int16_t*)sync_tmp, /// complex output
1); 1);
kHz7_5ptr = (frame_parms->Ncp==0) ? (((uint32_t*)s100n_kHz_7_5)+2208) : (((uint32_t*)s100e_kHz_7_5)+2560);
break; break;
default: default:
LOG_E(PHY,"Unsupported N_RB_DL %d\n",frame_parms->N_RB_DL); LOG_E(PHY,"Unsupported N_RB_DL %d\n",frame_parms->N_RB_DL);
kHz7_5ptr = NULL;
break; break;
} }
int imod;
for (i=0; i<frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples; i++) for (i=0; i<(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)*2; i++) {
imod = i%(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples);
if (i<(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples))
((int32_t*)primary_synch0SL_time)[i] = sync_tmp[(i+(frame_parms->ofdm_symbol_size-frame_parms->nb_prefix_samples))%frame_parms->ofdm_symbol_size]; ((int32_t*)primary_synch0SL_time)[i] = sync_tmp[(i+(frame_parms->ofdm_symbol_size-frame_parms->nb_prefix_samples))%frame_parms->ofdm_symbol_size];
primary_synch0SL_time_rx[i<<1] = (int16_t)(((int32_t)primary_synch0SL_time[imod<<1]*kHz7_5ptr[i<<1])>>15) - (int16_t)(((int32_t)primary_synch0SL_time[1+(imod<<1)]*kHz7_5ptr[1+(i<<1)])>>15);
primary_synch0SL_time_rx[1+(i<<1)] = (int16_t)(((int32_t)primary_synch0SL_time[imod<<1]*kHz7_5ptr[1+(i<<1)])>>15) + (int16_t)(((int32_t)primary_synch0SL_time[1+(imod<<1)]*kHz7_5ptr[i<<1])>>15);
}
k=frame_parms->ofdm_symbol_size-36; k=frame_parms->ofdm_symbol_size-36;
for (i=0; i<72; i++) { for (i=0; i<72; i++) {
...@@ -380,18 +425,28 @@ int lte_sync_time_init(LTE_DL_FRAME_PARMS *frame_parms ) // LTE_UE_COMMON *com ...@@ -380,18 +425,28 @@ int lte_sync_time_init(LTE_DL_FRAME_PARMS *frame_parms ) // LTE_UE_COMMON *com
break; break;
} }
for (i=0; i<frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples; i++) for (i=0; i<(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)*2; i++) {
imod = i%(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples);
if (i<(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples))
((int32_t*)primary_synch1SL_time)[i] = sync_tmp[(i+(frame_parms->ofdm_symbol_size-frame_parms->nb_prefix_samples))%frame_parms->ofdm_symbol_size]; ((int32_t*)primary_synch1SL_time)[i] = sync_tmp[(i+(frame_parms->ofdm_symbol_size-frame_parms->nb_prefix_samples))%frame_parms->ofdm_symbol_size];
primary_synch1SL_time_rx[i<<1] = (int16_t)(((int32_t)primary_synch1SL_time[imod<<1]*kHz7_5ptr[i<<1])>>15) -
(int16_t)(((int32_t)primary_synch1SL_time[1+(imod<<1)]*kHz7_5ptr[1+(i<<1)])>>15);
primary_synch1SL_time_rx[1+(i<<1)] = (int16_t)(((int32_t)primary_synch1SL_time[imod<<1]*kHz7_5ptr[1+(i<<1)])>>15) +
(int16_t)(((int32_t)primary_synch1SL_time[1+(imod<<1)]*kHz7_5ptr[i<<1])>>15);
}
/* /*
write_output("primary_sync0.m","psync0",primary_synch0_time,frame_parms->ofdm_symbol_size,1,1); write_output("primary_sync0.m","psync0",primary_synch0_time,frame_parms->ofdm_symbol_size,1,1);
write_output("primary_sync1.m","psync1",primary_synch1_time,frame_parms->ofdm_symbol_size,1,1); write_output("primary_sync1.m","psync1",primary_synch1_time,frame_parms->ofdm_symbol_size,1,1);
write_output("primary_sync2.m","psync2",primary_synch2_time,frame_parms->ofdm_symbol_size,1,1); write_output("primary_sync2.m","psync2",primary_synch2_time,frame_parms->ofdm_symbol_size,1,1);
write_output("primary_syncSL0.m","psyncSL0",primary_synch0SL_time,frame_parms->ofdm_symbol_size,1,1); write_output("primary_syncSL0.m","psyncSL0",primary_synch0SL_time,frame_parms->ofdm_symbol_size,1,1);
*/ write_output("primary_syncSL1.m","psyncSL1",primary_synch1SL_time,frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples,1,1);
write_output("primary_syncSL1.m","psyncSL1",primary_synch1SL_time_rx,2*(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples),1,1);
write_output("primary_syncSL0.m","psyncSL0",primary_synch0SL_time_rx,2*(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples),1,1);
write_output("kHz75.m","kHz75",kHz7_5ptr,2*1096,1,1);
*/
return (1); return (1);
} }
...@@ -620,17 +675,13 @@ int lte_sync_timeSL(PHY_VARS_UE *ue, ...@@ -620,17 +675,13 @@ int lte_sync_timeSL(PHY_VARS_UE *ue,
int length = 4*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti; int length = 4*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti;
int32_t sync_corr0[frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples];
int32_t sync_corr1[frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples];
// circular copy of beginning to end of rxdata buffer. Note: buffer should be big enough upon calling this function // circular copy of beginning to end of rxdata buffer. Note: buffer should be big enough upon calling this function
for (int ar=0;ar<frame_parms->nb_antennas_rx;ar++) memcpy((void*)&ue->common_vars.rxdata_syncSL[ar][2*length], for (int ar=0;ar<frame_parms->nb_antennas_rx;ar++) memcpy((void*)&ue->common_vars.rxdata_syncSL[ar][2*length],
(void*)&ue->common_vars.rxdata_syncSL[ar][0], (void*)&ue->common_vars.rxdata_syncSL[ar][0],
frame_parms->ofdm_symbol_size); frame_parms->ofdm_symbol_size);
int32_t tmp0,tmp1; int32_t tmp0,tmp1;
int32_t magtmp0,magtmp1,lev0,lev1,maxlev0=0,maxlev1=0; int32_t magtmp0,magtmp1,maxlev0=0,maxlev1=0;
int maxpos0=0,maxpos1=0; int maxpos0=0,maxpos1=0;
int64_t avg0=0,avg1=0; int64_t avg0=0,avg1=0;
int32_t result; int32_t result;
...@@ -648,37 +699,25 @@ int lte_sync_timeSL(PHY_VARS_UE *ue, ...@@ -648,37 +699,25 @@ int lte_sync_timeSL(PHY_VARS_UE *ue,
// remove 7.5 kHz
for (int slot=0;slot<80;slot++) {
remove_7_5_kHz(&ru_tmp,slot);
for (int ar=0;ar<frame_parms->nb_antennas_rx;ar++) {
memcpy((void*)&rxdata[ar][slot*(frame_parms->samples_per_tti/2)],
(void*)&rxdata_7_5kHz[ar][(slot&1)*2*(frame_parms->samples_per_tti/2)],
sizeof(int16_t)*(2*frame_parms->samples_per_tti/2));
}
}
for (int n=0; n<length; n+=4) { for (int n=0; n<length; n+=4) {
int nprime = n % (frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples);
tmp0 = 0; tmp0 = 0;
tmp1 = 0; tmp1 = 0;
//calculate dot product of primary_synch0_time and rxdata[ar][n] (ar=0..nb_ant_rx) and store the sum in temp[n]; //calculate dot product of primary_synch0_time and rxdata[ar][n] (ar=0..nb_ant_rx) and store the sum in temp[n];
for (int ar=0; ar<frame_parms->nb_antennas_rx; ar++) { for (int ar=0; ar<frame_parms->nb_antennas_rx; ar++) {
result = dot_product((int16_t*)primary_synch0SL_time, result = dot_product((int16_t*)primary_synch0SL_time_rx,
(int16_t*) &(rxdata[ar][n]), (int16_t*) &(rxdata[ar][n]),
frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples, (frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)*2,
11); 11);
((int16_t*)&tmp0)[0] += ((int16_t*) &result)[0]; ((int16_t*)&tmp0)[0] += ((int16_t*) &result)[0];
((int16_t*)&tmp0)[1] += ((int16_t*) &result)[1]; ((int16_t*)&tmp0)[1] += ((int16_t*) &result)[1];
result = dot_product((int16_t*)primary_synch1SL_time, result = dot_product((int16_t*)primary_synch1SL_time_rx,
(int16_t*) &(rxdata[ar][n]), (int16_t*) &(rxdata[ar][n]),
frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples, (frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)*2,
11); 11);
((int16_t*)&tmp1)[0] += ((int16_t*) &result)[0]; ((int16_t*)&tmp1)[0] += ((int16_t*) &result)[0];
...@@ -693,22 +732,14 @@ int lte_sync_timeSL(PHY_VARS_UE *ue, ...@@ -693,22 +732,14 @@ int lte_sync_timeSL(PHY_VARS_UE *ue,
// this does max |tmpi(n)|^2 + |tmpi(n-L)|^2 and argmax |tmpi(n)|^2 + |tmpi(n-L)|^2 // this does max |tmpi(n)|^2 + |tmpi(n-L)|^2 and argmax |tmpi(n)|^2 + |tmpi(n-L)|^2
if (n>(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)) { if (magtmp0>maxlev0) { maxlev0 = magtmp0; maxpos0 = n; }
if (magtmp1>maxlev1) { maxlev1 = magtmp1; maxpos1 = n; }
// if (n<4096) printf("syncSL: sample %d (nprime %d) : , mag0 %d, prev0 %d, mag1 %d, prev1 %d\n",
// n,nprime,magtmp0,sync_corr0[nprime],magtmp1,sync_corr1[nprime]);
lev0 = magtmp0 + sync_corr0[nprime];
lev1 = magtmp1 + sync_corr1[nprime];
if (lev0>maxlev0) { maxlev0 = lev0; maxpos0 = n-(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples); }
if (lev1>maxlev1) { maxlev1 = lev1; maxpos1 = n-(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples); }
avg0 += magtmp0; avg0 += magtmp0;
avg1 += magtmp1; avg1 += magtmp1;
if (n<4*FRAME_LENGTH_COMPLEX_SAMPLES) {
sync_corr_ue1[n] = magtmp1;
sync_corr_ue0[n] = magtmp0;
} }
sync_corr0[nprime]=magtmp0;
sync_corr1[nprime]=magtmp1;
if (n<4*FRAME_LENGTH_COMPLEX_SAMPLES) sync_corr_ue1[n] = magtmp1;
} }
avg0/=(length/4); avg0/=(length/4);
avg1/=(length/4); avg1/=(length/4);
......
...@@ -60,6 +60,13 @@ int initial_syncSL(PHY_VARS_UE *ue) { ...@@ -60,6 +60,13 @@ int initial_syncSL(PHY_VARS_UE *ue) {
if (rx_psbch(ue) == -1) { if (rx_psbch(ue) == -1) {
ue->slbch_errors++; ue->slbch_errors++;
/*
write_output("rxsig0.m","rxs0",&ue->common_vars.rxdata_syncSL[0][0],40*ue->frame_parms.samples_per_tti,1,1);
write_output("corr0.m","rxsync0",sync_corr_ue0,40*ue->frame_parms.samples_per_tti,1,2);
write_output("corr1.m","rxsync1",sync_corr_ue1,40*ue->frame_parms.samples_per_tti,1,2);
exit(-1);
*/
return(-1); return(-1);
} }
else { else {
...@@ -80,7 +87,8 @@ int initial_syncSL(PHY_VARS_UE *ue) { ...@@ -80,7 +87,8 @@ int initial_syncSL(PHY_VARS_UE *ue) {
} }
} }
else { else {
write_output("rxsig0.m","rxs0",&ue->common_vars.rxdata[0][ue->frame_parms.samples_per_tti*subframe],ue->frame_parms.samples_per_tti,1,1); /*write_output("rxsig0.m","rxs0",&ue->common_vars.rxdata[0][ue->frame_parms.samples_per_tti*subframe],ue->frame_parms.samples_per_tti,1,1);
exit(-1); exit(-1);
*/
} }
} }
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
#define PSBCH_A 40 #define PSBCH_A 40
#define PSBCH_E 1008 //12REs/PRB*6PRBs*7symbols*2 bits/RB #define PSBCH_E 1008 //12REs/PRB*6PRBs*7symbols*2 bits/RB
#define PSBCH_DEBUG 1 //#define PSBCH_DEBUG 1
...@@ -149,7 +149,7 @@ int rx_psbch(PHY_VARS_UE *ue) { ...@@ -149,7 +149,7 @@ int rx_psbch(PHY_VARS_UE *ue) {
ru_tmp.N_TA_offset=0; ru_tmp.N_TA_offset=0;
ru_tmp.common.rxdata_7_5kHz = (int32_t**)malloc16(ue->frame_parms.nb_antennas_rx*sizeof(int32_t*)); ru_tmp.common.rxdata_7_5kHz = (int32_t**)malloc16(ue->frame_parms.nb_antennas_rx*sizeof(int32_t*));
for (int aa=0;aa<ue->frame_parms.nb_antennas_rx;aa++) for (int aa=0;aa<ue->frame_parms.nb_antennas_rx;aa++)
ru_tmp.common.rxdata_7_5kHz[aa] = (int32_t*)&ue->common_vars.rxdata_syncSL[aa][ue->rx_offsetSL*2]; ru_tmp.common.rxdata_7_5kHz[aa] = ue->sl_rxdata_7_5kHz[aa];//(int32_t*)&ue->common_vars.rxdata_syncSL[aa][ue->rx_offsetSL*2];
ru_tmp.common.rxdataF = (int32_t**)rxdataF; ru_tmp.common.rxdataF = (int32_t**)rxdataF;
ru_tmp.nb_rx = ue->frame_parms.nb_antennas_rx; ru_tmp.nb_rx = ue->frame_parms.nb_antennas_rx;
......
...@@ -96,12 +96,14 @@ int slpss_ch_est(PHY_VARS_UE *ue, ...@@ -96,12 +96,14 @@ int slpss_ch_est(PHY_VARS_UE *ue,
int32_t sss0_ext[4][72], int32_t sss0_ext[4][72],
int32_t pss1_ext[4][72], int32_t pss1_ext[4][72],
int32_t sss1_ext[4][72], int32_t sss1_ext[4][72],
int64_t sss0_comp[72],
int64_t sss1_comp[72],
int Nid2) int Nid2)
{ {
int16_t *pss; int16_t *pss;
int16_t *pss0_ext2,*sss0_ext2,*sss0_ext3,*sss1_ext3,tmp0_re,tmp0_im,tmp1_re,tmp1_im,tmp0_re2,tmp0_im2,tmp1_re2,tmp1_im2; int16_t *pss0_ext2,*sss0_ext2,tmp0_re,tmp0_im,tmp1_re,tmp1_im;
int32_t *sss0comp,*sss1comp,tmp0_re2,tmp0_im2,tmp1_re2,tmp1_im2;
int16_t *pss1_ext2,*sss1_ext2; int16_t *pss1_ext2,*sss1_ext2;
uint8_t aarx,i; uint8_t aarx,i;
LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
...@@ -121,8 +123,8 @@ int slpss_ch_est(PHY_VARS_UE *ue, ...@@ -121,8 +123,8 @@ int slpss_ch_est(PHY_VARS_UE *ue,
break; break;
} }
sss0_ext3 = (int16_t*)&sss0_ext[0][5]; sss0comp = (int32_t*)&sss0_comp[5];
sss1_ext3 = (int16_t*)&sss1_ext[0][5]; sss1comp = (int32_t*)&sss1_comp[5];
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
...@@ -139,31 +141,33 @@ int slpss_ch_est(PHY_VARS_UE *ue, ...@@ -139,31 +141,33 @@ int slpss_ch_est(PHY_VARS_UE *ue,
tmp1_re = (int16_t)((((pss1_ext2[i<<1]) * (int32_t)pss[i<<1])>>15) + (((pss1_ext2[1+(i<<1)]) * (int32_t)pss[1+(i<<1)])>>15)); tmp1_re = (int16_t)((((pss1_ext2[i<<1]) * (int32_t)pss[i<<1])>>15) + (((pss1_ext2[1+(i<<1)]) * (int32_t)pss[1+(i<<1)])>>15));
tmp1_im = (int16_t)((((pss1_ext2[i<<1]) * (int32_t)pss[1+(i<<1)])>>15) - (((pss1_ext2[1+(i<<1)]) * (int32_t)pss[(i<<1)])>>15)); tmp1_im = (int16_t)((((pss1_ext2[i<<1]) * (int32_t)pss[1+(i<<1)])>>15) - (((pss1_ext2[1+(i<<1)]) * (int32_t)pss[(i<<1)])>>15));
// printf("H*(%d,%d) : (%d,%d)\n",aarx,i,tmp_re,tmp_im); //printf("H*(%d,%d) : (%d,%d)\n",aarx,i,tmp0_re,tmp0_im);
// This is R(SSS0) \cdot H*(PSS) // This is R(SSS0) \cdot H*(PSS)
tmp0_re2 = (int16_t)(((tmp0_re * (int32_t)sss0_ext2[i<<1])>>12) - tmp0_re2 = (tmp0_re * (int32_t)sss0_ext2[i<<1]) -
((tmp0_im * (int32_t)sss0_ext2[1+(i<<1)])>>12)); (tmp0_im * (int32_t)sss0_ext2[1+(i<<1)]);
tmp0_im2 = (int16_t)(((tmp0_re * (int32_t)sss0_ext2[1+(i<<1)])>>12) + tmp0_im2 = (tmp0_re * (int32_t)sss0_ext2[1+(i<<1)]) +
((tmp0_im * (int32_t)sss0_ext2[(i<<1)])>>12)); (tmp0_im * (int32_t)sss0_ext2[(i<<1)]);
// This is R(SSS1) \cdot H*(PSS) // This is R(SSS1) \cdot H*(PSS)
tmp1_re2 = (int16_t)(((tmp1_re * (int32_t)sss1_ext2[i<<1])>>12) - tmp1_re2 = (tmp1_re * (int32_t)sss1_ext2[i<<1]) -
((tmp1_im * (int32_t)sss1_ext2[1+(i<<1)])>>12)); (tmp1_im * (int32_t)sss1_ext2[1+(i<<1)]);
tmp1_im2 = (int16_t)(((tmp1_re * (int32_t)sss1_ext2[1+(i<<1)])>>12) + tmp1_im2 = (tmp1_re * (int32_t)sss1_ext2[1+(i<<1)]) +
((tmp1_im * (int32_t)sss1_ext2[(i<<1)])>>12)); (tmp1_im * (int32_t)sss1_ext2[(i<<1)]);
// printf("SSSi(%d,%d) : (%d,%d)\n",aarx,i,sss_ext2[i<<1],sss_ext2[1+(i<<1)]); // printf("SSSi(%d,%d) : (%d,%d)\n",aarx,i,sss_ext2[i<<1],sss_ext2[1+(i<<1)]);
// printf("SSSo(%d,%d) : (%d,%d)\n",aarx,i,tmp_re2,tmp_im2); //printf("SSScomp0(%d,%d) : (%d,%d)\n",aarx,i,tmp0_re2,tmp0_im2);
//printf("SSScomp1(%d,%d) : (%d,%d)\n",aarx,i,tmp1_re2,tmp1_im2);
// MRC on RX antennas // MRC on RX antennas
if (aarx==0) { if (aarx==0) {
sss0_ext3[i<<1] = tmp0_re2; sss0comp[i<<1] = tmp0_re2;
sss0_ext3[1+(i<<1)] = tmp0_im2; sss0comp[1+(i<<1)] = tmp0_im2;
sss1_ext3[i<<1] = tmp1_re2; sss1comp[i<<1] = tmp1_re2;
sss1_ext3[1+(i<<1)] = tmp1_im2; sss1comp[1+(i<<1)] = tmp1_im2;
} else { } else {
sss0_ext3[i<<1] += tmp0_re2; sss0comp[i<<1] += tmp0_re2;
sss0_ext3[1+(i<<1)] += tmp0_im2; sss0comp[1+(i<<1)] += tmp0_im2;
sss1_ext3[i<<1] += tmp1_re2; sss1comp[i<<1] += tmp1_re2;
sss1_ext3[1+(i<<1)] += tmp1_im2; sss1comp[1+(i<<1)] += tmp1_im2;
} }
} }
} }
...@@ -207,7 +211,8 @@ int _do_slpss_sss_extract(PHY_VARS_UE *ue, ...@@ -207,7 +211,8 @@ int _do_slpss_sss_extract(PHY_VARS_UE *ue,
pss1_symb = 2; pss1_symb = 2;
sss0_symb = 11; sss0_symb = 11;
sss1_symb = 12; sss1_symb = 12;
rxdataF = ue->sl_rxdataF; rxdataF = (int32_t**)ue->sl_rxdataF;
pss0_rxF = &rxdataF[aarx][(rx_offset + (pss0_symb*(frame_parms->ofdm_symbol_size)))]; pss0_rxF = &rxdataF[aarx][(rx_offset + (pss0_symb*(frame_parms->ofdm_symbol_size)))];
sss0_rxF = &rxdataF[aarx][(rx_offset + (sss0_symb*(frame_parms->ofdm_symbol_size)))]; sss0_rxF = &rxdataF[aarx][(rx_offset + (sss0_symb*(frame_parms->ofdm_symbol_size)))];
pss1_rxF = &rxdataF[aarx][(rx_offset + (pss1_symb*(frame_parms->ofdm_symbol_size)))]; pss1_rxF = &rxdataF[aarx][(rx_offset + (pss1_symb*(frame_parms->ofdm_symbol_size)))];
...@@ -292,6 +297,9 @@ int rx_slsss(PHY_VARS_UE *ue,int32_t *tot_metric,uint8_t *phase_max,int Nid2) ...@@ -292,6 +297,9 @@ int rx_slsss(PHY_VARS_UE *ue,int32_t *tot_metric,uint8_t *phase_max,int Nid2)
uint8_t i; uint8_t i;
int32_t pss0_ext[4][72],pss1_ext[4][72]; int32_t pss0_ext[4][72],pss1_ext[4][72];
int32_t sss0_ext[4][72],sss1_ext[4][72]; int32_t sss0_ext[4][72],sss1_ext[4][72];
int64_t sss0_comp[72],sss1_comp[72];
int16_t sss0_comp16[144],sss1_comp16[144];
uint8_t phase; uint8_t phase;
uint16_t Nid1; uint16_t Nid1;
int16_t *sss0,*sss1; int16_t *sss0,*sss1;
...@@ -319,12 +327,17 @@ int rx_slsss(PHY_VARS_UE *ue,int32_t *tot_metric,uint8_t *phase_max,int Nid2) ...@@ -319,12 +327,17 @@ int rx_slsss(PHY_VARS_UE *ue,int32_t *tot_metric,uint8_t *phase_max,int Nid2)
memcpy((void*)&ru_tmp.frame_parms,(void*)&ue->frame_parms,sizeof(LTE_DL_FRAME_PARMS)); memcpy((void*)&ru_tmp.frame_parms,(void*)&ue->frame_parms,sizeof(LTE_DL_FRAME_PARMS));
ru_tmp.N_TA_offset=0; ru_tmp.N_TA_offset=0;
ru_tmp.common.rxdata_7_5kHz = (int32_t**)malloc16(ue->frame_parms.nb_antennas_rx*sizeof(int32_t*)); ru_tmp.common.rxdata_7_5kHz = (int32_t**)malloc16(ue->frame_parms.nb_antennas_rx*sizeof(int32_t*));
for (int aa=0;aa<ue->frame_parms.nb_antennas_rx;aa++) ru_tmp.common.rxdata = (int32_t**)malloc16(ue->frame_parms.nb_antennas_rx*sizeof(int32_t*));
ru_tmp.common.rxdata_7_5kHz[aa] = (int32_t*)&ue->common_vars.rxdata_syncSL[aa][ue->rx_offsetSL*2]; for (int aa=0;aa<ue->frame_parms.nb_antennas_rx;aa++) {
ru_tmp.common.rxdata_7_5kHz[aa] = (int32_t*)ue->sl_rxdata_7_5kHz[aa];
ru_tmp.common.rxdata[aa] = (int32_t*)ue->common_vars.rxdata_syncSL[aa];
}
ru_tmp.common.rxdataF = (int32_t**)rxdataF; ru_tmp.common.rxdataF = (int32_t**)rxdataF;
ru_tmp.nb_rx = ue->frame_parms.nb_antennas_rx; ru_tmp.nb_rx = ue->frame_parms.nb_antennas_rx;
remove_7_5_kHz(&ru_tmp,0);
remove_7_5_kHz(&ru_tmp,1);
// PSS // PSS
slot_fep_ul(&ru_tmp,1,0,0); slot_fep_ul(&ru_tmp,1,0,0);
slot_fep_ul(&ru_tmp,2,0,0); slot_fep_ul(&ru_tmp,2,0,0);
...@@ -333,6 +346,7 @@ int rx_slsss(PHY_VARS_UE *ue,int32_t *tot_metric,uint8_t *phase_max,int Nid2) ...@@ -333,6 +346,7 @@ int rx_slsss(PHY_VARS_UE *ue,int32_t *tot_metric,uint8_t *phase_max,int Nid2)
slot_fep_ul(&ru_tmp,5,1,0); slot_fep_ul(&ru_tmp,5,1,0);
free(ru_tmp.common.rxdata_7_5kHz); free(ru_tmp.common.rxdata_7_5kHz);
free(ru_tmp.common.rxdata);
} else { // TDD } else { // TDD
AssertFatal(1==0,"TDD not supported for Sidelink\n"); AssertFatal(1==0,"TDD not supported for Sidelink\n");
} }
...@@ -345,8 +359,12 @@ int rx_slsss(PHY_VARS_UE *ue,int32_t *tot_metric,uint8_t *phase_max,int Nid2) ...@@ -345,8 +359,12 @@ int rx_slsss(PHY_VARS_UE *ue,int32_t *tot_metric,uint8_t *phase_max,int Nid2)
0); 0);
// write_output("rxdataF0.m","rxF0",&rxdataF[0][0],2*14*ue->frame_parms.ofdm_symbol_size,1,1); // write_output("rxdataF0.m","rxF0",&rxdataF[0][0],2*14*ue->frame_parms.ofdm_symbol_size,1,1);
write_output("pss0_ext.m","pss0ext",pss0_ext,72,1,1); /* write_output("pss0_ext.m","pss0ext",pss0_ext,72,1,1);
write_output("sss0_ext.m","sss0ext",sss0_ext,72,1,1); write_output("sss0_ext.m","sss0ext",sss0_ext,72,1,1);
write_output("pss1_ext.m","pss1ext",pss1_ext,72,1,1);
write_output("sss1_ext.m","sss1ext",sss1_ext,72,1,1); */
// exit(-1); // exit(-1);
...@@ -358,18 +376,40 @@ int rx_slsss(PHY_VARS_UE *ue,int32_t *tot_metric,uint8_t *phase_max,int Nid2) ...@@ -358,18 +376,40 @@ int rx_slsss(PHY_VARS_UE *ue,int32_t *tot_metric,uint8_t *phase_max,int Nid2)
sss0_ext, sss0_ext,
pss1_ext, pss1_ext,
sss1_ext, sss1_ext,
sss0_comp,
sss1_comp,
Nid2); Nid2);
write_output("sss0_comp0.m","sss0comp0",sss0_ext,72,1,1); // rescale from 64 to 16 bit resolution keeping 8 bits of dynamic range
write_output("sss1_comp0.m","sss1comp0",sss1_ext,72,1,1); uint32_t maxval=0;
int32_t *sss0comp=(int32_t*)sss0_comp,*sss1comp=(int32_t*)sss1_comp;
for (i=10;i<134;i++) {
if (sss0comp[i] >=0) maxval=(uint64_t)max(maxval,sss0comp[i]);
else maxval=(uint64_t)max(maxval,-sss0comp[i]);
if (sss1comp[i] >=0) maxval=(uint64_t)max(maxval,sss1comp[i]);
else maxval=(uint64_t)max(maxval,-sss1comp[i]);
}
uint8_t log2maxval = log2_approx64(maxval);
uint8_t shift;
if (log2maxval < 8) shift = 0; else shift = log2maxval-8;
for (i=0;i<144;i++) {
sss0_comp16[i] = (int16_t)(sss0comp[i]>>shift);
sss1_comp16[i] = (int16_t)(sss1comp[i]>>shift);
}
/*write_output("sss0_comp0.m","sss0comp0",sss0_comp16,72,1,1);
write_output("sss1_comp0.m","sss1comp0",sss1_comp16,72,1,1);*/
// exit(-1); // exit(-1);
// now do the SSS detection based on the precomputed sequences in PHY/LTE_TRANSPORT/sss.h // now do the SSS detection based on the precomputed sequences in PHY/LTE_TRANSPORT/sss.h
*tot_metric = -99999999; *tot_metric = -99999999;
sss0 = (int16_t*)&sss0_ext[0][5]; sss0 = &sss0_comp16[10];
sss1 = (int16_t*)&sss1_ext[0][5]; sss1 = &sss1_comp16[10];
for (phase=0; phase<7; phase++) { // phase offset between PSS and SSS for (phase=0; phase<7; phase++) { // phase offset between PSS and SSS
......
...@@ -65,6 +65,9 @@ extern const int16_t *primary_synch1_time; //!< index: [0..ofdm_symbol_size*2[ ...@@ -65,6 +65,9 @@ extern const int16_t *primary_synch1_time; //!< index: [0..ofdm_symbol_size*2[
extern const int16_t *primary_synch2_time; //!< index: [0..ofdm_symbol_size*2[ extern const int16_t *primary_synch2_time; //!< index: [0..ofdm_symbol_size*2[
extern const int16_t *primary_synch0SL_time; extern const int16_t *primary_synch0SL_time;
extern const int16_t *primary_synch1SL_time; extern const int16_t *primary_synch1SL_time;
extern int16_t *primary_synch0SL_time_rx;
extern int16_t *primary_synch1SL_time_rx;
extern int *sync_corr_ue0; //!< index [0..10*samples_per_tti[ extern int *sync_corr_ue0; //!< index [0..10*samples_per_tti[
extern int *sync_corr_ue1; //!< index [0..10*samples_per_tti[ extern int *sync_corr_ue1; //!< index [0..10*samples_per_tti[
extern int *sync_corr_ue2; //!< index [0..10*samples_per_tti[ extern int *sync_corr_ue2; //!< index [0..10*samples_per_tti[
......
...@@ -40,6 +40,8 @@ const int16_t *primary_synch2_time; ...@@ -40,6 +40,8 @@ const int16_t *primary_synch2_time;
const int16_t *primary_synch0SL_time; const int16_t *primary_synch0SL_time;
const int16_t *primary_synch1SL_time; const int16_t *primary_synch1SL_time;
int16_t *primary_synch0SL_time_rx;
int16_t *primary_synch1SL_time_rx;
#include "PHY/CODING/vars.h" #include "PHY/CODING/vars.h"
......
...@@ -354,14 +354,15 @@ int main(int argc, char **argv) { ...@@ -354,14 +354,15 @@ int main(int argc, char **argv) {
UE->slss_generated=0; UE->slss_generated=0;
frame = absSF/10; frame = absSF/10;
subframe= absSF%10; subframe= absSF%10;
if (do_SLSS==0) {
check_and_generate_psdch(UE,frame,subframe); check_and_generate_psdch(UE,frame,subframe);
UE->slsch_active = 1; UE->slsch_active = 1;
check_and_generate_pscch(UE,frame,subframe); check_and_generate_pscch(UE,frame,subframe);
proc.subframe_tx = subframe; proc.subframe_tx = subframe;
proc.frame_tx = frame; proc.frame_tx = frame;
check_and_generate_pssch(UE,&proc,frame,subframe); check_and_generate_pssch(UE,&proc,frame,subframe);
}
check_and_generate_slss(UE,frame,subframe); check_and_generate_slss(UE,frame,subframe);
if (UE->psdch_generated>0 || UE->pscch_generated > 0 || UE->pssch_generated > 0 || UE->slss_generated > 0) { if (UE->psdch_generated>0 || UE->pscch_generated > 0 || UE->pssch_generated > 0 || UE->slss_generated > 0) {
AssertFatal(UE->pscch_generated<3,"Illegal pscch_generated %d\n",UE->pscch_generated); AssertFatal(UE->pscch_generated<3,"Illegal pscch_generated %d\n",UE->pscch_generated);
// FEP // FEP
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment