CFO included in pbchsim
This commit is contained in:
@@ -87,10 +87,12 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
int i,l,aa;
|
int i,l,aa;
|
||||||
double sigma2, sigma2_dB=10,SNR,snr0=-2.0,snr1=2.0;
|
double sigma2, sigma2_dB=10,SNR,snr0=-2.0,snr1=2.0;
|
||||||
|
double cfo=0;
|
||||||
uint8_t snr1set=0;
|
uint8_t snr1set=0;
|
||||||
int **txdata;
|
int **txdata;
|
||||||
double **s_re,**s_im,**r_re,**r_im;
|
double **s_re,**s_im,**r_re,**r_im;
|
||||||
double iqim = 0.0;
|
double iqim = 0.0;
|
||||||
|
double ip =0.0;
|
||||||
unsigned char pbch_pdu[6];
|
unsigned char pbch_pdu[6];
|
||||||
// int sync_pos, sync_pos_slot;
|
// int sync_pos, sync_pos_slot;
|
||||||
// FILE *rx_frame_file;
|
// FILE *rx_frame_file;
|
||||||
@@ -118,7 +120,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
double pbch_sinr;
|
double pbch_sinr;
|
||||||
int pbch_tx_ant;
|
int pbch_tx_ant;
|
||||||
int N_RB_DL=273,mu=1;
|
int N_RB_DL=106,mu=1;
|
||||||
|
|
||||||
unsigned char frame_type = 0;
|
unsigned char frame_type = 0;
|
||||||
unsigned char pbch_phase = 0;
|
unsigned char pbch_phase = 0;
|
||||||
@@ -144,7 +146,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
randominit(0);
|
randominit(0);
|
||||||
|
|
||||||
while ((c = getopt (argc, argv, "f:hA:pf:g:i:j:n:s:S:t:x:y:z:N:F:GR:dP:IL:")) != -1) {
|
while ((c = getopt (argc, argv, "f:hA:pf:g:i:j:n:o:s:S:t:x:y:z:N:F:GR:dP:IL:")) != -1) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'f':
|
case 'f':
|
||||||
write_output_file=1;
|
write_output_file=1;
|
||||||
@@ -210,6 +212,11 @@ int main(int argc, char **argv)
|
|||||||
n_trials = atoi(optarg);
|
n_trials = atoi(optarg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'o':
|
||||||
|
cfo = atof(optarg);
|
||||||
|
msg("Setting CFO to %f Hz\n",cfo);
|
||||||
|
break;
|
||||||
|
|
||||||
case 's':
|
case 's':
|
||||||
snr0 = atof(optarg);
|
snr0 = atof(optarg);
|
||||||
msg("Setting SNR0 to %f\n",snr0);
|
msg("Setting SNR0 to %f\n",snr0);
|
||||||
@@ -323,6 +330,7 @@ int main(int argc, char **argv)
|
|||||||
printf("-z Number of RX antennas used in UE\n");
|
printf("-z Number of RX antennas used in UE\n");
|
||||||
printf("-i Relative strength of first intefering eNB (in dB) - cell_id mod 3 = 1\n");
|
printf("-i Relative strength of first intefering eNB (in dB) - cell_id mod 3 = 1\n");
|
||||||
printf("-j Relative strength of second intefering eNB (in dB) - cell_id mod 3 = 2\n");
|
printf("-j Relative strength of second intefering eNB (in dB) - cell_id mod 3 = 2\n");
|
||||||
|
printf("-o Carrier frequency offset in Hz\n");
|
||||||
printf("-N Nid_cell\n");
|
printf("-N Nid_cell\n");
|
||||||
printf("-R N_RB_DL\n");
|
printf("-R N_RB_DL\n");
|
||||||
printf("-O oversampling factor (1,2,4,8,16)\n");
|
printf("-O oversampling factor (1,2,4,8,16)\n");
|
||||||
@@ -358,26 +366,43 @@ int main(int argc, char **argv)
|
|||||||
nr_phy_config_request_sim(gNB,N_RB_DL,N_RB_DL,mu);
|
nr_phy_config_request_sim(gNB,N_RB_DL,N_RB_DL,mu);
|
||||||
phy_init_nr_gNB(gNB,0,0);
|
phy_init_nr_gNB(gNB,0,0);
|
||||||
|
|
||||||
double fs,bw;
|
double fs,bw,scs,eps;
|
||||||
|
|
||||||
if (mu == 1 && N_RB_DL == 217) {
|
if (mu == 1 && N_RB_DL == 217) {
|
||||||
fs = 122.88e6;
|
fs = 122.88e6;
|
||||||
bw = 80e6;
|
bw = 80e6;
|
||||||
|
scs = 30000;
|
||||||
}
|
}
|
||||||
else if (mu == 1 && N_RB_DL == 245) {
|
else if (mu == 1 && N_RB_DL == 245) {
|
||||||
fs = 122.88e6;
|
fs = 122.88e6;
|
||||||
bw = 90e6;
|
bw = 90e6;
|
||||||
|
scs = 30000;
|
||||||
}
|
}
|
||||||
else if (mu == 1 && N_RB_DL == 273) {
|
else if (mu == 1 && N_RB_DL == 273) {
|
||||||
fs = 122.88e6;
|
fs = 122.88e6;
|
||||||
bw = 100e6;
|
bw = 100e6;
|
||||||
|
scs = 30000;
|
||||||
}
|
}
|
||||||
else if (mu == 1 && N_RB_DL == 106) {
|
else if (mu == 1 && N_RB_DL == 106) {
|
||||||
fs = 61.44e6;
|
fs = 61.44e6;
|
||||||
bw = 40e6;
|
bw = 40e6;
|
||||||
|
scs = 30000;
|
||||||
}
|
}
|
||||||
else AssertFatal(1==0,"Unsupported numerology for mu %d, N_RB %d\n",mu, N_RB_DL);
|
else AssertFatal(1==0,"Unsupported numerology for mu %d, N_RB %d\n",mu, N_RB_DL);
|
||||||
|
|
||||||
|
// cfo with respect to sub-carrier spacing
|
||||||
|
eps = cfo/scs;
|
||||||
|
int IFO;
|
||||||
|
|
||||||
|
if(eps!=0.0){
|
||||||
|
printf("Introducing a CFO of %lf relative to SCS of %d kHz\n",eps,(int)(scs/1000));
|
||||||
|
if (eps>0)
|
||||||
|
IFO=(int)(eps+0.5);
|
||||||
|
else
|
||||||
|
IFO=(int)(eps-0.5);
|
||||||
|
printf("FFO = %lf; IFO = %d\n",eps-IFO,IFO);
|
||||||
|
}
|
||||||
|
|
||||||
gNB2UE = new_channel_desc_scm(n_tx,
|
gNB2UE = new_channel_desc_scm(n_tx,
|
||||||
n_rx,
|
n_rx,
|
||||||
channel_model,
|
channel_model,
|
||||||
@@ -490,6 +515,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
// printf("txlev %d (%f)\n",txlev,10*log10(txlev));
|
// printf("txlev %d (%f)\n",txlev,10*log10(txlev));
|
||||||
|
|
||||||
|
|
||||||
for (i=0; i<frame_length_complex_samples; i++) {
|
for (i=0; i<frame_length_complex_samples; i++) {
|
||||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
||||||
r_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]);
|
r_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]);
|
||||||
@@ -512,6 +538,29 @@ int main(int argc, char **argv)
|
|||||||
sigma2 = pow(10,sigma2_dB/10);
|
sigma2 = pow(10,sigma2_dB/10);
|
||||||
// printf("sigma2 %f (%f dB)\n",sigma2,sigma2_dB);
|
// printf("sigma2 %f (%f dB)\n",sigma2,sigma2_dB);
|
||||||
|
|
||||||
|
if(eps!=0.0)
|
||||||
|
rf_rx(r_re, // real part of txdata
|
||||||
|
r_im, // imag part of txdata
|
||||||
|
NULL, // interference real part
|
||||||
|
NULL, // interference imag part
|
||||||
|
0, // interference power
|
||||||
|
frame_parms->nb_antennas_rx, // number of rx antennas
|
||||||
|
frame_length_complex_samples, // number of samples in frame
|
||||||
|
1.0e7/frame_length_complex_samples, //sampling time (ns)
|
||||||
|
cfo, // frequency offset in Hz
|
||||||
|
0.0, // drift (not implemented)
|
||||||
|
0.0, // noise figure (not implemented)
|
||||||
|
0.0, // rx gain in dB ?
|
||||||
|
200, // 3rd order non-linearity in dB ?
|
||||||
|
&ip, // initial phase
|
||||||
|
30.0e3, // phase noise cutoff in kHz
|
||||||
|
-500.0, // phase noise amplitude in dBc
|
||||||
|
0.0, // IQ imbalance (dB),
|
||||||
|
0.0); // IQ phase imbalance (rad)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
for (i=0; i<frame_length_complex_samples; i++) {
|
for (i=0; i<frame_length_complex_samples; i++) {
|
||||||
for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
|
for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
|
||||||
|
|
||||||
|
|||||||
@@ -107,10 +107,10 @@ void rf_rx(double **r_re,
|
|||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fabs(f_off) > 10000.0) {
|
/* if (fabs(f_off) > 10000.0) {
|
||||||
printf("rf.c: Illegal f_off %f\n",f_off);
|
printf("rf.c: Illegal f_off %f\n",f_off);
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}*/
|
||||||
|
|
||||||
if (fabs(drift) > 1000.0) {
|
if (fabs(drift) > 1000.0) {
|
||||||
printf("rf.c: Illegal drift %f\n",drift);
|
printf("rf.c: Illegal drift %f\n",drift);
|
||||||
|
|||||||
Reference in New Issue
Block a user