uint32_t srslte_conv_same_cf(cf_t *input, float *filter, cf_t *output, uint32_t input_len, uint32_t filter_len) { uint32_t i; uint32_t M = filter_len; uint32_t N = input_len; for (i=0;i<M/2;i++) { output[i]=srslte_vec_dot_prod_cfc(&input[i],&filter[M/2-i],M-M/2+i); } for (;i<N-M/2;i++) { output[i]=srslte_vec_dot_prod_cfc(&input[i-M/2],filter,M); } for (;i<N;i++) { output[i]=srslte_vec_dot_prod_cfc(&input[i-M/2],filter,N-i+M/2); } return N; }
static void corr_all_zs(cf_t z[SRSLTE_SSS_N], float s[SRSLTE_SSS_N][SRSLTE_SSS_N-1], float output[SRSLTE_SSS_N]) { uint32_t m; cf_t tmp[SRSLTE_SSS_N]; for (m = 0; m < SRSLTE_SSS_N; m++) { tmp[m] = srslte_vec_dot_prod_cfc(z, s[m], SRSLTE_SSS_N - 1); } srslte_vec_abs_square_cf(tmp, output, SRSLTE_SSS_N); }
void srslte_filt_decim_cc_execute(srslte_filt_cc_t *q, cf_t *input, cf_t *downsampled_input, cf_t *output, int size) { // we assume that "downsampled_input" made size (input/2 + order) so as to have prepended zeros // srslte_downsample_cc(input, downsampled_input + (q->num_taps - 1), q->factor, size); for(int i = 0;i < size/q->factor;i++) { output[i] = srslte_vec_dot_prod_cfc(&(downsampled_input[i]), q->taps, q->num_taps); } }
uint32_t srslte_conv_same_cf(cf_t *input, float *filter, cf_t *output, uint32_t input_len, uint32_t filter_len) { uint32_t i; uint32_t M = filter_len; uint32_t N = input_len; cf_t first[filter_len+filter_len/2]; cf_t last[filter_len+filter_len/2]; for (i=0;i<M+M/2;i++) { if (i<M/2) { first[i] = (2+M/2-i)*input[1]-(1+M/2-i)*input[0]; } else { first[i] = input[i-M/2]; } } for (i=0;i<M+M/2;i++) { if (i>=M-1) { last[i] = (2+i-M/2)*input[N-1]-(1+i-M/2)*input[N-2]; } else { last[i] = input[N-M+i+1]; } } for (i=0;i<M/2;i++) { output[i]=srslte_vec_dot_prod_cfc(&first[i],filter,M); } for (;i<N-M/2;i++) { output[i]=srslte_vec_dot_prod_cfc(&input[i-M/2],filter,M); } int j=0; for (;i<N;i++) { output[i]=srslte_vec_dot_prod_cfc(&last[j++],filter,M); } return N; }
static void corr_all_sz_partial(cf_t z[SRSLTE_SSS_N], float s[SRSLTE_SSS_N][SRSLTE_SSS_N], uint32_t M, float output[SRSLTE_SSS_N]) { uint32_t Nm = SRSLTE_SSS_N/M; cf_t tmp[SRSLTE_SSS_N]; float tmp_abs[MAX_M-1][SRSLTE_SSS_N]; int j, m; float *ptr; for (j=0;j<M;j++) { for (m = 0; m < SRSLTE_SSS_N; m++) { tmp[m] = srslte_vec_dot_prod_cfc(&z[j*Nm], &s[m][j*Nm], Nm); } if (j == 0) { ptr = output; } else { ptr = tmp_abs[j-1]; } srslte_vec_abs_square_cf(tmp, ptr, SRSLTE_SSS_N); } for (j=1;j<M;j++) { srslte_vec_sum_fff(tmp_abs[j-1], output, output, SRSLTE_SSS_N); } }