25 de maio de 2016

Transformada Rapida de Fourier
FFT

Usando a biblioteca org.apache.commons.math3.transform.FastFourierTransformer vou mostrar aqui o uso e interpretação básica do FFT.

FastFourierTransformer fft = new FastFourierTransformer(DftNormalization.STANDARD);
int tamVet = 1024; //2^n

Complex[] dominioTempo = new Complex[tamVet];

dominioFrequencias = fft.transform(dominioTempo,
TransformType.FORWARD);

abaixo em verde temos as funcoes cosseno base que são geradas usando o vetor transformado usando a seguinte equacao:

for (int l = 0; l < limite; l++) {

double amplitude = Math.sqrt(dominioFrequencias[l].getReal() * dominioFrequencias[l].getReal()
+ dominioFrequencias[l].getImaginary() * dominioFrequencias[l].getImaginary());

double phase = (Math.atan2(dominioFrequencias[l].getImaginary(), dominioFrequencias[l].getReal()));

// gera seno
double[] seno = new double[tamVet];
for (int i = 0; i < dominioTempo.length; i++) {
seno[i] = ((1.0 * amplitude / tamVet) * Math.cos(l * (1.0 * i / tamVet) * 2.0 * Math.PI + phase));
senoAcumulado[i] = senoAcumulado[i] + seno[i];
}
}

o resumo do codigo acima é:
seno[i] = ((1.0 * amplitude / tamVet) * Math.cos(l * (1.0 * i / tamVet) * 2.0 * Math.PI + phase));