Exemple #1
0
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);
}
Exemple #3
0
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);
}