Exemplo n.º 1
0
/* Create DFT plans for transform precoding */
int srslte_dft_precoding_init(srslte_dft_precoding_t *q, uint32_t max_prb) 
{
  int ret = SRSLTE_ERROR_INVALID_INPUTS; 
  bzero(q, sizeof(srslte_dft_precoding_t));
  
  if (max_prb <= SRSLTE_MAX_PRB) {
    ret = SRSLTE_ERROR; 
    for (uint32_t i=1;i<=max_prb;i++) {
      if(srslte_dft_precoding_valid_prb(i)) {        
        DEBUG("Initiating DFT precoding plan for %d PRBs\n", i);
        if (srslte_dft_plan_c(&q->dft_plan[i], i*SRSLTE_NRE, SRSLTE_DFT_FORWARD)) {
          fprintf(stderr, "Error: Creating DFT plan %d\n",i);
          goto clean_exit;
        }
        srslte_dft_plan_set_norm(&q->dft_plan[i], true);
        if (srslte_dft_plan_c(&q->idft_plan[i], i*SRSLTE_NRE, SRSLTE_DFT_BACKWARD)) {
          fprintf(stderr, "Error: Creating DFT plan %d\n",i);
          goto clean_exit;
        }
        srslte_dft_plan_set_norm(&q->idft_plan[i], true);
      }
    }
    q->max_prb = max_prb;
    ret = SRSLTE_SUCCESS;
  } 

clean_exit:
  if (ret == SRSLTE_ERROR) {
    srslte_dft_precoding_free(q);
  }
  return ret; 
}
Exemplo n.º 2
0
/* Free DFT plans for transform precoding */
void srslte_dft_precoding_free(srslte_dft_precoding_t  *q) 
{
  for (uint32_t i=1;i<=q->max_prb;i++) {
    if(srslte_dft_precoding_valid_prb(i)) {      
      srslte_dft_plan_free(&q->dft_plan[i]);
    }
  }  
  bzero(q, sizeof(srslte_dft_precoding_t));
}
Exemplo n.º 3
0
int srslte_chest_ul_estimate(srslte_chest_ul_t *q, cf_t *input, cf_t *ce, 
                             uint32_t nof_prb, uint32_t sf_idx, uint32_t cyclic_shift_for_dmrs, uint32_t n_prb[2]) 
{
  if (!q->dmrs_signal_configured) {
    fprintf(stderr, "Error must call srslte_chest_ul_set_cfg() before using the UL estimator\n");
    return SRSLTE_ERROR; 
  }
  
  if (!srslte_dft_precoding_valid_prb(nof_prb)) {
    fprintf(stderr, "Error invalid nof_prb=%d\n", nof_prb);
    return SRSLTE_ERROR_INVALID_INPUTS;
  }
  
  int nrefs_sym = nof_prb*SRSLTE_NRE; 
  int nrefs_sf  = nrefs_sym*2; 
  
  /* Get references from the input signal */
  srslte_refsignal_dmrs_pusch_get(&q->dmrs_signal, input, nof_prb, n_prb, q->pilot_recv_signal);
  
  /* Use the known DMRS signal to compute Least-squares estimates */
  srslte_vec_prod_conj_ccc(q->pilot_recv_signal, q->dmrs_pregen.r[cyclic_shift_for_dmrs][sf_idx][nof_prb], 
                           q->pilot_estimates, nrefs_sf);
  
  if (n_prb[0] != n_prb[1]) {
    printf("ERROR: intra-subframe frequency hopping not supported in the estimator!!\n");
  }
  
  if (ce != NULL) {
    if (q->smooth_filter_len > 0) {
      average_pilots(q, q->pilot_estimates, ce, nrefs_sym, n_prb);
      interpolate_pilots(q, ce, nrefs_sym, n_prb);        
      
      /* If averaging, compute noise from difference between received and averaged estimates */
      q->noise_estimate = estimate_noise_pilots(q, ce, nrefs_sym, n_prb);
    } else {
      // Copy estimates to CE vector without averaging
      for (int i=0;i<2;i++) {
        memcpy(&ce[SRSLTE_REFSIGNAL_UL_L(i, q->cell.cp)*q->cell.nof_prb*SRSLTE_NRE+n_prb[i]*SRSLTE_NRE], 
               &q->pilot_estimates[i*nrefs_sym], 
               nrefs_sym*sizeof(cf_t));        
      }
      interpolate_pilots(q, ce, nrefs_sym, n_prb);                  
      q->noise_estimate = 0;              
    }
  }
  
  // Estimate received pilot power 
  q->pilot_power = srslte_vec_avg_power_cf(q->pilot_recv_signal, nrefs_sf); 
  return 0;
}
Exemplo n.º 4
0
int srslte_dft_precoding(srslte_dft_precoding_t *q, cf_t *input, cf_t *output, 
                  uint32_t nof_prb, uint32_t nof_symbols) 
{
  
  if (!srslte_dft_precoding_valid_prb(nof_prb) && nof_prb <= q->max_prb) {
    fprintf(stderr, "Error invalid number of PRB (%d)\n", nof_prb);
    return SRSLTE_ERROR; 
  }

  for (uint32_t i=0;i<nof_symbols;i++) {
    srslte_dft_run_c(&q->dft_plan[nof_prb], &input[i*SRSLTE_NRE*nof_prb], &output[i*SRSLTE_NRE*nof_prb]);
  }
  
  return SRSLTE_SUCCESS;
}