lte_phy_scope.c 32.2 KB
Newer Older
1 2 3 4 5
/*
 * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The OpenAirInterface Software Alliance licenses this file to You under
6
 * the OAI Public License, Version 1.1  (the "License"); you may not use this file
7 8 9 10 11 12 13 14 15 16 17 18 19 20
 * except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.openairinterface.org/?page_id=698
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *-------------------------------------------------------------------------------
 * For more information about the OpenAirInterface (OAI) Software Alliance:
 *      contact@openairinterface.org
 */
ghaddab's avatar
ghaddab committed
21

22 23 24 25
/* Form definition file generated by fdesign */

#include <stdlib.h>
#include "lte_phy_scope.h"
26
#include "PHY/defs_common.h"
27
#include "PHY/LTE_UE_TRANSPORT/transport_proto_ue.h"
28 29 30 31 32 33 34 35 36 37 38 39

#define TPUT_WINDOW_LENGTH 100
int otg_enabled;

FL_COLOR rx_antenna_colors[4] = {FL_RED,FL_BLUE,FL_GREEN,FL_YELLOW};

float tput_time_enb[NUMBER_OF_UE_MAX][TPUT_WINDOW_LENGTH] = {{0}};
float tput_enb[NUMBER_OF_UE_MAX][TPUT_WINDOW_LENGTH] = {{0}};
float tput_time_ue[NUMBER_OF_UE_MAX][TPUT_WINDOW_LENGTH] = {{0}};
float tput_ue[NUMBER_OF_UE_MAX][TPUT_WINDOW_LENGTH] = {{0}};
float tput_ue_max[NUMBER_OF_UE_MAX] = {0};

laurent's avatar
laurent committed
40 41 42 43
void drawsymbol(FL_OBJECT *obj, int id,
                FL_POINT *p, int n, int w, int h) {
  fl_points( p, n, FL_YELLOW);
}
44

laurent's avatar
laurent committed
45
static void ia_receiver_on_off( FL_OBJECT *button, long arg) {
46 47
  if (fl_get_button(button)) {
    fl_set_object_label(button, "IA Receiver ON");
48
    //    PHY_vars_UE_g[0][0]->use_ia_receiver = 1;
49 50 51
    fl_set_object_color(button, FL_GREEN, FL_GREEN);
  } else {
    fl_set_object_label(button, "IA Receiver OFF");
52
    //    PHY_vars_UE_g[0][0]->use_ia_receiver = 0;
53 54
    fl_set_object_color(button, FL_RED, FL_RED);
  }
55 56
}

laurent's avatar
laurent committed
57
static void dl_traffic_on_off( FL_OBJECT *button, long arg) {
58 59 60 61 62 63 64 65 66
  if (fl_get_button(button)) {
    fl_set_object_label(button, "DL Traffic ON");
    otg_enabled = 1;
    fl_set_object_color(button, FL_GREEN, FL_GREEN);
  } else {
    fl_set_object_label(button, "DL Traffic OFF");
    otg_enabled = 0;
    fl_set_object_color(button, FL_RED, FL_RED);
  }
67 68
}

laurent's avatar
laurent committed
69
FD_lte_phy_scope_enb *create_lte_phy_scope_enb( void ) {
70 71 72
  FL_OBJECT *obj;
  FD_lte_phy_scope_enb *fdui = fl_malloc( sizeof *fdui );
  // Define form
73
  fdui->lte_phy_scope_enb = fl_bgn_form( FL_NO_BOX, 800, 800 );
74
  // This the whole UI box
75
  obj = fl_add_box( FL_BORDER_BOX, 0, 0, 800, 800, "" );
76 77 78 79 80 81
  fl_set_object_color( obj, FL_BLACK, FL_BLACK );
  // Received signal
  fdui->rxsig_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 20, 370, 100, "Received Signal (Time-Domain, dB)" );
  fl_set_object_boxtype( fdui->rxsig_t, FL_EMBOSSED_BOX );
  fl_set_object_color( fdui->rxsig_t, FL_BLACK, FL_RED );
  fl_set_object_lcolor( fdui->rxsig_t, FL_WHITE ); // Label color
82
  fl_set_xyplot_ybounds(fdui->rxsig_t,10,70);
83
  // Time-domain channel response
84
  fdui->chest_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 410, 20, 370, 100, "SRS Frequency Response (samples, abs)" );
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
  fl_set_object_boxtype( fdui->chest_t, FL_EMBOSSED_BOX );
  fl_set_object_color( fdui->chest_t, FL_BLACK, FL_RED );
  fl_set_object_lcolor( fdui->chest_t, FL_WHITE ); // Label color
  // Frequency-domain channel response
  fdui->chest_f = fl_add_xyplot( FL_IMPULSE_XYPLOT, 20, 140, 760, 100, "Channel Frequency  Response (RE, dB)" );
  fl_set_object_boxtype( fdui->chest_f, FL_EMBOSSED_BOX );
  fl_set_object_color( fdui->chest_f, FL_BLACK, FL_RED );
  fl_set_object_lcolor( fdui->chest_f, FL_WHITE ); // Label color
  fl_set_xyplot_ybounds( fdui->chest_f,30,70);
  // LLR of PUSCH
  fdui->pusch_llr = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 260, 500, 200, "PUSCH Log-Likelihood Ratios (LLR, mag)" );
  fl_set_object_boxtype( fdui->pusch_llr, FL_EMBOSSED_BOX );
  fl_set_object_color( fdui->pusch_llr, FL_BLACK, FL_YELLOW );
  fl_set_object_lcolor( fdui->pusch_llr, FL_WHITE ); // Label color
  fl_set_xyplot_symbolsize( fdui->pusch_llr,2);
laurent's avatar
laurent committed
100
  fl_set_xyplot_symbol(fdui->pusch_llr, 0, drawsymbol);
101 102 103 104 105 106 107
  // I/Q PUSCH comp
  fdui->pusch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 260, 240, 200, "PUSCH I/Q of MF Output" );
  fl_set_object_boxtype( fdui->pusch_comp, FL_EMBOSSED_BOX );
  fl_set_object_color( fdui->pusch_comp, FL_BLACK, FL_YELLOW );
  fl_set_object_lcolor( fdui->pusch_comp, FL_WHITE ); // Label color
  fl_set_xyplot_symbolsize( fdui->pusch_comp,2);
  fl_set_xyplot_xgrid( fdui->pusch_llr,FL_GRID_MAJOR);
laurent's avatar
laurent committed
108
  fl_set_xyplot_symbol(fdui->pusch_comp, 0, drawsymbol);
109
  // I/Q PUCCH comp (format 1)
110
  fdui->pucch_comp1 = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 480, 240, 100, "PUCCH1 Energy (SR)" );
111 112 113 114 115
  fl_set_object_boxtype( fdui->pucch_comp1, FL_EMBOSSED_BOX );
  fl_set_object_color( fdui->pucch_comp1, FL_BLACK, FL_YELLOW );
  fl_set_object_lcolor( fdui->pucch_comp1, FL_WHITE ); // Label color
  fl_set_xyplot_symbolsize( fdui->pucch_comp1,2);
  //  fl_set_xyplot_xgrid( fdui->pusch_llr,FL_GRID_MAJOR);
laurent's avatar
laurent committed
116
  fl_set_xyplot_symbol(fdui->pucch_comp1, 0, drawsymbol);
117 118
  // I/Q PUCCH comp (fromat 1a/b)
  fdui->pucch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 600, 240, 100, "PUCCH I/Q of MF Output" );
119 120 121 122 123
  fl_set_object_boxtype( fdui->pucch_comp, FL_EMBOSSED_BOX );
  fl_set_object_color( fdui->pucch_comp, FL_BLACK, FL_YELLOW );
  fl_set_object_lcolor( fdui->pucch_comp, FL_WHITE ); // Label color
  fl_set_xyplot_symbolsize( fdui->pucch_comp,2);
  //  fl_set_xyplot_xgrid( fdui->pusch_llr,FL_GRID_MAJOR);
laurent's avatar
laurent committed
124
  fl_set_xyplot_symbol(fdui->pucch_comp, 0, drawsymbol);
125 126 127 128 129 130
  // Throughput on PUSCH
  fdui->pusch_tput = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 480, 500, 100, "PUSCH Throughput [frame]/[kbit/s]" );
  fl_set_object_boxtype( fdui->pusch_tput, FL_EMBOSSED_BOX );
  fl_set_object_color( fdui->pusch_tput, FL_BLACK, FL_WHITE );
  fl_set_object_lcolor( fdui->pusch_tput, FL_WHITE ); // Label color
  // Generic eNB Button
131
  fdui->button_0 = fl_add_button( FL_PUSH_BUTTON, 20, 600, 240, 40, "" );
132 133 134 135 136 137 138 139 140 141
  fl_set_object_lalign(fdui->button_0, FL_ALIGN_CENTER );
  fl_set_button(fdui->button_0,0);
  otg_enabled = 0;
  fl_set_object_label(fdui->button_0, "DL Traffic OFF");
  fl_set_object_color(fdui->button_0, FL_RED, FL_RED);
  fl_set_object_callback(fdui->button_0, dl_traffic_on_off, 0 );
  fl_end_form( );
  fdui->lte_phy_scope_enb->fdui = fdui;
  return fdui;
}
142

143 144
void phy_scope_eNB(FD_lte_phy_scope_enb *form,
                   PHY_VARS_eNB *phy_vars_enb,
laurent's avatar
laurent committed
145 146
                   int UE_id) {
  LOG_D(HW,"scope for UE%d\n", UE_id);
147
  int i,i2,arx,atx,ind,k;
148
  LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_enb->frame_parms;
149 150 151 152 153 154 155
  int nsymb_ce = 12*frame_parms->N_RB_UL*frame_parms->symbols_per_tti;
  uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx;
  uint8_t nb_antennas_tx = 1; // frame_parms->nb_antennas_tx; // in LTE Rel. 8 and 9 only a single transmit antenna is assumed at the UE
  int16_t **rxsig_t;
  int16_t **chest_t;
  int16_t **chest_f;
  int16_t *pusch_llr;
oai's avatar
oai committed
156
  int32_t *pusch_comp;
157
  int32_t *pucch1_comp;
158
  int32_t *pucch1_thres;
159
  int32_t *pucch1ab_comp;
160 161 162
  float Re,Im,ymax;
  float *llr, *bit;
  float I[nsymb_ce*2], Q[nsymb_ce*2];
163
  float I_pucch[10240],Q_pucch[10240],A_pucch[10240],B_pucch[10240],C_pucch[10240];
164 165 166 167
  float rxsig_t_dB[nb_antennas_rx][FRAME_LENGTH_COMPLEX_SAMPLES];
  float chest_t_abs[nb_antennas_rx][frame_parms->ofdm_symbol_size];
  float *chest_f_abs;
  float time[FRAME_LENGTH_COMPLEX_SAMPLES];
168
  float time2[2048];
169
  float freq[nsymb_ce*nb_antennas_rx*nb_antennas_tx];
Wang Tsu-Han's avatar
Wang Tsu-Han committed
170
  int frame = phy_vars_enb->proc.L1_proc.frame_tx;
171 172 173
  uint32_t total_dlsch_bitrate = phy_vars_enb->total_dlsch_bitrate;
  int coded_bits_per_codeword = 0;
  uint8_t harq_pid; // in TDD config 3 it is sf-2, i.e., can be 0,1,2
174
  int Qm = 2;
175 176

  // choose max MCS to compute coded_bits_per_codeword
177
  if (phy_vars_enb->ulsch[UE_id]!=NULL) {
178
    for (harq_pid=0; harq_pid<3; harq_pid++) {
179
      Qm = cmax(phy_vars_enb->ulsch[UE_id]->harq_processes[harq_pid]->Qm,Qm);
180
    }
181
  }
182

183
  coded_bits_per_codeword = frame_parms->N_RB_UL*12*Qm*frame_parms->symbols_per_tti;
laurent's avatar
laurent committed
184 185
  chest_f_abs = (float *) calloc(nsymb_ce*nb_antennas_rx*nb_antennas_tx,sizeof(float));
  llr = (float *) calloc(coded_bits_per_codeword,sizeof(float)); // init to zero
186
  bit = malloc(coded_bits_per_codeword*sizeof(float));
187

188
  rxsig_t = (int16_t**) phy_vars_enb->RU_list[0]->common.rxdata;
laurent's avatar
laurent committed
189 190 191 192 193 194 195
  chest_t = (int16_t **) phy_vars_enb->srs_vars[UE_id].srs_ch_estimates;
  chest_f = (int16_t **) phy_vars_enb->pusch_vars[UE_id]->drs_ch_estimates;
  pusch_llr = (int16_t *) phy_vars_enb->pusch_vars[UE_id]->llr;
  pusch_comp = (int32_t *) phy_vars_enb->pusch_vars[UE_id]->rxdataF_comp[0];
  pucch1_comp = (int32_t *) phy_vars_enb->pucch1_stats[UE_id];
  pucch1_thres = (int32_t *) phy_vars_enb->pucch1_stats_thres[UE_id];
  pucch1ab_comp = (int32_t *) phy_vars_enb->pucch1ab_stats[UE_id];
196

197 198
  // Received signal in time domain of receive antenna 0
  if (rxsig_t != NULL) {
199
    if (rxsig_t[0] != NULL ) {
200 201 202 203 204 205
      for (i=0; i<FRAME_LENGTH_COMPLEX_SAMPLES; i++) {
        rxsig_t_dB[0][i] = 10*log10(1.0+(float) ((rxsig_t[0][2*i])*(rxsig_t[0][2*i])+(rxsig_t[0][2*i+1])*(rxsig_t[0][2*i+1])));
        time[i] = (float) i;
      }

      fl_set_xyplot_data(form->rxsig_t,time,rxsig_t_dB[0],FRAME_LENGTH_COMPLEX_SAMPLES,"","","");
206 207
    }

208 209 210 211
    for (arx=1; arx<nb_antennas_rx; arx++) {
      if (rxsig_t[arx] != NULL) {
        for (i=0; i<FRAME_LENGTH_COMPLEX_SAMPLES; i++) {
          rxsig_t_dB[arx][i] = 10*log10(1.0+(float) ((rxsig_t[arx][2*i])*(rxsig_t[arx][2*i])+(rxsig_t[arx][2*i+1])*(rxsig_t[arx][2*i+1])));
212 213
        }

214 215
        fl_add_xyplot_overlay(form->rxsig_t,arx,time,rxsig_t_dB[arx],FRAME_LENGTH_COMPLEX_SAMPLES,rx_antenna_colors[arx]);
      }
216
    }
217
  }
218

219
  // Channel Impulse Response
220 221
  if (chest_t != NULL) {
    ymax = 0;
222

223 224
    if (chest_t[0] !=NULL) {
      for (i=0; i<(frame_parms->ofdm_symbol_size); i++) {
225
        //i2 = (i+(frame_parms->ofdm_symbol_size>>1))%frame_parms->ofdm_symbol_size;
laurent's avatar
laurent committed
226
        i2=i;
227 228
        //time2[i] = (float)(i-(frame_parms->ofdm_symbol_size>>1));
        time2[i] = (float)i;
229
        chest_t_abs[0][i] = 10*log10((float) (1+chest_t[0][2*i2]*chest_t[0][2*i2]+chest_t[0][2*i2+1]*chest_t[0][2*i2+1]));
230

231 232 233
        if (chest_t_abs[0][i] > ymax)
          ymax = chest_t_abs[0][i];
      }
234

235
      fl_set_xyplot_data(form->chest_t,time2,chest_t_abs[0],(frame_parms->ofdm_symbol_size),"","","");
236 237
    }

238 239 240
    for (arx=1; arx<nb_antennas_rx; arx++) {
      if (chest_t[arx] !=NULL) {
        for (i=0; i<(frame_parms->ofdm_symbol_size>>3); i++) {
241
          chest_t_abs[arx][i] = 10*log10((float) (1+chest_t[arx][2*i]*chest_t[arx][2*i]+chest_t[arx][2*i+1]*chest_t[arx][2*i+1]));
242

243 244
          if (chest_t_abs[arx][i] > ymax)
            ymax = chest_t_abs[arx][i];
245 246
        }

247 248 249
        fl_add_xyplot_overlay(form->chest_t,arx,time,chest_t_abs[arx],(frame_parms->ofdm_symbol_size>>3),rx_antenna_colors[arx]);
        fl_set_xyplot_overlay_type(form->chest_t,arx,FL_DASHED_XYPLOT);
      }
250 251
    }

252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
    // Avoid flickering effect
    //        fl_get_xyplot_ybounds(form->chest_t,&ymin,&ymax);
    fl_set_xyplot_ybounds(form->chest_t,0,ymax);
  }

  // Channel Frequency Response
  if (chest_f != NULL) {
    ind = 0;

    for (atx=0; atx<nb_antennas_tx; atx++) {
      for (arx=0; arx<nb_antennas_rx; arx++) {
        if (chest_f[(atx<<1)+arx] != NULL) {
          for (k=0; k<nsymb_ce; k++) {
            freq[ind] = (float)ind;
            Re = (float)(chest_f[(atx<<1)+arx][(2*k)]);
            Im = (float)(chest_f[(atx<<1)+arx][(2*k)+1]);
            chest_f_abs[ind] = (short)10*log10(1.0+((double)Re*Re + (double)Im*Im));
            ind++;
          }
271
        }
272
      }
273 274
    }

275 276 277 278 279
    // tx antenna 0
    fl_set_xyplot_xbounds(form->chest_f,0,nb_antennas_rx*nb_antennas_tx*nsymb_ce);
    fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*frame_parms->symbols_per_tti,3);
    fl_set_xyplot_xgrid(form->chest_f,FL_GRID_MAJOR);
    fl_set_xyplot_data(form->chest_f,freq,chest_f_abs,nsymb_ce,"","","");
280

281 282
    for (arx=1; arx<nb_antennas_rx; arx++) {
      fl_add_xyplot_overlay(form->chest_f,1,&freq[arx*nsymb_ce],&chest_f_abs[arx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
283
    }
284 285 286 287 288 289 290 291

    // other tx antennas
    if (nb_antennas_tx > 1) {
      if (nb_antennas_rx > 1) {
        for (atx=1; atx<nb_antennas_tx; atx++) {
          for (arx=0; arx<nb_antennas_rx; arx++) {
            fl_add_xyplot_overlay(form->chest_f,(atx<<1)+arx,&freq[((atx<<1)+arx)*nsymb_ce],&chest_f_abs[((atx<<1)+arx)*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
          }
292
        }
293 294 295 296 297
      } else { // 1 rx antenna
        atx=1;
        arx=0;
        fl_add_xyplot_overlay(form->chest_f,atx,&freq[atx*nsymb_ce],&chest_f_abs[atx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
      }
298
    }
299 300 301 302 303 304 305
  }

  // PUSCH LLRs
  if (pusch_llr != NULL) {
    for (i=0; i<coded_bits_per_codeword; i++) {
      llr[i] = (float) pusch_llr[i];
      bit[i] = (float) i;
306 307
    }

308 309 310 311 312 313
    fl_set_xyplot_data(form->pusch_llr,bit,llr,coded_bits_per_codeword,"","","");
  }

  // PUSCH I/Q of MF Output
  if (pusch_comp!=NULL) {
    ind=0;
314
    int range=80*1000*1000;
315 316 317

    for (k=0; k<frame_parms->symbols_per_tti; k++) {
      for (i=0; i<12*frame_parms->N_RB_UL; i++) {
318 319 320 321
        if ( pusch_comp[(2*frame_parms->N_RB_UL*12*k)+2*i] > -range &&
             pusch_comp[(2*frame_parms->N_RB_UL*12*k)+2*i] < range  &&
             pusch_comp[(2*frame_parms->N_RB_UL*12*k)+2*i+1] > -range &&
             pusch_comp[(2*frame_parms->N_RB_UL*12*k)+2*i+1] < range ) {
laurent's avatar
laurent committed
322 323 324
          I[ind] = pusch_comp[(2*frame_parms->N_RB_UL*12*k)+2*i];
          Q[ind] = pusch_comp[(2*frame_parms->N_RB_UL*12*k)+2*i+1];
          ind++;
325
        }
326
      }
327
    }
328 329 330 331

    fl_set_xyplot_data(form->pusch_comp,I,Q,ind,"","","");
  }

332 333 334
  // PUSCH I/Q of MF Output
  if (pucch1ab_comp!=NULL) {
    for (ind=0; ind<10240; ind++) {
335 336
      I_pucch[ind] = (float)pucch1ab_comp[2*(ind)];
      Q_pucch[ind] = (float)pucch1ab_comp[2*(ind)+1];
337 338
      A_pucch[ind] = 10*log10(pucch1_comp[ind]);
      B_pucch[ind] = ind;
339
      C_pucch[ind] = (float)pucch1_thres[ind];
340
    }
laurent's avatar
laurent committed
341

342 343
    fl_set_xyplot_data(form->pucch_comp,I_pucch,Q_pucch,10240,"","","");
    fl_set_xyplot_data(form->pucch_comp1,B_pucch,A_pucch,1024,"","","");
344
    fl_add_xyplot_overlay(form->pucch_comp1,1,B_pucch,C_pucch,1024,FL_RED);
345 346
    fl_set_xyplot_ybounds(form->pucch_comp,-5000,5000);
    fl_set_xyplot_xbounds(form->pucch_comp,-5000,5000);
347
    fl_set_xyplot_ybounds(form->pucch_comp1,0,80);
348
  }
349

350 351 352 353 354 355 356 357 358 359 360 361
  // PUSCH Throughput
  memmove( tput_time_enb[UE_id], &tput_time_enb[UE_id][1], (TPUT_WINDOW_LENGTH-1)*sizeof(float) );
  memmove( tput_enb[UE_id], &tput_enb[UE_id][1], (TPUT_WINDOW_LENGTH-1)*sizeof(float) );
  tput_time_enb[UE_id][TPUT_WINDOW_LENGTH-1]  = (float) frame;
  tput_enb[UE_id][TPUT_WINDOW_LENGTH-1] = ((float) total_dlsch_bitrate)/1000.0;
  fl_set_xyplot_data(form->pusch_tput,tput_time_enb[UE_id],tput_enb[UE_id],TPUT_WINDOW_LENGTH,"","","");
  //    fl_get_xyplot_ybounds(form->pusch_tput,&ymin,&ymax);
  //    fl_set_xyplot_ybounds(form->pusch_tput,0,ymax);
  fl_check_forms();
  free(llr);
  free(bit);
  free(chest_f_abs);
362 363
}

laurent's avatar
laurent committed
364
FD_lte_phy_scope_ue *create_lte_phy_scope_ue( void ) {
365 366 367 368 369 370 371 372 373 374 375 376
  FL_OBJECT *obj;
  FD_lte_phy_scope_ue *fdui = fl_malloc( sizeof *fdui );
  // Define form
  fdui->lte_phy_scope_ue = fl_bgn_form( FL_NO_BOX, 800, 900 );
  // This the whole UI box
  obj = fl_add_box( FL_BORDER_BOX, 0, 0, 800, 900, "" );
  fl_set_object_color( obj, FL_BLACK, FL_BLACK );
  // Received signal
  fdui->rxsig_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 20, 370, 100, "Received Signal (Time-Domain, dB)" );
  fl_set_object_boxtype( fdui->rxsig_t, FL_EMBOSSED_BOX );
  fl_set_object_color( fdui->rxsig_t, FL_BLACK, FL_RED );
  fl_set_object_lcolor( fdui->rxsig_t, FL_WHITE ); // Label color
377
  fl_set_xyplot_ybounds(fdui->rxsig_t,10,70);
laurent's avatar
laurent committed
378
  fl_set_xyplot_symbol(fdui->rxsig_t, 0, drawsymbol);
379 380 381 382 383
  // Time-domain channel response
  fdui->chest_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 410, 20, 370, 100, "Channel Impulse Response (samples, abs)" );
  fl_set_object_boxtype( fdui->chest_t, FL_EMBOSSED_BOX );
  fl_set_object_color( fdui->chest_t, FL_BLACK, FL_RED );
  fl_set_object_lcolor( fdui->chest_t, FL_WHITE ); // Label color
laurent's avatar
laurent committed
384
  fl_set_xyplot_symbol(fdui->chest_t, 0, drawsymbol);
385 386 387 388 389 390 391 392 393 394 395 396 397 398
  // Frequency-domain channel response
  fdui->chest_f = fl_add_xyplot( FL_IMPULSE_XYPLOT, 20, 140, 760, 100, "Channel Frequency Response (RE, dB)" );
  fl_set_object_boxtype( fdui->chest_f, FL_EMBOSSED_BOX );
  fl_set_object_color( fdui->chest_f, FL_BLACK, FL_RED );
  fl_set_object_lcolor( fdui->chest_f, FL_WHITE ); // Label color
  fl_set_xyplot_ybounds( fdui->chest_f,30,70);
  // LLR of PBCH
  fdui->pbch_llr = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 260, 500, 100, "PBCH Log-Likelihood Ratios (LLR, mag)" );
  fl_set_object_boxtype( fdui->pbch_llr, FL_EMBOSSED_BOX );
  fl_set_object_color( fdui->pbch_llr, FL_BLACK, FL_GREEN );
  fl_set_object_lcolor( fdui->pbch_llr, FL_WHITE ); // Label color
  fl_set_xyplot_symbolsize( fdui->pbch_llr,2);
  fl_set_xyplot_xgrid( fdui->pbch_llr,FL_GRID_MAJOR);
  fl_set_xyplot_xbounds( fdui->pbch_llr,0,1920);
laurent's avatar
laurent committed
399
  fl_set_xyplot_symbol(fdui->pbch_llr, 0, drawsymbol);
400 401 402 403 404 405
  // I/Q PBCH comp
  fdui->pbch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 260, 240, 100, "PBCH I/Q of MF Output" );
  fl_set_object_boxtype( fdui->pbch_comp, FL_EMBOSSED_BOX );
  fl_set_object_color( fdui->pbch_comp, FL_BLACK, FL_GREEN );
  fl_set_object_lcolor( fdui->pbch_comp, FL_WHITE ); // Label color
  fl_set_xyplot_symbolsize( fdui->pbch_comp,2);
laurent's avatar
laurent committed
406
  fl_set_xyplot_symbol(fdui->pbch_comp, 0, drawsymbol);
407 408
  //  fl_set_xyplot_xbounds( fdui->pbch_comp,-100,100);
  //  fl_set_xyplot_ybounds( fdui->pbch_comp,-100,100);
409 410 411 412 413 414
  // LLR of PDCCH
  fdui->pdcch_llr = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 380, 500, 100, "PDCCH Log-Likelihood Ratios (LLR, mag)" );
  fl_set_object_boxtype( fdui->pdcch_llr, FL_EMBOSSED_BOX );
  fl_set_object_color( fdui->pdcch_llr, FL_BLACK, FL_CYAN );
  fl_set_object_lcolor( fdui->pdcch_llr, FL_WHITE ); // Label color
  fl_set_xyplot_symbolsize( fdui->pdcch_llr,2);
laurent's avatar
laurent committed
415
  fl_set_xyplot_symbol(fdui->pdcch_llr, 0, drawsymbol);
416 417 418 419 420 421 422
  // I/Q PDCCH comp
  fdui->pdcch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 380, 240, 100, "PDCCH I/Q of MF Output" );
  fl_set_object_boxtype( fdui->pdcch_comp, FL_EMBOSSED_BOX );
  fl_set_object_color( fdui->pdcch_comp, FL_BLACK, FL_CYAN );
  fl_set_object_lcolor( fdui->pdcch_comp, FL_WHITE ); // Label color
  fl_set_xyplot_symbolsize( fdui->pdcch_comp,2);
  fl_set_xyplot_xgrid( fdui->pdcch_llr,FL_GRID_MAJOR);
laurent's avatar
laurent committed
423
  fl_set_xyplot_symbol(fdui->pdcch_comp, 0, drawsymbol);
424 425 426 427 428 429 430
  // LLR of PDSCH
  fdui->pdsch_llr = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 500, 500, 200, "PDSCH Log-Likelihood Ratios (LLR, mag)" );
  fl_set_object_boxtype( fdui->pdsch_llr, FL_EMBOSSED_BOX );
  fl_set_object_color( fdui->pdsch_llr, FL_BLACK, FL_YELLOW );
  fl_set_object_lcolor( fdui->pdsch_llr, FL_WHITE ); // Label color
  fl_set_xyplot_symbolsize( fdui->pdsch_llr,2);
  fl_set_xyplot_xgrid( fdui->pdsch_llr,FL_GRID_MAJOR);
laurent's avatar
laurent committed
431
  fl_set_xyplot_symbol(fdui->pdsch_llr, 0, drawsymbol);
432 433 434 435 436 437
  // I/Q PDSCH comp
  fdui->pdsch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 500, 240, 200, "PDSCH I/Q of MF Output" );
  fl_set_object_boxtype( fdui->pdsch_comp, FL_EMBOSSED_BOX );
  fl_set_object_color( fdui->pdsch_comp, FL_BLACK, FL_YELLOW );
  fl_set_object_lcolor( fdui->pdsch_comp, FL_WHITE ); // Label color
  fl_set_xyplot_symbolsize( fdui->pdsch_comp,2);
laurent's avatar
laurent committed
438
  fl_set_xyplot_symbol(fdui->pdsch_comp, 0, drawsymbol);
439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455
  // Throughput on PDSCH
  fdui->pdsch_tput = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 720, 500, 100, "PDSCH Throughput [frame]/[kbit/s]" );
  fl_set_object_boxtype( fdui->pdsch_tput, FL_EMBOSSED_BOX );
  fl_set_object_color( fdui->pdsch_tput, FL_BLACK, FL_WHITE );
  fl_set_object_lcolor( fdui->pdsch_tput, FL_WHITE ); // Label color
  // Generic UE Button
  fdui->button_0 = fl_add_button( FL_PUSH_BUTTON, 540, 720, 240, 40, "" );
  fl_set_object_lalign(fdui->button_0, FL_ALIGN_CENTER );
  //openair_daq_vars.use_ia_receiver = 0;
  fl_set_button(fdui->button_0,0);
  fl_set_object_label(fdui->button_0, "IA Receiver OFF");
  fl_set_object_color(fdui->button_0, FL_RED, FL_RED);
  fl_set_object_callback(fdui->button_0, ia_receiver_on_off, 0 );
  fl_hide_object(fdui->button_0);
  fl_end_form( );
  fdui->lte_phy_scope_ue->fdui = fdui;
  return fdui;
456
}
457 458

void phy_scope_UE(FD_lte_phy_scope_ue *form,
459 460 461
                  PHY_VARS_UE *phy_vars_ue,
                  int eNB_id,
                  int UE_id,
laurent's avatar
laurent committed
462
                  uint8_t subframe) {
463
  int i,arx,atx,ind,k;
464
  LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->frame_parms;
465
  int nsymb_ce = frame_parms->ofdm_symbol_size;//*frame_parms->symbols_per_tti;
466
  uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx;
467
  uint8_t nb_antennas_tx = frame_parms->nb_antenna_ports_eNB;
468 469 470 471 472
  int16_t **rxsig_t;
  int16_t **chest_t;
  int16_t **chest_f;
  int16_t *pdsch_llr;
  int16_t *pdsch_comp;
473 474
  int16_t *pdsch_mag;
  int8_t  *pdcch_llr;
475 476 477 478 479 480 481 482 483 484 485
  int16_t *pdcch_comp;
  int8_t *pbch_llr;
  int16_t *pbch_comp;
  float Re,Im,ymax=1;
  int num_pdcch_symbols=3;
  float *llr, *bit, *chest_f_abs, llr_pbch[1920], bit_pbch[1920], *llr_pdcch, *bit_pdcch;
  float *I, *Q;
  float rxsig_t_dB[nb_antennas_rx][FRAME_LENGTH_COMPLEX_SAMPLES];
  float **chest_t_abs;
  float time[FRAME_LENGTH_COMPLEX_SAMPLES];
  float freq[nsymb_ce*nb_antennas_rx*nb_antennas_tx];
486
  int frame = phy_vars_ue->proc.proc_rxtx[0].frame_rx;
487 488 489 490
  uint32_t total_dlsch_bitrate = phy_vars_ue->bitrate[eNB_id];
  int coded_bits_per_codeword = 0;
  int mcs = 0;
  unsigned char harq_pid = 0;
Xiwen JIANG's avatar
Xiwen JIANG committed
491
  int beamforming_mode = phy_vars_ue->transmission_mode[eNB_id]>6 ? phy_vars_ue->transmission_mode[eNB_id] : 0;
492

493 494
  if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]!=NULL) {
    harq_pid = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->current_harq_pid;
495 496 497 498

    if (harq_pid>=8)
      return;

499
    mcs = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->mcs;
500 501

    // Button 0
502
    if(!phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->dl_power_off) {
503 504
      // we are in TM5
      fl_show_object(form->button_0);
505
    }
506 507
  }

508 509
  if (phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]!=NULL) {
    num_pdcch_symbols = phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->num_pdcch_symbols;
510 511 512
  }

  //    coded_bits_per_codeword = frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti);
513
  if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]!=NULL) {
514
    coded_bits_per_codeword = get_G(frame_parms,
515 516
                                    phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->nb_rb,
                                    phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even,
517
                                    get_Qm(mcs),
518
                                    phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->Nl,
519 520
                                    num_pdcch_symbols,
                                    frame,
Xiwen JIANG's avatar
Xiwen JIANG committed
521 522
                                    subframe,
                                    beamforming_mode);
523 524 525 526
  } else {
    coded_bits_per_codeword = 0; //frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti);
  }

laurent's avatar
laurent committed
527 528 529
  I = (float *) calloc(frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti*2,sizeof(float));
  Q = (float *) calloc(frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti*2,sizeof(float));
  chest_t_abs = (float **) malloc(nb_antennas_rx*sizeof(float *));
530 531

  for (arx=0; arx<nb_antennas_rx; arx++) {
laurent's avatar
laurent committed
532
    chest_t_abs[arx] = (float *) calloc(frame_parms->ofdm_symbol_size,sizeof(float));
533 534
  }

laurent's avatar
laurent committed
535
  chest_f_abs = (float *) calloc(nsymb_ce*nb_antennas_rx*nb_antennas_tx,sizeof(float));
536
  //llr = (float*) calloc(coded_bits_per_codeword,sizeof(float)); // Cppcheck returns "invalidFunctionArg" error.
laurent's avatar
laurent committed
537
  llr = (float *) malloc(coded_bits_per_codeword*sizeof(float));
538
  memset((void *)llr, 0,coded_bits_per_codeword*sizeof(float)); // init to zero
539
  bit = malloc(coded_bits_per_codeword*sizeof(float));
laurent's avatar
laurent committed
540 541 542 543 544 545 546 547 548 549
  llr_pdcch = (float *) calloc(12*frame_parms->N_RB_DL*num_pdcch_symbols*2,sizeof(float)); // init to zero
  bit_pdcch = (float *) calloc(12*frame_parms->N_RB_DL*num_pdcch_symbols*2,sizeof(float));
  rxsig_t = (int16_t **) phy_vars_ue->common_vars.rxdata;
  chest_t = (int16_t **) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[phy_vars_ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id];
  chest_f = (int16_t **) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[phy_vars_ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id];
  pbch_llr = (int8_t *) phy_vars_ue->pbch_vars[eNB_id]->llr;
  pbch_comp = (int16_t *) phy_vars_ue->pbch_vars[eNB_id]->rxdataF_comp[0];
  pdcch_llr = (int8_t *) phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr;
  pdcch_comp = (int16_t *) phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp[0];
  pdsch_llr = (int16_t *) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr[0]; // stream 0
550
  //pdsch_llr = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars_SI[eNB_id]->llr[0]; // stream 0
laurent's avatar
laurent committed
551 552
  pdsch_comp = (int16_t *) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp0[0];
  pdsch_mag = (int16_t *) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_mag0[0];
553 554 555 556 557 558 559 560 561 562

  // Received signal in time domain of receive antenna 0
  if (rxsig_t != NULL) {
    if (rxsig_t[0] != NULL) {
      for (i=0; i<FRAME_LENGTH_COMPLEX_SAMPLES; i++) {
        rxsig_t_dB[0][i] = 10*log10(1.0+(float) ((rxsig_t[0][2*i])*(rxsig_t[0][2*i])+(rxsig_t[0][2*i+1])*(rxsig_t[0][2*i+1])));
        time[i] = (float) i;
      }

      fl_set_xyplot_data(form->rxsig_t,time,rxsig_t_dB[0],FRAME_LENGTH_COMPLEX_SAMPLES,"","","");
563
    }
564 565 566 567 568

    for (arx=1; arx<nb_antennas_rx; arx++) {
      if (rxsig_t[arx] != NULL) {
        for (i=0; i<FRAME_LENGTH_COMPLEX_SAMPLES; i++) {
          rxsig_t_dB[arx][i] = 10*log10(1.0+(float) ((rxsig_t[arx][2*i])*(rxsig_t[arx][2*i])+(rxsig_t[arx][2*i+1])*(rxsig_t[arx][2*i+1])));
569
        }
570 571 572

        fl_add_xyplot_overlay(form->rxsig_t,arx,time,rxsig_t_dB[arx],FRAME_LENGTH_COMPLEX_SAMPLES,rx_antenna_colors[arx]);
      }
573
    }
574
  }
575

576 577 578 579 580 581 582 583 584 585 586 587 588
  // Channel Impulse Response (still repeated format)
  if (chest_t != NULL) {
    ymax = 0;

    if (chest_t[0] !=NULL) {
      for (i=0; i<(frame_parms->ofdm_symbol_size>>3); i++) {
        chest_t_abs[0][i] = (float) (chest_t[0][4*i]*chest_t[0][4*i]+chest_t[0][4*i+1]*chest_t[0][4*i+1]);

        if (chest_t_abs[0][i] > ymax)
          ymax = chest_t_abs[0][i];
      }

      fl_set_xyplot_data(form->chest_t,time,chest_t_abs[0],(frame_parms->ofdm_symbol_size>>3),"","","");
589
    }
590 591 592 593 594 595 596 597

    for (arx=1; arx<nb_antennas_rx; arx++) {
      if (chest_t[arx] !=NULL) {
        for (i=0; i<(frame_parms->ofdm_symbol_size>>3); i++) {
          chest_t_abs[arx][i] = (float) (chest_t[arx][4*i]*chest_t[arx][4*i]+chest_t[arx][4*i+1]*chest_t[arx][4*i+1]);

          if (chest_t_abs[arx][i] > ymax)
            ymax = chest_t_abs[arx][i];
598
        }
599 600 601 602

        fl_add_xyplot_overlay(form->chest_t,arx,time,chest_t_abs[arx],(frame_parms->ofdm_symbol_size>>3),rx_antenna_colors[arx]);
        fl_set_xyplot_overlay_type(form->chest_t,arx,FL_DASHED_XYPLOT);
      }
603 604
    }

605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623
    // Avoid flickering effect
    //        fl_get_xyplot_ybounds(form->chest_t,&ymin,&ymax); // Does not always work...
    fl_set_xyplot_ybounds(form->chest_t,0,(double) ymax);
  }

  // Channel Frequency Response (includes 5 complex sample for filter)
  if (chest_f != NULL) {
    ind = 0;

    for (atx=0; atx<nb_antennas_tx; atx++) {
      for (arx=0; arx<nb_antennas_rx; arx++) {
        if (chest_f[(atx<<1)+arx] != NULL) {
          for (k=0; k<nsymb_ce; k++) {
            freq[ind] = (float)ind;
            Re = (float)(chest_f[(atx<<1)+arx][(2*k)]);
            Im = (float)(chest_f[(atx<<1)+arx][(2*k)+1]);
            chest_f_abs[ind] = (short)10*log10(1.0+((double)Re*Re + (double)Im*Im));
            ind++;
          }
624
        }
625
      }
626 627
    }

628 629 630 631 632 633
    // tx antenna 0
    fl_set_xyplot_xbounds(form->chest_f,0,nb_antennas_rx*nb_antennas_tx*nsymb_ce);
    //fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*frame_parms->symbols_per_tti,2);
    //        fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*2,2);
    fl_set_xyplot_xgrid(form->chest_f,FL_GRID_MAJOR);
    fl_set_xyplot_data(form->chest_f,freq,chest_f_abs,nsymb_ce,"","","");
634

635 636
    for (arx=1; arx<nb_antennas_rx; arx++) {
      fl_add_xyplot_overlay(form->chest_f,1,&freq[arx*nsymb_ce],&chest_f_abs[arx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
637 638
    }

639 640 641 642 643 644 645
    // other tx antennas
    if (nb_antennas_tx > 1) {
      if (nb_antennas_rx > 1) {
        for (atx=1; atx<nb_antennas_tx; atx++) {
          for (arx=0; arx<nb_antennas_rx; arx++) {
            fl_add_xyplot_overlay(form->chest_f,(atx<<1)+arx,&freq[((atx<<1)+arx)*nsymb_ce],&chest_f_abs[((atx<<1)+arx)*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
          }
646
        }
647 648 649 650 651
      } else { // 1 rx antenna
        atx=1;
        arx=0;
        fl_add_xyplot_overlay(form->chest_f,atx,&freq[atx*nsymb_ce],&chest_f_abs[atx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
      }
652
    }
653
  }
654

655 656 657 658 659
  // PBCH LLRs
  if (pbch_llr != NULL) {
    for (i=0; i<1920; i++) {
      llr_pbch[i] = (float) pbch_llr[i];
      bit_pbch[i] = (float) i;
660
    }
661 662 663 664 665 666 667 668 669

    fl_set_xyplot_data(form->pbch_llr,bit_pbch,llr_pbch,1920,"","","");
  }

  // PBCH I/Q of MF Output
  if (pbch_comp!=NULL) {
    for (i=0; i<72*2; i++) {
      I[i] = pbch_comp[2*i];
      Q[i] = pbch_comp[2*i+1];
670
    }
671

672 673 674 675 676 677 678 679
    fl_set_xyplot_data(form->pbch_comp,I,Q,72*2,"","","");
  }

  // PDCCH LLRs
  if (pdcch_llr != NULL) {
    for (i=0; i<12*frame_parms->N_RB_DL*2*num_pdcch_symbols; i++) {
      llr_pdcch[i] = (float) pdcch_llr[i];
      bit_pdcch[i] = (float) i;
680 681
    }

682
    fl_set_xyplot_xbounds(form->pdcch_llr,0,12*frame_parms->N_RB_DL*2*3);
laurent's avatar
laurent committed
683 684 685 686 687

    if (frame_parms->N_RB_DL != 100) {
      fl_set_xyplot_data(form->pdcch_llr,bit_pdcch,llr_pdcch,12*frame_parms->N_RB_DL*2*num_pdcch_symbols,"","","");
    } else {
      LOG_D(PHY,"UE PDCCH LLR plot is bugged in 20 MHz BW, to be fixed !!!\n");
688
    }
689
  }
690

691 692 693 694 695
  // PDCCH I/Q of MF Output
  if (pdcch_comp!=NULL) {
    for (i=0; i<12*frame_parms->N_RB_DL*num_pdcch_symbols; i++) {
      I[i] = pdcch_comp[2*i];
      Q[i] = pdcch_comp[2*i+1];
696
    }
laurent's avatar
laurent committed
697 698 699 700 701

    if (frame_parms->N_RB_DL != 100) {
      fl_set_xyplot_data(form->pdcch_comp,I,Q,12*frame_parms->N_RB_DL*num_pdcch_symbols,"","","");
    } else {
      LOG_D(PHY,"UE PDCCH COMP plot is bugged in 20 MHz BW, to be fixed !!!\n");
702
    }
703
  }
704

705 706
  // PDSCH LLRs
  if (pdsch_llr != NULL) {
Florian Kaltenberger's avatar
Florian Kaltenberger committed
707 708
    for (i=0; i<coded_bits_per_codeword; i++) {
      llr[i] = (float) pdsch_llr[i];
709
      bit[i] = (float) i;
710 711
    }

Florian Kaltenberger's avatar
Florian Kaltenberger committed
712
    fl_set_xyplot_xbounds(form->pdsch_llr,0,coded_bits_per_codeword);
laurent's avatar
laurent committed
713 714 715 716 717

    if (frame_parms->N_RB_DL != 100) {
      fl_set_xyplot_data(form->pdsch_llr,bit,llr,coded_bits_per_codeword,"","","");
    } else {
      LOG_D(PHY,"UE PDSCH LLR plot is bugged in 20 MHz BW, to be fixed !!!\n");
718
    }
719 720 721 722 723 724 725 726
  }

  // PDSCH I/Q of MF Output
  if (pdsch_comp!=NULL) {
    ind=0;

    for (k=0; k<frame_parms->symbols_per_tti; k++) {
      for (i=0; i<12*frame_parms->N_RB_DL/2; i++) {
laurent's avatar
laurent committed
727
        int j = (2*frame_parms->N_RB_DL*12*k)+4*i;
728 729
        I[ind] = (pdsch_mag[j  ]!=0? 1.0/pdsch_mag[j  ]: 0.0) * pdsch_comp[j  ]*1.0;
        Q[ind] = (pdsch_mag[j+1]!=0? 1.0/pdsch_mag[j+1]: 0.0) * pdsch_comp[j+1]*1.0;
730 731
        ind++;
      }
732
    }
733 734 735 736 737

    fl_set_xyplot_data(form->pdsch_comp,I,Q,ind,"","","");
  }

  // PDSCH Throughput
738 739
  memmove( tput_time_ue[UE_id], &tput_time_ue[UE_id][1], (TPUT_WINDOW_LENGTH-1)*sizeof(float) );
  memmove( tput_ue[UE_id],      &tput_ue[UE_id][1],      (TPUT_WINDOW_LENGTH-1)*sizeof(float) );
740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762
  tput_time_ue[UE_id][TPUT_WINDOW_LENGTH-1]  = (float) frame;
  tput_ue[UE_id][TPUT_WINDOW_LENGTH-1] = ((float) total_dlsch_bitrate)/1000.0;

  if (tput_ue[UE_id][TPUT_WINDOW_LENGTH-1] > tput_ue_max[UE_id]) {
    tput_ue_max[UE_id] = tput_ue[UE_id][TPUT_WINDOW_LENGTH-1];
  }

  fl_set_xyplot_data(form->pdsch_tput,tput_time_ue[UE_id],tput_ue[UE_id],TPUT_WINDOW_LENGTH,"","","");
  fl_set_xyplot_ybounds(form->pdsch_tput,0,tput_ue_max[UE_id]);
  fl_check_forms();
  free(I);
  free(Q);
  free(chest_f_abs);
  free(llr);
  free(bit);
  free(bit_pdcch);
  free(llr_pdcch);

  for (arx=0; arx<nb_antennas_rx; arx++) {
    free(chest_t_abs[arx]);
  }

  free(chest_t_abs);
763
}