2014-01-11 3 views
3

Я написал несколько простых алгоритмов обработки звука в MATLAB, которые я буду использовать для приложения для Android. У меня возникли проблемы с переводом реализации FFT на Java.Основное использование Java fftpack

Я пытаюсь использовать версию Java fftpack, которая, как сообщается, эффективна, но также немного загадочна для меня, возможно, из-за того, что у меня нет четкого понимания БПФ в целом.

У меня просто есть двойной массив, из которого я хочу создать соответствующий массив комплексных чисел, представляющих БПФ. Единственный расчет, который я буду делать на БПФ, - это абсолютное значение его элементов.

Для большей наглядности, здесь важно MATLAB код, который я хотел бы повторить с помощью Java fftpack:

X = fft(myDoubleArray); 
abs(X[i]); 

Я ожидаю, что это довольно просто, но я не могу определить точки входа в fftpack.


РЕШИТЬ:

Ответ ниже от LutzL работает, но создание объекта Complex1D на самом деле нет необходимости, поскольку fftpack поддерживает двойной массив в качестве входных данных:

RealDoubleFFT rdfft = new RealDoubleFFT(myArray.length); 
rdfft.ft(myArray); 

ответ

1

Чтение из sourceforge jfftpack repository

Вы инициализируете новый fft-объект через

fft = new ComplexDoubleFFT(N); 

Затем вы используете прямое преобразование объекта FFT с

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); 

, а затем получить доступ к абсолютным значениям, как

x=X.x[k]; y=X.y[k]; a=Math.sqrt(x*x+y*y); 

Факультативно разделить на N нормализовать FFT.

Добавить соответствующие объявления переменных.


Обычные соглашения применяются, если сигнал выборки с частотой дискретизации фс, вход X. (х) [к] представляет частотный компонент при к * фс/N при к = N/2 до N -1.


Вы можете искать другие, более поддерживаемом реализации FFT, что делается в чистом Java, это не так уж сложно реализовать FFT для двоично длины. Единственное осложнение возникает при внедрении трансформации, чтобы получить последний коэффициент ускорения.

+0

Спасибо. Это работает, за исключением того, что fft.ft возвращает void и автоматически изменяет X. Я с радостью приму ваш ответ, как только это отразится. – Jayz7522

+0

Да, сделано. При написании ответа я изменил все остальное для подготовки вызова, кроме фактического вызова. – LutzL

Смежные вопросы