我正在尝试用Java实现FFT算法。我查看了一个c ++代码并翻译了所有内容,但是我没有得到预期的结果。
这是描述FFT的代码:
static void fft(Complex[] x)
{
int N = x.length;
if (N <= 1) return;
// divide
Complex[] even;
Complex[] odd;
odd = new Complex[(int) N/2];
even = new Complex[N - odd.length];
int a = 0;
int b = 0;
for(int i = 0; i < N; i++) {
if(i%2 == 0) {
even[a] = x[i];
a++;
} else {
odd[b] = x[i];
b++;
}
}
// conquer
fft(even);
fft(odd);
// combine
for (int k = 0; k < N/2; ++k) {
double newAngl = -2 * (Math.PI) * k / N;
Complex t = ((Complex) ComplexUtils.polar2Complex(1.0, newAngl)).multiply(odd[k]);
x[k] = even[k].add(t);
x[k+N/2] = even[k].subtract(t);
}
}
如果我使用:
生成复杂数组Complex[] test = new Complex[700];
for(int i = 0; i < test.length; i++) {
test[i] = new Complex(3 * Math.cos(5 * Math.PI * i), 0);
}
然后做fft(测试),然后在(i)索引上绘制test [i] .abs(),得到这个图(我绘制了一半的数据值,因为它们在N / 2中镜像)
我真的不明白这一点。我使用周期为5 * pi的简单余弦函数。我不应该在图表中获得 1 峰值而不是许多不同的峰值,因为它只是没有噪音的干净数据。在MatLab中做同样的事情我得到这个图:
代码是:
i= [0:700];
X = 3*sin(5*pi*i);
fftmat = fft(X)
pfftmat = abs(fftmat);
plot(pfftmat);
这里我们得到了许多峰值(我知道我已经绘制了所有数据条目,但是当你从0到350看时,有很多峰值)。谁能告诉我我错了什么?或者不是fft使用“完美”数据?