bugfix for 4096 and 8192-point dfts.
This commit is contained in:
@@ -46,7 +46,7 @@
|
||||
#include "SCHED/extern.h"
|
||||
#include "UTIL/LOG/vcd_signal_dumper.h"
|
||||
|
||||
//#define PRACH_DEBUG 1
|
||||
#define PRACH_DEBUG 1
|
||||
|
||||
uint16_t NCS_unrestricted[16] = {0,13,15,18,22,26,32,38,46,59,76,93,119,167,279,419};
|
||||
uint16_t NCS_restricted[15] = {15,18,22,26,32,38,46,55,68,82,100,128,158,202,237}; // high-speed case
|
||||
@@ -818,11 +818,14 @@ int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint1
|
||||
break;
|
||||
|
||||
case 75:
|
||||
memset((void*)prachF,0,4*19432);
|
||||
memset((void*)prachF,0,4*18432);
|
||||
break;
|
||||
|
||||
case 100:
|
||||
memset((void*)prachF,0,4*24576);
|
||||
if (ue->frame_parms.threequarter_fs == 0)
|
||||
memset((void*)prachF,0,4*24576);
|
||||
else
|
||||
memset((void*)prachF,0,4*18432);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -886,6 +889,9 @@ int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint1
|
||||
break;
|
||||
}
|
||||
|
||||
if (ue->frame_parms.threequarter_fs == 1)
|
||||
Ncp=(Ncp*3)>>2;
|
||||
|
||||
prach2 = prach+(Ncp<<1);
|
||||
|
||||
// do IDFT
|
||||
@@ -986,21 +992,41 @@ int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint1
|
||||
break;
|
||||
|
||||
case 100:
|
||||
if (ue->frame_parms.threequarter_fs == 0) {
|
||||
if (prach_fmt == 4) {
|
||||
idft4096(prachF,prach2,1);
|
||||
memmove( prach, prach+8192, Ncp<<2 );
|
||||
prach_len = 4096+Ncp;
|
||||
} else {
|
||||
idft24576(prachF,prach2);
|
||||
memmove( prach, prach+49152, Ncp<<2 );
|
||||
prach_len = 24576+Ncp;
|
||||
|
||||
if (prach_fmt>1) {
|
||||
memmove( prach2+49152, prach2, 98304 );
|
||||
prach_len = 2* 24576+Ncp;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (prach_fmt == 4) {
|
||||
idft4096(prachF,prach2,1);
|
||||
memmove( prach, prach+8192, Ncp<<2 );
|
||||
prach_len = 4096+Ncp;
|
||||
idft3072(prachF,prach2);
|
||||
//TODO: account for repeated format in dft output
|
||||
memmove( prach, prach+6144, Ncp<<2 );
|
||||
prach_len = 3072+Ncp;
|
||||
} else {
|
||||
idft24576(prachF,prach2);
|
||||
memmove( prach, prach+49152, Ncp<<2 );
|
||||
prach_len = 24576+Ncp;
|
||||
idft18432(prachF,prach2);
|
||||
memmove( prach, prach+36864, Ncp<<2 );
|
||||
prach_len = 18432+Ncp;
|
||||
|
||||
if (prach_fmt>1) {
|
||||
memmove( prach2+49152, prach2, 98304 );
|
||||
prach_len = 2* 24576+Ncp;
|
||||
memmove( prach2+36834, prach2, 73728 );
|
||||
prach_len = 2*18432+Ncp;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1496,7 +1522,7 @@ void rx_prach(PHY_VARS_eNB *eNB,
|
||||
|
||||
#ifdef PRACH_DEBUG
|
||||
|
||||
if (en>40) {
|
||||
// if (en>40) {
|
||||
k = (12*n_ra_prb) - 6*eNB->frame_parms.N_RB_UL;
|
||||
|
||||
if (k<0)
|
||||
@@ -1510,7 +1536,7 @@ void rx_prach(PHY_VARS_eNB *eNB,
|
||||
write_output("prach_rxF_comp0.m","prach_rxF_comp0",prachF,1024,1,1);
|
||||
write_output("prach_ifft0.m","prach_t0",prach_ifft[0],1024,1,1);
|
||||
exit(-1);
|
||||
}
|
||||
// }
|
||||
#endif
|
||||
} // new dft
|
||||
|
||||
|
||||
@@ -5229,7 +5229,7 @@ void dft8192(int16_t *x,int16_t *y,int scale)
|
||||
|
||||
xtmpp = xtmp;
|
||||
|
||||
for (i=0; i<32; i++) {
|
||||
for (i=0; i<16; i++) {
|
||||
transpose4_ooff_simd256(x256 ,xtmpp,512);
|
||||
transpose4_ooff_simd256(x256+2,xtmpp+1,512);
|
||||
transpose4_ooff_simd256(x256+4,xtmpp+2,512);
|
||||
@@ -5267,7 +5267,7 @@ void dft8192(int16_t *x,int16_t *y,int scale)
|
||||
}
|
||||
|
||||
dft4096((int16_t*)(xtmp),(int16_t*)ytmp,1);
|
||||
dft4096((int16_t*)(xtmp+1024),(int16_t*)(ytmp+512),1);
|
||||
dft4096((int16_t*)(xtmp+512),(int16_t*)(ytmp+512),1);
|
||||
|
||||
|
||||
for (i=0; i<512; i++) {
|
||||
@@ -5319,7 +5319,7 @@ void idft8192(int16_t *x,int16_t *y,int scale)
|
||||
|
||||
xtmpp = xtmp;
|
||||
|
||||
for (i=0; i<32; i++) {
|
||||
for (i=0; i<16; i++) {
|
||||
transpose4_ooff_simd256(x256 ,xtmpp,512);
|
||||
transpose4_ooff_simd256(x256+2,xtmpp+1,512);
|
||||
transpose4_ooff_simd256(x256+4,xtmpp+2,512);
|
||||
@@ -5357,7 +5357,7 @@ void idft8192(int16_t *x,int16_t *y,int scale)
|
||||
}
|
||||
|
||||
idft4096((int16_t*)(xtmp),(int16_t*)ytmp,1);
|
||||
idft4096((int16_t*)(xtmp+1024),(int16_t*)(ytmp+512),1);
|
||||
idft4096((int16_t*)(xtmp+512),(int16_t*)(ytmp+512),1);
|
||||
|
||||
|
||||
for (i=0; i<512; i++) {
|
||||
@@ -5733,8 +5733,8 @@ void dft24576(int16_t *input, int16_t *output)
|
||||
void idft24576(int16_t *input, int16_t *output)
|
||||
{
|
||||
int i,i2,j;
|
||||
uint32_t tmp[3][16384] __attribute__((aligned(32)));
|
||||
uint32_t tmpo[3][16384] __attribute__((aligned(32)));
|
||||
uint32_t tmp[3][8192] __attribute__((aligned(32)));
|
||||
uint32_t tmpo[3][8192] __attribute__((aligned(32)));
|
||||
|
||||
for (i=0,j=0; i<8192; i++) {
|
||||
tmp[0][i] = ((uint32_t *)input)[j++];
|
||||
@@ -5746,13 +5746,6 @@ void idft24576(int16_t *input, int16_t *output)
|
||||
idft8192((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]),1);
|
||||
idft8192((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]),1);
|
||||
|
||||
/*
|
||||
for (i=1; i<8192; i++) {
|
||||
tmpo[0][i] = tmpo[0][i<<1];
|
||||
tmpo[1][i] = tmpo[1][i<<1];
|
||||
tmpo[2][i] = tmpo[2][i<<1];
|
||||
}*/
|
||||
|
||||
/*
|
||||
write_output("in.m","in",input,24576,1,1);
|
||||
write_output("out0.m","o0",tmpo[0],8192,1,1);
|
||||
@@ -19129,6 +19122,55 @@ int main(int argc, char**argv)
|
||||
write_output("y2048.m","y2048",y,2048,1,1);
|
||||
write_output("x2048.m","x2048",x,2048,1,1);
|
||||
|
||||
memset((void*)x,0,2048*sizeof(int32_t));
|
||||
for (i=2;i<2402;i++) {
|
||||
if ((taus() & 1)==0)
|
||||
((int16_t*)x)[i] = 364;
|
||||
else
|
||||
((int16_t*)x)[i] = -364;
|
||||
}
|
||||
for (i=2*(4096-1200);i<8192;i++) {
|
||||
if ((taus() & 1)==0)
|
||||
((int16_t*)x)[i] = 364;
|
||||
else
|
||||
((int16_t*)x)[i] = -364;
|
||||
}
|
||||
reset_meas(&ts);
|
||||
|
||||
for (i=0; i<10000; i++) {
|
||||
start_meas(&ts);
|
||||
idft4096((int16_t *)x,(int16_t *)y,1);
|
||||
stop_meas(&ts);
|
||||
}
|
||||
|
||||
printf("\n\n4096-point(%f cycles)\n",(double)ts.diff/(double)ts.trials);
|
||||
write_output("y4096.m","y4096",y,4096,1,1);
|
||||
write_output("x4096.m","x4096",x,4096,1,1);
|
||||
|
||||
memset((void*)x,0,8192*sizeof(int32_t));
|
||||
for (i=2;i<4802;i++) {
|
||||
if ((taus() & 1)==0)
|
||||
((int16_t*)x)[i] = 364;
|
||||
else
|
||||
((int16_t*)x)[i] = -364;
|
||||
}
|
||||
for (i=2*(4096-1200);i<8192;i++) {
|
||||
if ((taus() & 1)==0)
|
||||
((int16_t*)x)[i] = 364;
|
||||
else
|
||||
((int16_t*)x)[i] = -364;
|
||||
}
|
||||
reset_meas(&ts);
|
||||
for (i=0; i<10000; i++) {
|
||||
start_meas(&ts);
|
||||
idft8192((int16_t *)x,(int16_t *)y,1);
|
||||
stop_meas(&ts);
|
||||
}
|
||||
|
||||
printf("\n\n8192-point(%f cycles)\n",(double)ts.diff/(double)ts.trials);
|
||||
write_output("y8192.m","y8192",y,8192,1,1);
|
||||
write_output("x8192.m","x8192",x,8192,1,1);
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -104,13 +104,15 @@ int main(int argc, char **argv)
|
||||
double delay_avg=0;
|
||||
double ue_speed = 0;
|
||||
int NCS_config = 1,rootSequenceIndex=0;
|
||||
int threequarter_fs = 0;
|
||||
|
||||
logInit();
|
||||
|
||||
number_of_cards = 1;
|
||||
|
||||
|
||||
|
||||
while ((c = getopt (argc, argv, "hHaA:Cr:p:g:n:s:S:t:x:y:v:V:z:N:F:d:Z:L:R:")) != -1) {
|
||||
while ((c = getopt (argc, argv, "hHaA:Cr:p:g:n:s:S:t:x:y:v:V:z:N:F:d:Z:L:R:E")) != -1) {
|
||||
switch (c) {
|
||||
case 'a':
|
||||
printf("Running AWGN simulation\n");
|
||||
@@ -182,6 +184,10 @@ int main(int argc, char **argv)
|
||||
|
||||
break;
|
||||
|
||||
case 'E':
|
||||
threequarter_fs=1;
|
||||
break;
|
||||
|
||||
case 'n':
|
||||
n_frames = atoi(optarg);
|
||||
break;
|
||||
@@ -316,7 +322,7 @@ int main(int argc, char **argv)
|
||||
Nid_cell,
|
||||
3,
|
||||
N_RB_DL,
|
||||
0,
|
||||
threequarter_fs,
|
||||
osf,
|
||||
0);
|
||||
|
||||
@@ -395,8 +401,9 @@ int main(int argc, char **argv)
|
||||
eNB->frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag=hs_flag;
|
||||
eNB->frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset=0;
|
||||
|
||||
eNB->node_function = eNodeB_3GPP;
|
||||
eNB->proc.subframe_rx = subframe;
|
||||
eNB->node_function = eNodeB_3GPP;
|
||||
eNB->proc.subframe_rx = subframe;
|
||||
eNB->proc.subframe_prach = subframe;
|
||||
|
||||
/* N_ZC not used later, so prach_fmt is also useless, don't set */
|
||||
//prach_fmt = get_prach_fmt(eNB->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex,
|
||||
@@ -530,7 +537,7 @@ int main(int argc, char **argv)
|
||||
write_output("rxsig0.m","rxs0",
|
||||
&eNB->common_vars.rxdata[0][0][subframe*frame_parms->samples_per_tti],
|
||||
frame_parms->samples_per_tti,1,1);
|
||||
write_output("rxsigF0.m","rxsF0", &eNB->common_vars.rxdataF[0][0][0],512*nsymb*2,2,1);
|
||||
write_output("rxsigF0.m","rxsF0", eNB->prach_vars.rxsigF[0],6144,1,1);
|
||||
write_output("prach_preamble.m","prachp",&eNB->X_u[0],839,1,1);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user