int conv_fft_cc_run(conv_fft_cc_t *state, _Complex float *input, _Complex float *filter, _Complex float *output) { dft_run_c2c(&state->input_plan, input, state->input_fft); dft_run_c2c(&state->filter_plan, filter, state->filter_fft); vec_dot_prod(state->input_fft,state->filter_fft,state->output_fft,state->output_len); dft_run_c2c(&state->output_plan, state->output_fft, output); return state->output_len; }
void dft_run(dft_plan_t *plan, void *in, void *out) { switch(plan->mode) { case COMPLEX_2_COMPLEX: dft_run_c2c(plan,in,out); break; case REAL_2_REAL: dft_run_r2r(plan,in,out); break; case COMPLEX_2_REAL: dft_run_c2r(plan,in,out); break; } }
/* Assumes input points to the beginning of the SSS symbol. The SSS symbol start is * given by SSS_SYMBOL_ST() macro in sss.h. * Estimates the m0 and m1 values and saves in m0_value and m1_value * the resulted correlation (higher is more likely) * * * Source: "SSS Detection Method for Initial Cell Search in 3GPP LTE FDD/TDD Dual Mode Receiver" * Jung-In Kim, Jung-Su Han, Hee-Jin Roh and Hyung-Jin Choi * */ void sss_synch_m0m1(sss_synch_t *q, cf_t *input, int *m0, float *m0_value, int *m1, float *m1_value) { /* This is aprox 3-4 kbytes of stack. Consider moving to sss_synch_t?? */ cf_t zdelay[N_SSS+1],zconj[N_SSS+1],zprod[N_SSS+1]; cf_t y[2][N_SSS+1], z[N_SSS+1], tmp[N_SSS+1]; float tmp_real[N_SSS+1]; cf_t input_fft[SSS_DFT_LEN]; int i; dft_run_c2c(&q->dftp_input, input, input_fft); for (i = 0; i < N_SSS; i++) { y[0][i] = input_fft[SSS_POS_SYMBOL + 2 * i]; y[1][i] = input_fft[SSS_POS_SYMBOL + 2 * i + 1]; } vec_prod_ccc(y[0], q->fc_tables.c[0], z, N_SSS); memcpy(zdelay, &z[1], (N_SSS - 1) * sizeof(cf_t)); vec_conj_cc(z, zconj, N_SSS - 1); vec_prod_ccc(zdelay, zconj, zprod, N_SSS - 1); corr_all_zs(zprod, q->fc_tables.s, tmp); vec_abs_cf(tmp, tmp_real, N_SSS); *m0 = vec_max_fi(tmp_real, N_SSS); if (m0_value) { *m0_value = tmp_real[*m0]; } vec_prod_ccc(y[1], q->fc_tables.c[1], tmp, N_SSS); vec_prod_ccc(tmp, q->fc_tables.z1[*m0], z, N_SSS); memcpy(zdelay, &z[1], (N_SSS - 1) * sizeof(cf_t)); vec_conj_cc(z, zconj, N_SSS - 1); vec_prod_ccc(zdelay, zconj, zprod, N_SSS - 1); corr_all_zs(zprod, q->fc_tables.s, tmp); vec_abs_cf(tmp, tmp_real, N_SSS); *m1 = vec_max_fi(tmp_real, N_SSS); if (m1_value) { *m1_value = tmp_real[*m1]; } }
int work(void **inp, void **out) { int i, j, nof_fft; int dft_size; input_t *input; output_t *output; dft_plan_t *plan; if (param_get_int(dft_size_id,&dft_size) != 1) { moderror("Getting parameter dft_size\n"); return -1; } plan = find_plan(dft_size); if (!plan) { if ((plan = generate_new_plan(dft_size)) == NULL) { moderror("Generating plan.\n"); return -1; } } for (i=0;i<NOF_INPUT_ITF;i++) { input = inp[i]; output = out[i]; if (get_input_samples(i) % dft_size) { moderror_msg("Number of input samples (%d) must be multiple of dft_size (%d), in " "interface %d\n",get_input_samples(i),dft_size,i); return -1; } nof_fft = get_input_samples(i)/dft_size; for (j=0;j<nof_fft;j++) { dft_run_c2c(plan, &input[j*dft_size], &output[j*dft_size]); } set_output_samples(i,dft_size*nof_fft); } return 0; }
/** * @TODO: * - re-compute c from N_id_2 */ int work(void **inp, void **out) { int rcv_samples=get_input_samples(0); int m0,m1; int subframe_idx,N_id_1; input_t *input=inp[0]; if (!rcv_samples) { return 0; } dft_run_c2c(&plan, &input[sss_pos_in_frame], input_fft); if (!get_m0m1(&input_fft[sss_pos_in_symbol],&m0,&m1,correlation_threshold)) { return 0; } subframe_idx=decide_subframe(m0,m1); N_id_1=decide_N_id_1(m0,m1); modinfo_msg("m0=%d, m1=%d subframe=%d\n", m0,m1,subframe_idx,N_id_1); #ifdef _COMPILE_ALOE if (sf_pm_idx >= 0 && !(subframe_idx && first)) { first=0; if (param_remote_set(out, 0, sf_pm_idx, &subframe_idx, sizeof(int))) { moderror("Setting parameter\n"); return -1; } } #endif return 0; }
int work(void **inp, void **out) { int i, j, k; int rcv_samples, nof_ffts; int df, fs; int e; int dft_size; input_t *input; output_t *output; dft_plan_t *plan; if (param_get_int(dft_size_id,&dft_size) != 1) { dft_size = get_input_samples(0); moddebug("Parameter dft_size not defined. Assuming %d" " (number of input samples on interface 0).\n", dft_size); /*moderror("Getting parameter dft_size\n"); return -1;*/ } if (dft_size == 0) { modinfo("dft_size = 0. Returning.\n"); return 0; } else { moddebug("dft_size = %d.\n", dft_size); } /* if (param_get_int(param_id("dft_size"),&dft_size) != 1) { moddebug("Parameter dft_size not defined. Assuming %d" " (number of input samples on interface 0).\n", dft_size); } */ plan = find_plan(dft_size); if (!plan) { if ((plan = generate_new_plan(dft_size)) == NULL) { moderror("Generating plan.\n"); return -1; } } if (param_get_int(df_id, &df) != 1) { df = 0; } if (df != 0) { if (param_get_int(fs_id, &fs) != 1) { moderror("Parameter fs not defined.\n"); return -1; } if (fs <= 0) { moderror("Sampling rate fs must be larger than 0.\n"); return -1; } if ((df != previous_df) || (fs != previous_fs) || (dft_size != previous_dft_size)) { e = process_shift_params(df, fs, dft_size); if (e < 0) { return -1; } previous_df = df; previous_fs = fs; previous_dft_size = dft_size; } } for (i=0;i<NOF_INPUT_ITF;i++) { input = inp[i]; output = out[i]; rcv_samples = get_input_samples(i); moddebug("%d samples received on interface %d.\n",rcv_samples, i); if (rcv_samples == 0) { moddebug("%d samples to process. Returning.\n", rcv_samples); continue; } moddebug("Processing %d samples...\n",rcv_samples); if (rcv_samples % dft_size) { moderror_msg("Number of input samples (%d) not integer multiple" " of dft_size (%d) on interface %d\n",rcv_samples,dft_size,i); return -1; } if (get_input_samples(0)>0) { modinfo_msg("received %d samples\n",get_input_samples(0)); } nof_ffts = rcv_samples/dft_size; for (j=0;j<nof_ffts;j++) { if ((df != 0) && (direction == FORWARD)) { /* Rx: shift before FFT */ for (k=0;k<dft_size;k++) { input[j*dft_size+k] *= shift[k*shift_increment]; } } dft_run_c2c(plan, &input[j*dft_size], &output[j*dft_size]); if ((df !=0) && (direction == BACKWARD)) { /* Tx: shift after IFFT */ for (k=0;k<dft_size;k++) { output[j*dft_size+k] *= shift[k*shift_increment]; } } } set_output_samples(i,dft_size*nof_ffts); moddebug("%d samples sent to output interface %d.\n",dft_size*nof_ffts,i); } return 0; }