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);
FastFourierTransformer fft = new FastFourierTransformer(DftNormalization.STANDARD);
int tamVet = 1024; //2^n
Complex[] dominioTempo = new Complex[tamVet];
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));