int srslte_prach_init(srslte_prach_t *p, uint32_t N_ifft_ul, uint32_t preamble_format, uint32_t root_seq_index, bool high_speed_flag, uint32_t zero_corr_zone_config) { int ret = SRSLTE_ERROR; if(p != NULL && N_ifft_ul < 2049 && preamble_format < 4 && // Currently supporting formats 0-3 root_seq_index < MAX_ROOTS && zero_corr_zone_config < 16) { p->f = preamble_format; p->rsi = root_seq_index; p->hs = high_speed_flag; p->zczc = zero_corr_zone_config; // Determine N_zc and N_cs if(4 == preamble_format){ p->N_zc = 139; p->N_cs = prach_Ncs_format4[p->zczc]; }else{ p->N_zc = 839; if(p->hs){ p->N_cs = prach_Ncs_restricted[p->zczc]; }else{ p->N_cs = prach_Ncs_unrestricted[p->zczc]; } } // Set up containers p->prach_bins = srslte_vec_malloc(sizeof(cf_t)*p->N_zc); p->corr_spec = srslte_vec_malloc(sizeof(cf_t)*p->N_zc); p->corr = srslte_vec_malloc(sizeof(float)*p->N_zc); // Set up ZC FFTS p->zc_fft = (srslte_dft_plan_t*)srslte_vec_malloc(sizeof(srslte_dft_plan_t)); if(srslte_dft_plan(p->zc_fft, p->N_zc, SRSLTE_DFT_FORWARD, SRSLTE_DFT_COMPLEX)){ return SRSLTE_ERROR; } srslte_dft_plan_set_mirror(p->zc_fft, false); srslte_dft_plan_set_norm(p->zc_fft, true); p->zc_ifft = (srslte_dft_plan_t*)srslte_vec_malloc(sizeof(srslte_dft_plan_t)); if(srslte_dft_plan(p->zc_ifft, p->N_zc, SRSLTE_DFT_BACKWARD, SRSLTE_DFT_COMPLEX)){ return SRSLTE_ERROR; } srslte_dft_plan_set_mirror(p->zc_ifft, false); srslte_dft_plan_set_norm(p->zc_ifft, true); // Generate our 64 sequences p->N_roots = 0; srslte_prach_gen_seqs(p); // Generate sequence FFTs for(int i=0;i<N_SEQS;i++){ srslte_dft_run(p->zc_fft, p->seqs[i], p->dft_seqs[i]); } // Create our FFT objects and buffers p->N_ifft_ul = N_ifft_ul; if(4 == preamble_format){ p->N_ifft_prach = p->N_ifft_ul * DELTA_F/DELTA_F_RA_4; }else{ p->N_ifft_prach = p->N_ifft_ul * DELTA_F/DELTA_F_RA; } p->ifft_in = (cf_t*)srslte_vec_malloc(p->N_ifft_prach*sizeof(cf_t)); p->ifft_out = (cf_t*)srslte_vec_malloc(p->N_ifft_prach*sizeof(cf_t)); p->ifft = (srslte_dft_plan_t*)srslte_vec_malloc(sizeof(srslte_dft_plan_t)); if(srslte_dft_plan(p->ifft, p->N_ifft_prach, SRSLTE_DFT_BACKWARD, SRSLTE_DFT_COMPLEX)) { fprintf(stderr, "Error creating DFT plan\n"); return -1; } srslte_dft_plan_set_mirror(p->ifft, true); srslte_dft_plan_set_norm(p->ifft, true); p->fft = (srslte_dft_plan_t*)srslte_vec_malloc(sizeof(srslte_dft_plan_t)); if(srslte_dft_plan(p->fft, p->N_ifft_prach, SRSLTE_DFT_FORWARD, SRSLTE_DFT_COMPLEX)){ fprintf(stderr, "Error creating DFT plan\n"); return -1; } srslte_dft_plan_set_mirror(p->fft, true); srslte_dft_plan_set_norm(p->fft, true); p->N_seq = prach_Tseq[p->f]*p->N_ifft_ul/2048; p->N_cp = prach_Tcp[p->f]*p->N_ifft_ul/2048; ret = SRSLTE_SUCCESS; } else { fprintf(stderr, "Invalid parameters\n"); } return ret; }
int srslte_prach_init(srslte_prach_t *p, uint32_t N_ifft_ul, uint32_t config_idx, uint32_t root_seq_index, bool high_speed_flag, uint32_t zero_corr_zone_config) { int ret = SRSLTE_ERROR; if(p != NULL && N_ifft_ul < 2049 && config_idx < 16 && root_seq_index < MAX_ROOTS) { uint32_t preamble_format = srslte_prach_get_preamble_format(config_idx); p->config_idx = config_idx; p->f = preamble_format; p->rsi = root_seq_index; p->hs = high_speed_flag; p->zczc = zero_corr_zone_config; p->detect_factor = PRACH_DETECT_FACTOR; // Determine N_zc and N_cs if(4 == preamble_format){ if (p->zczc < 7) { p->N_zc = 139; p->N_cs = prach_Ncs_format4[p->zczc]; } else { fprintf(stderr, "Invalid zeroCorrelationZoneConfig=%d for format4\n", p->zczc); return SRSLTE_ERROR; } }else{ p->N_zc = 839; if(p->hs){ if (p->zczc < 15) { p->N_cs = prach_Ncs_restricted[p->zczc]; } else { fprintf(stderr, "Invalid zeroCorrelationZoneConfig=%d for restricted set\n", p->zczc); return SRSLTE_ERROR; } }else{ if (p->zczc < 16) { p->N_cs = prach_Ncs_unrestricted[p->zczc]; } else { fprintf(stderr, "Invalid zeroCorrelationZoneConfig=%d\n", p->zczc); return SRSLTE_ERROR; } } } // Set up containers p->prach_bins = srslte_vec_malloc(sizeof(cf_t)*p->N_zc); p->corr_spec = srslte_vec_malloc(sizeof(cf_t)*p->N_zc); p->corr = srslte_vec_malloc(sizeof(float)*p->N_zc); // Set up ZC FFTS p->zc_fft = (srslte_dft_plan_t*)srslte_vec_malloc(sizeof(srslte_dft_plan_t)); if(srslte_dft_plan(p->zc_fft, p->N_zc, SRSLTE_DFT_FORWARD, SRSLTE_DFT_COMPLEX)){ return SRSLTE_ERROR; } srslte_dft_plan_set_mirror(p->zc_fft, false); srslte_dft_plan_set_norm(p->zc_fft, true); p->zc_ifft = (srslte_dft_plan_t*)srslte_vec_malloc(sizeof(srslte_dft_plan_t)); if(srslte_dft_plan(p->zc_ifft, p->N_zc, SRSLTE_DFT_BACKWARD, SRSLTE_DFT_COMPLEX)){ return SRSLTE_ERROR; } srslte_dft_plan_set_mirror(p->zc_ifft, false); srslte_dft_plan_set_norm(p->zc_ifft, false); // Generate our 64 sequences p->N_roots = 0; srslte_prach_gen_seqs(p); // Generate sequence FFTs for(int i=0;i<N_SEQS;i++){ srslte_dft_run(p->zc_fft, p->seqs[i], p->dft_seqs[i]); } // Create our FFT objects and buffers p->N_ifft_ul = N_ifft_ul; if(4 == preamble_format){ p->N_ifft_prach = p->N_ifft_ul * DELTA_F/DELTA_F_RA_4; }else{ p->N_ifft_prach = p->N_ifft_ul * DELTA_F/DELTA_F_RA; } /* The deadzone specifies the number of samples at the end of the correlation window * that will be considered as belonging to the next preamble */ p->deadzone = 0; /* if(p->N_cs != 0) { float samp_rate=15000*p->N_ifft_ul; p->deadzone = (uint32_t) ceil((float) samp_rate/((float) p->N_zc*subcarrier_spacing)); }*/ p->ifft_in = (cf_t*)srslte_vec_malloc(p->N_ifft_prach*sizeof(cf_t)); p->ifft_out = (cf_t*)srslte_vec_malloc(p->N_ifft_prach*sizeof(cf_t)); p->ifft = (srslte_dft_plan_t*)srslte_vec_malloc(sizeof(srslte_dft_plan_t)); if(srslte_dft_plan(p->ifft, p->N_ifft_prach, SRSLTE_DFT_BACKWARD, SRSLTE_DFT_COMPLEX)) { fprintf(stderr, "Error creating DFT plan\n"); return -1; } srslte_dft_plan_set_mirror(p->ifft, true); srslte_dft_plan_set_norm(p->ifft, true); p->fft = (srslte_dft_plan_t*)srslte_vec_malloc(sizeof(srslte_dft_plan_t)); if(srslte_dft_plan(p->fft, p->N_ifft_prach, SRSLTE_DFT_FORWARD, SRSLTE_DFT_COMPLEX)){ fprintf(stderr, "Error creating DFT plan\n"); return -1; } p->signal_fft = srslte_vec_malloc(sizeof(cf_t)*p->N_ifft_prach); if (!p->signal_fft) { fprintf(stderr, "Error allocating memory\n"); return -1; } srslte_dft_plan_set_mirror(p->fft, true); srslte_dft_plan_set_norm(p->fft, false); p->N_seq = prach_Tseq[p->f]*p->N_ifft_ul/2048; p->N_cp = prach_Tcp[p->f]*p->N_ifft_ul/2048; p->T_seq = prach_Tseq[p->f]*SRSLTE_LTE_TS; ret = SRSLTE_SUCCESS; } else { fprintf(stderr, "Invalid parameters\n"); } return ret; }