int WebRtcSpl_RealForwardFFT(struct RealFFT* self, const int16_t* real_data_in, int16_t* complex_data_out) { int i = 0; int j = 0; int result = 0; int n = 1 << self->order; // The complex-value FFT implementation needs a buffer to hold 2^order // 16-bit COMPLEX numbers, for both time and frequency data. int16_t complex_buffer[2 << kMaxFFTOrder]; // Insert zeros to the imaginary parts for complex forward FFT input. for (i = 0, j = 0; i < n; i += 1, j += 2) { complex_buffer[j] = real_data_in[i]; complex_buffer[j + 1] = 0; }; WebRtcSpl_ComplexBitReverse(complex_buffer, self->order); result = WebRtcSpl_ComplexFFT(complex_buffer, self->order, 1); // For real FFT output, use only the first N + 2 elements from // complex forward FFT. memcpy(complex_data_out, complex_buffer, sizeof(int16_t) * (n + 2)); return result; }
int WebRtcSpl_RealForwardFFTC(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_ComplexFFT(data_out, self->order, 1); }