0

下面给出的是我的 FFT 的 java 程序。对于输入 {0,2,3,-1},它以复点表示形式返回错误输出。

 import java.io.*;
 public class test{
static double s[]={0,2,3,-1};
static double[][] re=new double[s.length][2];
static double[][] er=new double[s.length][2];
static double[][][] ma=new double[s.length][s.length][2];
public static void main(String args[])
{
    double[][] aray1=new double[s.length][2];
    for(int i=0;i<s.length;i++)
    {
        aray1[i][0]=s[i];
        aray1[i][1]=0;
    }
    re=fft(aray1,1);
    for(int i=0;i<re.length;i++)
    {
        System.out.println(""+re[i][0]+"+i*"+re[i][1]);
    }
            //Inverse FFT
    re=fft(re,-1);
    for(int i=0;i<re.length;i++)
    {
        //System.out.println("sdsfbv /n /n");
        System.out.println(""+(re[i][0]/s.length)+"+i*"+((re[i][1])/s.length));
    }


}
public static double[][] complexmult(double[][] a,double[][] b)
{
    double[][] e=new double[1][2];

    return e;
}
public static double[][] fft(double[][] a, int c)
{
    double[][] de=new double[1][2];
    int n=a.length;

    if(n==1)
    {
        return a;
    }
    double wnx=Math.cos(c*2*Math.PI/n);
    double wny=Math.sin(c*2*Math.PI/n);
    double wx=1;
    double wy=0;
    double[][] y=new double[n][2];
    double[] e=new double[n];
    double[][] a0=new double[n/2][2];
    double[][] a1=new double[n/2][2];
    double[][] y0=new double[n][2];
    double[][] y1=new double[n][2];
    for(int i=0,k=0,j=0;i<n;i=i+1)
    {
        if((i%2)==0)
        {

            a0[k][0]=a[i][0];
            a0[k][1]=a[i][1];
            k=k+1;
        }
        else
        {

            a1[j][0]=a[i][0];
            a1[j][1]=a[i][1];
            j=j+1;
        }
    }
    y0=fft(a0,c);
    y1=fft(a1,c);       
    for(int k=0;k<=((n/2)-1);k++)
    {
        double m1=((wx*y1[k][0])-(wy*y1[k][1]));
        double m2=((wx*y1[k][1])+(wy*y1[k][0]));
        y[k][0]= y0[k][0]+m1;
        y[k][1]=y0[k][1]+m2;
        y[k+(n/2)][0]=y0[k][0]-m1;
        y[k+(n/2)][1]=y0[k][1]-m2;
        wx=((wx*wnx)-(wy*wny));
        wy=((wx*wny)+(wy*wnx));
    }
    return y;       
}
}

输出如下:

    4.0+i*0.0
    -3.0+i*1.8369701987210297E-16
    2.0+i*0.0
    -3.0+i*-1.8369701987210297E-16

但是输出应该是:

    4.0+i*0.0
    -3.0+i*-3
    2.0+i*0.0
    -3.0+i*3

似乎我错过了 fft() 某处的逻辑错误。有人可以帮我找到它吗?

4

1 回答 1

3

问题在于这两行:

    wx=((wx*wnx)-(wy*wny));
    wy=((wx*wny)+(wy*wnx));

wx在使用第一行中的新值来计算wy第二行中的新值之前,您正在破坏值。所以,复数乘法的结果是不正确的。此外,虽然这不会导致错误,但无需初始化y0y1因为它们是由对fft. 还有其他未使用的变量。

于 2013-01-31T09:22:37.227 回答