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; }
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; }
/**@ingroup plp_sink * Prints or displays the signal according to the selected mode. */ int work(void **inp, void **out) { int n,i,j; int mode; float *r_input; _Complex float *c_input; dft_plan_t *plan; strdef(xlabel); if (mode_id != NULL) { if (param_get_int(mode_id,&mode) != 1) { mode = 0; } } else { mode = 0; } memset(signal_lengths,0,sizeof(int)*2*NOF_INPUT_ITF); for (n=0;n<NOF_INPUT_ITF;n++) { if (is_complex && mode != MODE_PSD) { signal_lengths[2*n] = get_input_samples(n)/2; signal_lengths[2*n+1] = signal_lengths[2*n]; } else { signal_lengths[n] = get_input_samples(n); } if (get_input_samples(n) != last_rcv_samples) { last_rcv_samples = get_input_samples(n); #ifdef _COMPILE_ALOE modinfo_msg("Receiving %d samples at tslot %d\n",last_rcv_samples, oesr_tstamp(ctx)); #endif } } #ifdef _COMPILE_ALOE if (print_not_received) { for (n=0;n<NOF_INPUT_ITF;n++) { if (MOD_DEBUG) { ainfo_msg("ts=%d, rcv_len=%d\n",oesr_tstamp(ctx),get_input_samples(n)); } if (!get_input_samples(n)) { printf("ts=%d. Data not received from interface %d\n",oesr_tstamp(ctx),n); } } } #endif #ifdef _COMPILE_ALOE if (oesr_tstamp(ctx)-last_tstamp < interval_ts) { return 0; } last_tstamp = interval_ts; #endif switch(mode) { case MODE_SILENT: break; case MODE_PRINT: for (n=0;n<NOF_INPUT_ITF;n++) { if (inp[n]) { print_signal(inp[n],get_input_samples(n)); } } break; case MODE_SCOPE: #ifdef _COMPILE_ALOE snprintf(xlabel,STR_LEN,"# sample (ts=%d)",oesr_tstamp(ctx)); #else snprintf(xlabel,STR_LEN,"# sample"); #endif if (is_complex) { set_legend(c_legends,2*NOF_INPUT_ITF); } else { set_legend(r_legends,NOF_INPUT_ITF); } set_labels(xlabel,"amp"); for (n=0;n<NOF_INPUT_ITF;n++) { if (inp[n]) { if (is_complex) { c_input = inp[n]; for (i=0;i<signal_lengths[2*n];i++) { pl_signals[2*n*INPUT_MAX_SAMPLES+i] = (double) __real__ c_input[i]; pl_signals[(2*n+1)*INPUT_MAX_SAMPLES+i] = (double) __imag__ c_input[i]; } } else { r_input = inp[n]; for (i=0;i<signal_lengths[n];i++) { pl_signals[n*INPUT_MAX_SAMPLES+i] = (double) r_input[i]; } } } } plp_draw(pl_signals,signal_lengths,0); break; case MODE_PSD: #ifdef _COMPILE_ALOE snprintf(xlabel,STR_LEN,"freq. idx (ts=%d)",oesr_tstamp(ctx)); #else snprintf(xlabel,STR_LEN,"freq. idx"); #endif set_labels(xlabel,"PSD (dB/Hz)"); set_legend(fft_legends,NOF_INPUT_ITF); for (i=0;i<NOF_INPUT_ITF;i++) { if (signal_lengths[i]) { if (fft_size) { signal_lengths[i] = signal_lengths[i]>fft_size?fft_size:signal_lengths[i]; } plan = find_plan(signal_lengths[i]); c_input = inp[i]; r_input = inp[i]; if (!plan) { if ((plan = generate_new_plan(signal_lengths[i])) == NULL) { moderror("Generating plan.\n"); return -1; } } if (is_complex) { dft_run_c2r(plan, c_input, &f_pl_signals[i*INPUT_MAX_SAMPLES]); } else { dft_run_r2r(plan, r_input, &f_pl_signals[i*INPUT_MAX_SAMPLES]); } /*if (!is_complex) { signal_lengths[i] = signal_lengths[i]/2; }*/ for (j=0;j<signal_lengths[i];j++) { pl_signals[i*INPUT_MAX_SAMPLES+j] = (double) f_pl_signals[i*INPUT_MAX_SAMPLES+j]; } } } for (i=NOF_INPUT_ITF;i<2*NOF_INPUT_ITF;i++) { signal_lengths[i] = 0; } plp_draw(pl_signals,signal_lengths,0); break; default: moderror_msg("Unknown mode %d\n",mode); return -1; } return 0; }