FFT带有Java意外结果

时间:2015-10-21 07:34:22

标签: java

我正在尝试用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中镜像)

enter image description here

我真的不明白这一点。我使用周期为5 * pi的简单余弦函数。我不应该在图表中获得 1 峰值而不是许多不同的峰值,因为它只是没有噪音的干净数据。在MatLab中做同样的事情我得到这个图:

enter image description here

代码是:

i= [0:700];
X = 3*sin(5*pi*i);
fftmat = fft(X)
pfftmat = abs(fftmat);
plot(pfftmat);

这里我们得到了许多峰值(我知道我已经绘制了所有数据条目,但是当你从0到350看时,有很多峰值)。谁能告诉我我错了什么?或者不是fft使用“完美”数据?

0 个答案:

没有答案