Uso básico de Java fftpack
Pergunta
Escrevi alguns algoritmos simples de processamento de áudio no MATLAB que usarei em um aplicativo Android.Estou tendo problemas para traduzir a implementação da FFT para Java.
Estou tentando usar a versão Java do pacote fft, que é supostamente eficiente, mas também é um pouco enigmático para mim, talvez devido à minha falta de um domínio firme da FFT em geral.
Eu simplesmente tenho um array duplo a partir do qual desejo produzir um array correspondente de números complexos representando a FFT.O único cálculo que farei na FFT é o valor absoluto de seus elementos.
Para maior clareza, aqui está o código MATLAB essencial que eu gostaria de replicar usando Java fftpack:
X = fft(myDoubleArray);
abs(X[i]);
Espero que seja bastante simples, mas não consigo identificar pontos de entrada no fftpack.
RESOLVIDO:
A resposta abaixo de LutzL funciona, mas criar um objeto Complex1D é realmente desnecessário, pois o fftpack suporta um array duplo como entrada:
RealDoubleFFT rdfft = new RealDoubleFFT(myArray.length);
rdfft.ft(myArray);
Solução
Lendo de repositório sourceforge jfftpack
Você inicializa um novo objeto fft via
fft = new ComplexDoubleFFT(N);
Então você usa a transformação direta do objeto fft com
Complex1D X;
X.x=new double[N];
X.y=new double[N];
for(k=0;k<N;k++) X.x[k]=x[k];
fft.ft(X);
e pode então acessar os valores absolutos como
x=X.x[k]; y=X.y[k]; a=Math.sqrt(x*x+y*y);
Opcionalmente divida por N
para normalizar a FFT.
Adicione declarações de variáveis apropriadas.
As convenções usuais se aplicam, se o sinal for amostrado com frequência de amostragem fs, a entrada X.(xy)[k] representa o componente de frequência em k*fs/N para k=N/2 a N-1.
Você pode querer procurar uma implementação de FFT diferente e com melhor suporte, feita em java puro; não é tão complicado implementar a FFT para comprimentos diádicos.A única complicação surge ao implementar a transformação para obter o último fator de aceleração.