ghy
Alejandro Acuña
2025-03-12 26319e4c5bfbee722c15b8e7ccca9b6127bb1cb8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/********************************************************************************
 * 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;
   }
}