/********************************************************************************
|
* Clase FFTCalculator *
|
* *
|
* See information in FFTw_wrapper.h *
|
* *
|
* EQUITEL - C.V. February 2007 ALMDI *
|
********************************************************************************/
|
|
#include <math.h>
|
|
#include "FFTw_wrapper.h"
|
|
#include "Libreria FFtw\fftw3.h"
|
|
using namespace FFTw_wrapper;
|
|
//Constructor
|
FFTCalculator::FFTCalculator(int NumSamples, array<short>^ InputBuffer, array<double>^ OutputBuffer)
|
{
|
mNumSamples = NumSamples;
|
//internal unmanaged buffers
|
in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)* mNumSamples);
|
out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)* mNumSamples);
|
//work-plan creation (see doc at www.FFTw.org)
|
p = fftw_plan_dft_1d(mNumSamples, in, out, FFTW_FORWARD ,FFTW_MEASURE);
|
//Pointers for the external managed buffers
|
mBufin = InputBuffer;
|
mBufout = OutputBuffer;
|
}
|
|
// Destructor
|
FFTCalculator::~FFTCalculator()
|
{
|
fftw_destroy_plan(p);
|
fftw_free(out);
|
fftw_free(in);
|
}
|
|
|
//Calculation
|
void FFTCalculator::Calculate()
|
{ int i;
|
double re;
|
double im;
|
double *p1, *p2;
|
|
p1= (double *)in;
|
p2= (double *)out;
|
//Copy the data to the internal buffer
|
for (i=0; i<mNumSamples; i++){
|
//Real part
|
*p1 = mBufin[i];
|
*p1 = *p1 / 32768; //Normalization (the input data must be between -1 and 1)
|
p1++;
|
//Imaginary part
|
*p1 = 0;
|
p1++;
|
}
|
// Plan execution, i.e. FFt calculation
|
fftw_execute(p);
|
// Copy the output data to the external buffer (only modulus)
|
for (i=0; i<mNumSamples/2+1; i++){
|
re=*p2;
|
p2++;
|
im=*p2;
|
p2++;
|
mBufout[i] = sqrt((pow(re,2)+pow(im,2))) / mNumSamples;
|
}
|
}
|
|