2014-01-11 14 views
3

我已經在MATLAB中編寫了一些簡單的音頻處理算法,我將用於Android應用程序。我在將FFT實現轉換爲Java時遇到了一些麻煩。Java fftpack的基本使用

我正在嘗試使用Java版本的fftpack,據報道它效率很高,但對我來說也有點神祕,也許是因爲我一般都不太瞭解FFT。

我只是有一個雙數組,我想從中產生一個表示FFT的複數的相應數組。我將在FFT上做的唯一計算是取其元素的絕對值。

爲了清楚起見,這裏是必不可少的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對象

然後使用向前

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

變換FFT對象,然後可以通過N訪問絕對值爲

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

可選鴻溝正常化FFT。

添加適當的變量聲明。


通常的約定適用,如果信號與採樣頻率fs,條目X.(XY)採樣[k]表示的頻率分量在K * FS/N,其中k = N/2到N -1。


您可能需要尋找一個純Java實現不同的,更好的支持FFT實現,它並不複雜,以實現對二元長度的FFT。當實現轉換以獲得最後一個加速因子時,唯一的麻煩就來了。

+0

謝謝。這個工作除了fft.ft返回void,並自動改變X.我會很樂意接受你的答案,一旦反映。 – Jayz7522

+0

是的,完成了。在寫回答時,除了實際的通話之外,我改變了其他一切準備通話。 – LutzL