OMXResult InverseFFT(OMX_FC32* y, OMX_FC32* z, OMXFFTSpec_C_FC32 *fft_inv_spec) { return omxSP_FFTInv_CToC_FC32_Sfs(y, z, fft_inv_spec); }
float RunOneInverseTest(int fft_log_size, int signal_type, float signal_value, struct SnrResult* snr) { OMX_FC32* x; OMX_FC32* y; OMX_FC32* z; struct AlignedPtr* x_aligned; struct AlignedPtr* y_aligned; struct AlignedPtr* z_aligned; OMX_INT n, fft_spec_buffer_size; OMXResult status; OMXFFTSpec_C_FC32 * fft_fwd_spec = NULL; OMXFFTSpec_C_FC32 * fft_inv_spec = NULL; int fft_size; fft_size = 1 << fft_log_size; status = omxSP_FFTGetBufSize_C_FC32(fft_log_size, &fft_spec_buffer_size); if (verbose > 3) { printf("fft_spec_buffer_size = %d\n", fft_spec_buffer_size); } fft_inv_spec = (OMXFFTSpec_C_FC32*)malloc(fft_spec_buffer_size); status = omxSP_FFTInit_C_FC32(fft_inv_spec, fft_log_size); if (status) { fprintf(stderr, "Failed to init backward FFT: status = %d, order %d\n", status, fft_log_size); exit(1); } x_aligned = AllocAlignedPointer(32, sizeof(*x) * fft_size); y_aligned = AllocAlignedPointer(32, sizeof(*y) * (fft_size + 2)); z_aligned = AllocAlignedPointer(32, sizeof(*z) * fft_size); x = x_aligned->aligned_pointer_; y = y_aligned->aligned_pointer_; z = z_aligned->aligned_pointer_; GenerateSignal(x, y, fft_size, signal_type, signal_value); if (verbose > 63) { printf("Inverse FFT Input Signal\n"); DumpArrayComplexFloat("x", fft_size, y); printf("Expected Inverse FFT output\n"); DumpArrayComplexFloat("x", fft_size, x); } status = omxSP_FFTInv_CToC_FC32_Sfs(y, z, fft_inv_spec); if (status) { fprintf(stderr, "Inverse FFT failed: status = %d\n", status); exit(1); } if (verbose > 63) { printf("Actual Inverse FFT Output\n"); DumpArrayComplexFloat("z", fft_size, z); } CompareComplexFloat(snr, z, x, fft_size); FreeAlignedPointer(x_aligned); FreeAlignedPointer(y_aligned); FreeAlignedPointer(z_aligned); free(fft_inv_spec); return snr->complex_snr_; }