void FFTFrame::doInverseFFT(float* data) { // Prepare interleaved data. float* interleavedData = getUpToDateComplexData(); // Compute inverse transform. av_rdft_calc(m_inverseContext, interleavedData); // Scale so that a forward then inverse FFT yields exactly the original data. const float scale = 1.0 / m_FFTSize; VectorMath::vsmul(interleavedData, 1, &scale, data, 1, m_FFTSize); }
void FFTFrame::doInverseFFT(float* data) { Ipp32f* complexP = getUpToDateComplexData(); // Compute inverse transform. ippsDFTInv_PermToR_32f(complexP, reinterpret_cast<Ipp32f*>(data), m_DFTSpec, m_buffer); // Scale so that a forward then inverse FFT yields exactly the original data. const float scale = 1.0 / (2 * m_FFTSize); ippsMulC_32f_I(scale, reinterpret_cast<Ipp32f*>(data), m_FFTSize); }
void FFTFrame::doInverseFFT(float* data) { // Prepare interleaved data. float* interleavedData = getUpToDateComplexData(); // Compute inverse transform. av_rdft_calc(m_inverseContext, interleavedData); // Scale so that a forward then inverse FFT yields exactly the original data. // For some reason av_rdft_calc above returns values that are half of what I // expect. Hence make the scale factor // twice as large to compensate for that. const float scale = 2.0 / m_FFTSize; VectorMath::vsmul(interleavedData, 1, &scale, data, 1, m_FFTSize); }