Java FFTPACK的基本使用
题
我在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);
. 解决方案
通过
初始化新的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并不复杂。实施转换时唯一的并发症是为了获得最后的加速因子。
不隶属于 StackOverflow