int WebRtcSpl_RealInverseFFT(struct RealFFT* self, const int16_t* complex_data_in, int16_t* real_data_out) { int i = 0; int j = 0; int result = 0; int n = 1 << self->order; // Create the buffer specific to complex-valued FFT implementation. int16_t complex_buffer[2 << kMaxFFTOrder]; // For n-point FFT, first copy the first n + 2 elements into complex // FFT, then construct the remaining n - 2 elements by real FFT's // conjugate-symmetric properties. memcpy(complex_buffer, complex_data_in, sizeof(int16_t) * (n + 2)); for (i = n + 2; i < 2 * n; i += 2) { complex_buffer[i] = complex_data_in[2 * n - i]; complex_buffer[i + 1] = -complex_data_in[2 * n - i + 1]; } WebRtcSpl_ComplexBitReverse(complex_buffer, self->order); result = WebRtcSpl_ComplexIFFT(complex_buffer, self->order, 1); // Strip out the imaginary parts of the complex inverse FFT output. for (i = 0, j = 0; i < n; i += 1, j += 2) { real_data_out[i] = complex_buffer[j]; } return result; }
int WebRtcSpl_RealInverseFFTC(struct RealFFT* self, const int16_t* data_in, int16_t* data_out) { memcpy(data_out, data_in, sizeof(int16_t) * (1 << (self->order + 1))); WebRtcSpl_ComplexBitReverse(data_out, self->order); return WebRtcSpl_ComplexIFFT(data_out, self->order, 1); }