我在MATLAB中写了一些简单的音频处理算法,我将使用Android应用程序。我有点麻烦将FFT实现翻译成Java。

我正在尝试使用 fftpack ,这是高效的,但是对我来说也有点神秘,也许是因为我缺乏对FFT的坚定掌握。

我只有一个双数组,我希望生成代表FFT的相应的复杂数字阵列。我将在FFT上进行的唯一计算是取代其元素的绝对值。

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

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

我希望这相当简单,但我无法识别进入fftpack的条目点。


解决:

下面的答案来自lutzl工作,但创建复杂的一个对象实际上是不必要的,因为fftpack支持一个双数组作为输入:

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

有帮助吗?

解决方案

读取从 sourceforge JFFTPACK存储库

通过

初始化新的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);
.

可选地除以世代odicetagcode以归一化FFT。

添加适当的变量声明。


通常的约定适用,如果使用采样频率fs采样信号,条目X.(xy)[k]表示k * fs / n的频率分量,用于k= n / 2至n-1。< / p>


您可能希望查看在纯Java中完成的不同,更好的支持FFT实现,实现Dyadic Lengths的FFT并不复杂。实施转换时唯一的并发症是为了获得最后的加速因子。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top