Java fftpack的基本用法

时间:2014-01-11 16:04:44

标签: java android matlab fft fftpack

我在MATLAB中编写了一些简单的音频处理算法,我将用于Android应用程序。我在将FFT实现转换为Java时遇到了一些麻烦。

我正在尝试使用fftpack的Java版本,据说效率很高,但对我来说也有点神秘,也许是因为我对FFT缺乏一贯的把握。

我只是有一个双数组,我想从中生成一个代表FFT的相应复数数组。我将在FFT上进行的唯一计算是获取其元素的绝对值。

为了清楚起见,这里是我想用Java fftpack复制的基本MATLAB代码:

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

我希望这很简单,但我无法识别fftpack的入口点。


解决:

以下LutzL的答案有效,但创建一个Complex1D对象实际上是不必要的,因为fftpack支持双数组作为输入:

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

1 个答案:

答案 0 :(得分: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。

添加适当的变量声明。


通常的惯例适用,如果以采样频率fs采样信号,则条目X.(xy)[k]表示k = f / N的频率分量,k = N / 2到N-1。 / p>


您可能希望寻找在纯java中完成的不同的,更好支持的FFT实现,为二元长度实现FFT并不复杂。唯一的复杂因素是在实施转换以获得最后的加速因子时。