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);
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top