view Source/FFTW.h @ 0:25bf17994ef1

First commit. VS2013, Codeblocks and Mac OSX configuration
author Geogaddi\David <d.m.ronan@qmul.ac.uk>
date Thu, 09 Jul 2015 01:12:16 +0100
parents
children e86e9c111b29
line wrap: on
line source
//----------------------------------------------------------------------------------------------------------------------
/**
 \author André Bergner
 \date   Feb/2013
 
 \class FFTW
 
 Encapsulates the FFT of lib-fftw
 
 (c) Copyright NATIVE INSTRUMENTS, Berlin, Germany
 ALL RIGHTS RESERVED
 */
//----------------------------------------------------------------------------------------------------------------------

#pragma once

#include "fftw3.h"
#include <vector>
#include <windows.h>
#include <string>
//#include <itl/dsp/SimdTools.h>



class FFTW
{

public:
   fftwf_plan  m_plan;
  unsigned m_iFFTSize;

  FFTW(); 
  FFTW( unsigned fftLength )
  {
	m_iFFTSize = fftLength;

    float* tempInput = new float[fftLength];
	memset(tempInput,0, fftLength * sizeof(float));
    float* tempReal  = new float[fftLength];
	memset(tempReal,0, fftLength * sizeof(float));
    float* tempImag  = new float[fftLength];
	memset(tempImag,0, fftLength * sizeof(float));
    fftwf_iodim  dim;
    dim.n =  fftLength;
    dim.is = 1;
    dim.os = 1;
    m_plan = fftwf_plan_guru_split_dft_r2c( 1, &dim, 0, NULL, tempInput, tempReal, tempImag, FFTW_ESTIMATE );
	delete[] tempInput;
	tempInput = nullptr;
	delete[] tempReal;
	tempReal = nullptr;
	delete[] tempImag;
	tempImag = nullptr;
  }


 ~FFTW()
  {
	  if(m_plan != NULL)
	  {
			fftwf_destroy_plan( m_plan );
	  }
  }


  void process( const float* input , float* realPart , float* imagPart )
  {
	float* nonConstInput =  const_cast<float*>(input);   // fftw does not take const input even though the data not be manipulated!

	fftwf_execute_split_dft_r2c( m_plan, nonConstInput, realPart, imagPart);

	//Multiply results by 2 to match the iOS output
	for(size_t i = 0; i < m_iFFTSize; i++)
	{		
		realPart[i] *= 2.f;
		imagPart[i] *= 2.f;
	}
  }

};