Commit 4c183005 authored by Raymond Knopp's avatar Raymond Knopp

bugfix for pucch format 1b, enhancement to pucchsim for format 1x.

parent 08b8b314
...@@ -490,7 +490,7 @@ void generate_pucch1x(int32_t **txdataF, ...@@ -490,7 +490,7 @@ void generate_pucch1x(int32_t **txdataF,
// printf("d0 %d\n",d0); // printf("d0 %d\n",d0);
break; break;
case pucch_format1b: //QPSK 2-bits (Table 5.4.1-1 from 36.211, pg. 18) case pucch_format1b: //QPSK 2-bits (Table 5.4.1-1 from 36.211)
if (((payload[0]&1)==0) && ((payload[1]&1)==0)) {// 1 if (((payload[0]&1)==0) && ((payload[1]&1)==0)) {// 1
((int16_t *)&zptr[n])[0] = ((int32_t)amp*ref_re)>>15; ((int16_t *)&zptr[n])[0] = ((int32_t)amp*ref_re)>>15;
((int16_t *)&zptr[n])[1] = ((int32_t)amp*ref_im)>>15; ((int16_t *)&zptr[n])[1] = ((int32_t)amp*ref_im)>>15;
...@@ -2023,7 +2023,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, ...@@ -2023,7 +2023,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB,
tmp_re = (int16_t)(((int32_t)alpha_re[alpha_ind] * ul_ref_sigs[u][v][0][n<<1] - (int32_t)alpha_im[alpha_ind] * ul_ref_sigs[u][v][0][1+(n<<1)])>>15); tmp_re = (int16_t)(((int32_t)alpha_re[alpha_ind] * ul_ref_sigs[u][v][0][n<<1] - (int32_t)alpha_im[alpha_ind] * ul_ref_sigs[u][v][0][1+(n<<1)])>>15);
tmp_im = (int16_t)(((int32_t)alpha_re[alpha_ind] * ul_ref_sigs[u][v][0][1+(n<<1)] + (int32_t)alpha_im[alpha_ind] * ul_ref_sigs[u][v][0][n<<1])>>15); tmp_im = (int16_t)(((int32_t)alpha_re[alpha_ind] * ul_ref_sigs[u][v][0][1+(n<<1)] + (int32_t)alpha_im[alpha_ind] * ul_ref_sigs[u][v][0][n<<1])>>15);
// this is S(ns)*w_noc(m)*r_uv^alpha(n) // this is S(ns)*w_noc(m)*r_uv^alpha(n), conjugated for received (minus in imaginary term)
zptr[n<<1] = (tmp_re*W_re - tmp_im*W_im)>>15; zptr[n<<1] = (tmp_re*W_re - tmp_im*W_im)>>15;
zptr[1+(n<<1)] = -(tmp_re*W_im + tmp_im*W_re)>>15; zptr[1+(n<<1)] = -(tmp_re*W_im + tmp_im*W_re)>>15;
...@@ -2339,8 +2339,8 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, ...@@ -2339,8 +2339,8 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB,
off=(re<<1) + (24*l); off=(re<<1) + (24*l);
tmp_re = ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15); tmp_re = ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15);
tmp_im = ((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15); tmp_im = ((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15);
stat_re += (((tmp_re*chest_re)>>15) + ((tmp_im*chest_im)>>15)/4); stat_re += (((tmp_re*chest_re)>>15) + ((tmp_im*chest_im)>>15))/4;
stat_im += (((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15)/4); stat_im += (((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15))/4;
off+=2; off+=2;
#ifdef DEBUG_PUCCH_RX #ifdef DEBUG_PUCCH_RX
printf("[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re, printf("[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re,
...@@ -2364,7 +2364,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, ...@@ -2364,7 +2364,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB,
printf("[eNB] PUCCH subframe %d l %d re %d chest2 => (%d,%d)\n",subframe,l,re, printf("[eNB] PUCCH subframe %d l %d re %d chest2 => (%d,%d)\n",subframe,l,re,
chest_re,chest_im); chest_re,chest_im);
#endif #endif
// note sign of Re/Im components indicate that Ch. Estimate is conjugated
for (l=0; l<2; l++) { for (l=0; l<2; l++) {
off=(re<<1) + (24*l) + (nsymb>>1)*24; off=(re<<1) + (24*l) + (nsymb>>1)*24;
tmp_re = ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15); tmp_re = ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15);
...@@ -2379,7 +2379,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, ...@@ -2379,7 +2379,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB,
stat_re,stat_im); stat_re,stat_im);
#endif #endif
} }
// note sign of Re/Im components indicate that Ch. Estimate is conjugated
for (l=(nsymb>>1)-2; l<(nsymb>>1)-1; l++) { for (l=(nsymb>>1)-2; l<(nsymb>>1)-1; l++) {
off=(re<<1) + (24*l) + (nsymb>>1)*24; off=(re<<1) + (24*l) + (nsymb>>1)*24;
tmp_re = ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15); tmp_re = ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15);
...@@ -2402,10 +2402,6 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, ...@@ -2402,10 +2402,6 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB,
} //re } //re
} // aa } // aa
#ifdef DEBUG_PUCCH_RX
LOG_I(PHY,"PUCCH 1a/b: subframe %d : stat %d,%d (pos %d)\n",subframe,stat_re,stat_im,
(subframe<<10) + (eNB->pucch1ab_stats_cnt[UE_id][subframe]));
#endif
eNB->pucch1ab_stats[UE_id][(subframe<<11) + 2*(eNB->pucch1ab_stats_cnt[UE_id][subframe])] = (stat_re); eNB->pucch1ab_stats[UE_id][(subframe<<11) + 2*(eNB->pucch1ab_stats_cnt[UE_id][subframe])] = (stat_re);
eNB->pucch1ab_stats[UE_id][(subframe<<11) + 1+2*(eNB->pucch1ab_stats_cnt[UE_id][subframe])] = (stat_im); eNB->pucch1ab_stats[UE_id][(subframe<<11) + 1+2*(eNB->pucch1ab_stats_cnt[UE_id][subframe])] = (stat_im);
...@@ -2415,10 +2411,19 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, ...@@ -2415,10 +2411,19 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB,
T(T_ENB_PHY_PUCCH_1AB_IQ, T_INT(eNB->Mod_id), T_INT(UE_id), T_INT(-1), T_INT(subframe), T_INT(stat_re), T_INT(stat_im)); T(T_ENB_PHY_PUCCH_1AB_IQ, T_INT(eNB->Mod_id), T_INT(UE_id), T_INT(-1), T_INT(subframe), T_INT(stat_re), T_INT(stat_im));
*payload = (stat_re<0) ? 1 : 0; if (fmt == pucch_format1a) *payload = (stat_re<0) ? 1 : 0;
else if (fmt == pucch_format1b) { // use format1b constellation in Table 5.4.1-1 from 36.211
//NOTE HERE: The second case should be the other way around
if (abs(stat_re)>abs(stat_im)) {
*payload = (stat_re<0)? 1 : 0;
*(1+payload) = *payload;
}
else {
*payload = (stat_im<0) ? 1 : 0;
*(1+payload) = 1-*payload;
}
}
if (fmt==pucch_format1b)
*(1+payload) = (stat_im<0) ? 1 : 0;
} else { // insufficient energy on PUCCH so NAK } else { // insufficient energy on PUCCH so NAK
*payload = 0; *payload = 0;
((int16_t*)&eNB->pucch1ab_stats[UE_id][(subframe<<10) + (eNB->pucch1ab_stats_cnt[UE_id][subframe])])[0] = (int16_t)(stat_re); ((int16_t*)&eNB->pucch1ab_stats[UE_id][(subframe<<10) + (eNB->pucch1ab_stats_cnt[UE_id][subframe])])[0] = (int16_t)(stat_re);
......
...@@ -39,6 +39,9 @@ ...@@ -39,6 +39,9 @@
#include "UTIL/LOG/log_extern.h" #include "UTIL/LOG/log_extern.h"
#include "unitary_defs.h" #include "unitary_defs.h"
#include "assertions.h"
char pucch_stats_string1[100],pucch_stats_string2[100];
int current_dlsch_cqi; //FIXME! int current_dlsch_cqi; //FIXME!
...@@ -57,23 +60,29 @@ int main(int argc, char **argv) ...@@ -57,23 +60,29 @@ int main(int argc, char **argv)
int i,l,aa; int i,l,aa;
double sigma2, sigma2_dB=0,SNR,snr0=-2.0,snr1=0.0; double sigma2, sigma2_dB=0,SNR,snr0=-2.0,snr1=0.0;
uint8_t snr1set=0; uint8_t snr1set=0;
//mod_sym_t **txdataF;
int **txdata;
double s_re0[30720],s_re1[30720],s_im0[30720],s_im1[30720],r_re0[30720],r_im0[30720],r_re1[30720],r_im1[30720]; double s_re0[30720],s_re1[30720],s_im0[30720],s_im1[30720],r_re0[30720],r_im0[30720],r_re1[30720],r_im1[30720];
double s_re0i0[30720],s_re1i0[30720],s_im0i0[30720],s_im1i0[30720],r_re0i0[30720],r_im0i0[30720],r_re1i0[30720],r_im1i0[30720];
double *s_re[2]={s_re0,s_re1}; double *s_re[2]={s_re0,s_re1};
double *s_im[2]={s_im0,s_im1}; double *s_im[2]={s_im0,s_im1};
double *r_re[2]={r_re0,r_re1}; double *r_re[2]={r_re0,r_re1};
double *r_im[2]={r_im0,r_im1}; double *r_im[2]={r_im0,r_im1};
double *s_rei0[2]={s_re0i0,s_re1i0};
double *s_imi0[2]={s_im0i0,s_im1i0};
double *r_rei0[2]={r_re0i0,r_re1i0};
double *r_imi0[2]={r_im0i0,r_im1i0};
double ricean_factor=0.0000005,iqim=0.0; double ricean_factor=0.0000005,iqim=0.0;
int32_t txd[30720];
int32_t *txdatai0[2]={txd,NULL};
int32_t txFi0[2048*14];
int32_t *txdataFi0[2]={txFi0,NULL};
int trial, n_trials, ntrials=1, n_errors; int trial, n_trials, ntrials=1, n_errors;
uint8_t transmission_mode = 1,n_tx=1,n_rx=1; uint8_t transmission_mode = 1,n_tx=1,n_rx=1;
unsigned char eNB_id = 0;
uint16_t Nid_cell=0; uint16_t Nid_cell=0;
int n_frames=1; int n_frames=1;
channel_desc_t *UE2eNB; channel_desc_t *UE2eNB;
uint32_t nsymb,tx_lev; uint32_t nsymb,tx_lev,tx_levi0;
uint8_t extended_prefix_flag=0; uint8_t extended_prefix_flag=0;
LTE_DL_FRAME_PARMS *frame_parms; LTE_DL_FRAME_PARMS *frame_parms;
...@@ -89,26 +98,27 @@ int main(int argc, char **argv) ...@@ -89,26 +98,27 @@ int main(int argc, char **argv)
PUCCH_FMT_t pucch_format = pucch_format1; PUCCH_FMT_t pucch_format = pucch_format1;
PUCCH_CONFIG_DEDICATED pucch_config_dedicated; PUCCH_CONFIG_DEDICATED pucch_config_dedicated;
uint8_t subframe=0; uint8_t subframe=0;
uint8_t pucch_payload,pucch_payload_rx; uint8_t pucch_payload[2],pucch_payloadi0[2],pucch_payload_rx[2];
uint8_t pucch3_payload_size=7; uint8_t pucch3_payload_size=7;
uint8_t pucch3_payload[21],pucch3_payload_rx[21]; uint8_t pucch3_payload[21],pucch3_payload_rx[21];
double tx_gain=1.0; double tx_gain=1.0,tx_gaini0=1.0;
int32_t stat; int32_t stat;
double stat_no_sig,stat_sig; double stat_no_sig,stat_sig;
uint8_t N0=40; uint8_t N0=40;
uint8_t pucch1_thres=10; uint8_t pucch1_thres=10;
uint16_t n1_pucch = 0; uint16_t n1_pucch = 0,n1_pucchi0;
uint16_t n2_pucch = 0; uint16_t n2_pucch = 0;
uint16_t n3_pucch = 20; uint16_t n3_pucch = 20;
uint16_t n_rnti=0x1234; uint16_t n_rnti=0x1234;
int imode=-1;
number_of_cards = 1; number_of_cards = 1;
cpuf = get_cpu_freq_GHz(); cpuf = get_cpu_freq_GHz();
while ((c = getopt (argc, argv, "har:pf:g:n:s:S:x:y:z:N:F:T:R:")) != -1) { while ((c = getopt (argc, argv, "har:pf:g:n:s:S:x:y:z:N:F:T:R:I:")) != -1) {
switch (c) { switch (c) {
case 'a': case 'a':
printf("Running AWGN simulation\n"); printf("Running AWGN simulation\n");
...@@ -268,6 +278,10 @@ int main(int argc, char **argv) ...@@ -268,6 +278,10 @@ int main(int argc, char **argv)
case 'F': case 'F':
break; break;
case 'I':
imode = atoi(optarg);
AssertFatal(imode<10,"Please provide an interference level 0..10\n");
break;
default: default:
case 'h': case 'h':
printf("%s -h(elp) -a(wgn on) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -r Ricean_FactordB -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -N CellId\n", printf("%s -h(elp) -a(wgn on) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -r Ricean_FactordB -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -N CellId\n",
...@@ -291,14 +305,17 @@ int main(int argc, char **argv) ...@@ -291,14 +305,17 @@ int main(int argc, char **argv)
printf("-O oversampling factor (1,2,4,8,16)\n"); printf("-O oversampling factor (1,2,4,8,16)\n");
printf("-f PUCCH format (0=1,1=1a,2=1b,6=3), formats 2/2a/2b not supported\n"); printf("-f PUCCH format (0=1,1=1a,2=1b,6=3), formats 2/2a/2b not supported\n");
printf("-F Input filename (.txt format) for RX conformance testing\n"); printf("-F Input filename (.txt format) for RX conformance testing\n");
printf("-I interference mode (0=1 interferer equal strength, 1=1 interferer +5dB,2=1 interferer +10dB\n");
exit (-1); exit (-1);
break; break;
} }
} }
logInit(); logInit();
set_taus_seed(0x1234);
//itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info, messages_definition_xml, NULL); //itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info, messages_definition_xml, NULL);
g_log->log_component[PHY].level = LOG_DEBUG; g_log->log_component[PHY].level = LOG_INFO;
g_log->log_component[PHY].flag = LOG_HIGH; g_log->log_component[PHY].flag = LOG_HIGH;
if (transmission_mode==2) if (transmission_mode==2)
...@@ -330,8 +347,6 @@ int main(int argc, char **argv) ...@@ -330,8 +347,6 @@ int main(int argc, char **argv)
frame_parms = &eNB->frame_parms; frame_parms = &eNB->frame_parms;
txdata = eNB->common_vars.txdata[eNB_id];
nsymb = (frame_parms->Ncp == 0) ? 14 : 12; nsymb = (frame_parms->Ncp == 0) ? 14 : 12;
printf("FFT Size %d, Extended Prefix %d, Samples per subframe %d, Symbols per subframe %d\n",NUMBER_OF_OFDM_CARRIERS, printf("FFT Size %d, Extended Prefix %d, Samples per subframe %d, Symbols per subframe %d\n",NUMBER_OF_OFDM_CARRIERS,
...@@ -340,8 +355,8 @@ int main(int argc, char **argv) ...@@ -340,8 +355,8 @@ int main(int argc, char **argv)
printf("[SIM] Using SCM/101\n"); printf("[SIM] Using SCM/101\n");
UE2eNB = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx, UE2eNB = new_channel_desc_scm(1,
UE->frame_parms.nb_antennas_rx, eNB->frame_parms.nb_antennas_rx,
channel_model, channel_model,
N_RB2sampling_rate(eNB->frame_parms.N_RB_UL), N_RB2sampling_rate(eNB->frame_parms.N_RB_UL),
N_RB2channel_bandwidth(eNB->frame_parms.N_RB_UL), N_RB2channel_bandwidth(eNB->frame_parms.N_RB_UL),
...@@ -349,6 +364,7 @@ int main(int argc, char **argv) ...@@ -349,6 +364,7 @@ int main(int argc, char **argv)
0, 0,
0); 0);
channel_desc_t *tmp_desc = UE2eNB;
if (UE2eNB==NULL) { if (UE2eNB==NULL) {
printf("Problem generating channel model. Exiting.\n"); printf("Problem generating channel model. Exiting.\n");
...@@ -370,8 +386,27 @@ int main(int argc, char **argv) ...@@ -370,8 +386,27 @@ int main(int argc, char **argv)
UE->frame_parms.pucch_config_common.nCS_AN = 6; UE->frame_parms.pucch_config_common.nCS_AN = 6;
for (SNR=snr0; SNR<snr1; SNR+=.2) {
printf("n_frames %d SNR %f\n",n_frames,SNR);
n_errors = 0;
pucch_tx = 0;
pucch1_missed=0;
pucch1_false=0;
pucch3_false=0;
stat_no_sig = 0;
stat_sig = 0;
for (trial=0; trial<n_frames; trial++) {
if( (pucch_format == pucch_format1) || (pucch_format == pucch_format1a) || (pucch_format == pucch_format1b) ){ if( (pucch_format == pucch_format1) || (pucch_format == pucch_format1a) || (pucch_format == pucch_format1b) ){
pucch_payload = 0; pucch_payload[0] = taus()&1;
pucch_payload[1] = taus()&1;
generate_pucch1x(UE->common_vars.txdataF, generate_pucch1x(UE->common_vars.txdataF,
frame_parms, frame_parms,
UE->ncs_cell, UE->ncs_cell,
...@@ -379,9 +414,27 @@ int main(int argc, char **argv) ...@@ -379,9 +414,27 @@ int main(int argc, char **argv)
&pucch_config_dedicated, &pucch_config_dedicated,
n1_pucch, n1_pucch,
0, //shortened_format, 0, //shortened_format,
&pucch_payload, pucch_payload,
AMP, //amp, AMP, //amp,
subframe); //subframe subframe); //subframe
if (imode>=0) {
pucch_payloadi0[0] = taus()&1;
pucch_payloadi0[1] = taus()&1;
n1_pucchi0 = taus()&2047;
while (n1_pucchi0!=n1_pucch)
n1_pucchi0 = taus()&2047;
generate_pucch1x((int32_t**)txdataFi0,
frame_parms,
UE->ncs_cell,
pucch_format,
&pucch_config_dedicated,
n1_pucchi0,
0, //shortened_format,
pucch_payloadi0,
AMP, //amp,
0); //subframe
}
}else if( pucch_format == pucch_format3){ }else if( pucch_format == pucch_format3){
for(i=0;i<pucch3_payload_size;i++) for(i=0;i<pucch3_payload_size;i++)
pucch3_payload[i]=(uint8_t)(taus()&0x1); pucch3_payload[i]=(uint8_t)(taus()&0x1);
...@@ -397,75 +450,73 @@ int main(int argc, char **argv) ...@@ -397,75 +450,73 @@ int main(int argc, char **argv)
subframe, //subframe subframe, //subframe
n_rnti); //rnti n_rnti); //rnti
} }
write_output("txsigF0.m","txsF0", &UE->common_vars.txdataF[0][2*subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*nsymb,1,1);
tx_lev = 0; tx_lev = 0;
tx_levi0 = 0;
for (aa=0; aa<1; aa++) {
for (aa=0; aa<eNB->frame_parms.nb_antennas_tx; aa++) { if (frame_parms->Ncp == 1) {
if (frame_parms->Ncp == 1) PHY_ofdm_mod(&UE->common_vars.txdataF[aa][subframe*frame_parms->samples_per_tti], // input,
PHY_ofdm_mod(&UE->common_vars.txdataF[aa][2*subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX], // input, &UE->common_vars.txdata[aa][eNB->frame_parms.samples_per_tti*subframe], // output
&txdata[aa][eNB->frame_parms.samples_per_tti*subframe], // output
frame_parms->ofdm_symbol_size, frame_parms->ofdm_symbol_size,
nsymb, // number of symbols nsymb, // number of symbols
frame_parms->nb_prefix_samples, // number of prefix samples frame_parms->nb_prefix_samples, // number of prefix samples
CYCLIC_PREFIX); CYCLIC_PREFIX);
if (imode>=0)
PHY_ofdm_mod(&txdataFi0[0][0], // input,
&txdatai0[0][0], // output
frame_parms->ofdm_symbol_size,
nsymb, // number of symbols
frame_parms->nb_prefix_samples, // number of prefix samples
CYCLIC_PREFIX);
}
else { else {
normal_prefix_mod(&UE->common_vars.txdataF[eNB_id][subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX], normal_prefix_mod(&UE->common_vars.txdataF[aa][subframe*frame_parms->samples_per_tti],
&txdata[aa][eNB->frame_parms.samples_per_tti*subframe], &UE->common_vars.txdata[aa][eNB->frame_parms.samples_per_tti*subframe],
nsymb, nsymb,
frame_parms); frame_parms);
//apply_7_5_kHz(UE,UE->common_vars.txdata[aa],subframe<<1); apply_7_5_kHz(UE,&UE->common_vars.txdata[aa][eNB->frame_parms.samples_per_tti*subframe],0);
//apply_7_5_kHz(UE,UE->common_vars.txdata[aa],1+(subframe<<1)); apply_7_5_kHz(UE,&UE->common_vars.txdata[aa][eNB->frame_parms.samples_per_tti*subframe],1);
apply_7_5_kHz(UE,&txdata[aa][eNB->frame_parms.samples_per_tti*subframe],0); if (imode>=0) {
apply_7_5_kHz(UE,&txdata[aa][eNB->frame_parms.samples_per_tti*subframe],1); normal_prefix_mod(&txdataFi0[0][0],
&txdatai0[0][0],
nsymb,
frame_parms);
apply_7_5_kHz(UE,&txdatai0[0][0],0);
apply_7_5_kHz(UE,&txdatai0[0][0],1);
} }
}
tx_lev += signal_energy(&txdata[aa][subframe*eNB->frame_parms.samples_per_tti], tx_lev += signal_energy(&UE->common_vars.txdata[aa][subframe*eNB->frame_parms.samples_per_tti],
OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES);
if (imode>=0)
tx_levi0 += signal_energy(&txdatai0[0][0],
OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES); OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES);
} }
write_output("txsig0.m","txs0", txdata[0], FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
//write_output("txsig1.m","txs1", txdata[1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
// multipath channel for (i=0; i<frame_parms->samples_per_tti; i++) {
s_re[0][i] = ((double)(((short *)&UE->common_vars.txdata[0][subframe*frame_parms->samples_per_tti]))[(i<<1)]);
for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) { s_im[0][i] = ((double)(((short *)&UE->common_vars.txdata[0][subframe*frame_parms->samples_per_tti]))[(i<<1)+1]);
for (aa=0; aa<eNB->frame_parms.nb_antennas_tx; aa++) { if (imode>=0) {
s_re[aa][i] = ((double)(((short *)&txdata[aa][subframe*frame_parms->samples_per_tti]))[(i<<1)]); s_rei0[0][i] = ((double)(((short *)&txdatai0[0]))[(i<<1)]);
s_im[aa][i] = ((double)(((short *)&txdata[aa][subframe*frame_parms->samples_per_tti]))[(i<<1)+1]); s_imi0[0][i] = ((double)(((short *)&txdatai0[0]))[(i<<1)+1]);
} }
} }
AssertFatal(tmp_desc == UE2eNB, "UE2eNB overwritten\n");
for (SNR=snr0; SNR<snr1; SNR+=.2) {
printf("n_frames %d SNR %f\n",n_frames,SNR);
n_errors = 0;
pucch_tx = 0;
pucch1_missed=0;
pucch1_false=0;
pucch3_false=0;
stat_no_sig = 0;
stat_sig = 0;
for (trial=0; trial<n_frames; trial++) {
multipath_channel(UE2eNB,s_re,s_im,r_re,r_im, multipath_channel(UE2eNB,s_re,s_im,r_re,r_im,
eNB->frame_parms.samples_per_tti,0); eNB->frame_parms.samples_per_tti,0);
if (imode>=0)
sigma2_dB = N0;//10*log10((double)tx_lev) - SNR; multipath_channel(UE2eNB,s_rei0,s_imi0,r_rei0,r_imi0,
eNB->frame_parms.samples_per_tti,0);
sigma2_dB = N0;
tx_gain = sqrt(pow(10.0,.1*(N0+SNR))/(double)tx_lev); tx_gain = sqrt(pow(10.0,.1*(N0+SNR))/(double)tx_lev);
if (imode>=0) tx_gaini0 = sqrt(pow(10.0,.1*(N0+SNR+imode))/(double)tx_levi0);
if (n_frames==1) if (n_frames==1)
printf("sigma2_dB %f (SNR %f dB) tx_lev_dB %f,tx_gain %f (%f dB)\n",sigma2_dB,SNR,10*log10((double)tx_lev),tx_gain,20*log10(tx_gain)); printf("sigma2_dB %f (SNR %f dB) tx_lev_dB %f,tx_gain %f (%f dB)\n",sigma2_dB,SNR,10*log10((double)tx_lev),tx_gain,20*log10(tx_gain));
...@@ -506,8 +557,6 @@ int main(int argc, char **argv) ...@@ -506,8 +557,6 @@ int main(int argc, char **argv)
} }
} }
for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) { for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) {
for (aa=0; aa<eNB->frame_parms.nb_antennas_rx; aa++) { for (aa=0; aa<eNB->frame_parms.nb_antennas_rx; aa++) {
if (n_trials==0) { if (n_trials==0) {
...@@ -519,6 +568,10 @@ int main(int argc, char **argv) ...@@ -519,6 +568,10 @@ int main(int argc, char **argv)
if (sig==1) { if (sig==1) {
((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] = (short) (((tx_gain*r_re[aa][i]) +sqrt(sigma2/2)*gaussdouble(0.0,1.0))); ((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] = (short) (((tx_gain*r_re[aa][i]) +sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i+1] = (short) (((tx_gain*r_im[aa][i]) + (iqim*r_re[aa][i]*tx_gain) + sqrt(sigma2/2)*gaussdouble(0.0,1.0))); ((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i+1] = (short) (((tx_gain*r_im[aa][i]) + (iqim*r_re[aa][i]*tx_gain) + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
if (imode>=0) {
((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] += (short) (tx_gaini0*r_rei0[aa][i]) ;
((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] += (short) (tx_gaini0*r_imi0[aa][i]) ;
}
} else { } else {
((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0))); ((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i+1] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0))); ((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i+1] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
...@@ -527,6 +580,12 @@ int main(int argc, char **argv) ...@@ -527,6 +580,12 @@ int main(int argc, char **argv)
} }
} }
if ((n_frames==1)&&(n_trials==0)) {
printf("rx_level data symbol %f\n",
10*log10((double)signal_energy(&eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES)));
}
remove_7_5_kHz(eNB,subframe<<1); remove_7_5_kHz(eNB,subframe<<1);
remove_7_5_kHz(eNB,1+(subframe<<1)); remove_7_5_kHz(eNB,1+(subframe<<1));
...@@ -564,7 +623,7 @@ int main(int argc, char **argv) ...@@ -564,7 +623,7 @@ int main(int argc, char **argv)
n1_pucch, n1_pucch,
n2_pucch, n2_pucch,
0, //shortened_format, 0, //shortened_format,
(pucch_format==pucch_format3) ? pucch3_payload_rx : &pucch_payload_rx, //payload, (pucch_format==pucch_format3) ? pucch3_payload_rx : pucch_payload_rx, //payload,
0 /* frame not defined, let's pass 0 */, 0 /* frame not defined, let's pass 0 */,
subframe, subframe,
pucch1_thres); pucch1_thres);
...@@ -577,16 +636,17 @@ int main(int argc, char **argv) ...@@ -577,16 +636,17 @@ int main(int argc, char **argv)
// printf("stat (sig) %f\n",stat_sig); // printf("stat (sig) %f\n",stat_sig);
} }
// printf("subframe %d: pucch_payload_rx %d\n",subframe,pucch_payload_rx);
if (pucch_format==pucch_format1) { if (pucch_format==pucch_format1) {
pucch1_missed = ((pucch_payload_rx == 0) && (sig==1)) ? (pucch1_missed+1) : pucch1_missed; pucch1_missed = ((pucch_payload_rx[0] == 0) && (sig==1)) ? (pucch1_missed+1) : pucch1_missed;
pucch1_false = ((pucch_payload_rx == 1) && (sig==0)) ? (pucch1_false+1) : pucch1_false; pucch1_false = ((pucch_payload_rx[0] == 1) && (sig==0)) ? (pucch1_false+1) : pucch1_false;
/* /*
if ((pucch_payload_rx == 0) && (sig==1)) { if ((pucch_payload_rx == 0) && (sig==1)) {
printf("EXIT\n"); printf("EXIT\n");
exit(-1); exit(-1);
}*/ }*/
} else if( (pucch_format==pucch_format1a) || (pucch_format==pucch_format1b) ) { } else if( (pucch_format==pucch_format1a) || (pucch_format==pucch_format1b) ) {
pucch1_false = (pucch_payload_rx != pucch_payload) ? (pucch1_false+1) : pucch1_false; pucch1_false = pucch_payload_rx[0] != pucch_payload[0] ? (pucch1_false+1) : pucch1_false;
} else if (pucch_format==pucch_format3){ } else if (pucch_format==pucch_format3){
for(i=0;i<pucch3_payload_size;i++){ for(i=0;i<pucch3_payload_size;i++){
if(pucch3_payload[i]!=pucch3_payload_rx[i]){ if(pucch3_payload[i]!=pucch3_payload_rx[i]){
...@@ -598,8 +658,7 @@ int main(int argc, char **argv) ...@@ -598,8 +658,7 @@ int main(int argc, char **argv)
// printf("sig %d\n",sig); // printf("sig %d\n",sig);
} // NSR } // NSR
} } //trial
if (pucch_format==pucch_format1) if (pucch_format==pucch_format1)
printf("pucch_trials %d : pucch1_false %d,pucch1_missed %d, N0 %d dB, stat_no_sig %f dB, stat_sig %f dB\n",pucch_tx,pucch1_false,pucch1_missed,eNB->measurements[0].n0_power_tot_dB, printf("pucch_trials %d : pucch1_false %d,pucch1_missed %d, N0 %d dB, stat_no_sig %f dB, stat_sig %f dB\n",pucch_tx,pucch1_false,pucch1_missed,eNB->measurements[0].n0_power_tot_dB,
10*log10(stat_no_sig),10*log10(stat_sig)); 10*log10(stat_no_sig),10*log10(stat_sig));
...@@ -609,15 +668,21 @@ int main(int argc, char **argv) ...@@ -609,15 +668,21 @@ int main(int argc, char **argv)
printf("pucch_trials %d : pucch1b_errors %d\n",pucch_tx,pucch1_false); printf("pucch_trials %d : pucch1b_errors %d\n",pucch_tx,pucch1_false);
else if (pucch_format==pucch_format3) else if (pucch_format==pucch_format3)
printf("pucch_trials %d : pucch3_errors %d\n",pucch_tx,pucch3_false); printf("pucch_trials %d : pucch3_errors %d\n",pucch_tx,pucch3_false);
}
if (n_frames==1) { if (n_frames==1) {
//write_output("txsig0.m","txs0", &txdata[0][subframe*frame_parms->samples_per_tti],frame_parms->samples_per_tti,1,1); //write_output("txsig0.m","txs0", &txdata[0][subframe*frame_parms->samples_per_tti],frame_parms->samples_per_tti,1,1);
write_output("txsig0pucch.m", "txs0", &txdata[0][0], FRAME_LENGTH_COMPLEX_SAMPLES,1,1); write_output("txsig0pucch.m", "txs0", &UE->common_vars.txdata[0][0], FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
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("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->common_vars.rxdataF[0][0][0],512*nsymb*2,1,1);
} }
if ((pucch_format==pucch_format1a) || (pucch_format==pucch_format1b)) {
sprintf(pucch_stats_string1,"pucch1ab_stats_%c%ddB.m",SNR<0.0?'m':'p',(int)(fabs(SNR)));
sprintf(pucch_stats_string2,"pucch1ab%c%d",SNR<0.0?'m':'p',(int)(fabs(SNR)));
write_output(pucch_stats_string1,pucch_stats_string2,(void*)&eNB->pucch1ab_stats[0][subframe<<11],1024,1,3);
}
}
lte_sync_time_free(); lte_sync_time_free();
......
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