我用MATLAB编写了一些简单的音频处理算法,用于Android应用程序。我在将FFT实现转换为Java时遇到了一些困难。
我正在尝试使用弗特帕普的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);发布于 2014-01-12 12:20:07
从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);可选地除以N来规范快速傅立叶变换。
添加适当的变量声明。
通常的惯例是,如果用采样频率fs采样信号,则条目X(Xy)k表示k*fs/N处的频率分量( k=N/2 to N-1 )。
您可能想要寻找一个不同的、支持得更好的FFT实现,它是用纯java实现的,实现二进制长度的FFT并不那么复杂。唯一复杂的是在实现转换以获得最后的加速因子时。
https://stackoverflow.com/questions/21064509
复制相似问题