Java 递归FFT误差?

Java 递归FFT误差?,java,math,fft,polynomial-math,ifft,Java,Math,Fft,Polynomial Math,Ifft,下面是我的FFT java程序。对于输入{0,2,3,-1},its以复点表示返回错误输出 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]

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

 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*-3
    2.0+i*0.0
    -3.0+i*3

似乎fft()中有一个逻辑错误,我没有找到。有人能帮我找到它吗?

问题出在这两行:

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

在计算第二行中的新值之前,先用第一行中的新值替换
wx
,这是对
wx
值的重击。因此,复数乘法的结果是不正确的。此外,尽管这不会导致错误,但不需要初始化
y0
y1
,因为它们是通过对
fft
的递归调用设置的。还有其他未使用的变量。

问题在于这两行:

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

在计算第二行中的新值之前,先用第一行中的新值替换
wx
,这是对
wx
值的重击。因此,复数乘法的结果是不正确的。此外,尽管这不会导致错误,但不需要初始化
y0
y1
,因为它们是通过对
fft
的递归调用设置的。还有其他未使用的变量。

“请跟踪程序”。。。不,这就是调试器的作用。我的意思是,程序中没有语法错误,但我缺少fft逻辑,可能是我使用了一些错误的变量用法。这就是我希望有人能帮助我的…@BrianRoach除了追踪程序外,你还能如何帮助解决任何问题?他可能浏览了整个程序,找不到他在哪里犯了逻辑错误,就像这个网站上75%的问题一样。我不会帮他解决问题。根据定义,这是一个过于本地化的问题,因此不是一个有效的问题。事实上,你不断重复你对SO指导方针的反对意见与此毫无关系。@BrianRoach“我不会帮助他解决问题”如果你不想帮助人们解决问题和回答问题,为什么你会在问答网站上?至于“你不断重复你对SO指导方针的反对意见,这一事实真的没有关系。”我甚至不知道你想说什么。重复我的反对意见?我还反对什么?请不要那么自命不凡。是的,这个问题是本地化的,所以为什么不直接让他去CodeReview而不是一个蠢货呢?“请跟踪程序”。。。不,这就是调试器的作用。我的意思是,程序中没有语法错误,但我缺少fft逻辑,可能是我使用了一些错误的变量用法。这就是我希望有人能帮助我的…@BrianRoach除了追踪程序外,你还能如何帮助解决任何问题?他可能浏览了整个程序,找不到他在哪里犯了逻辑错误,就像这个网站上75%的问题一样。我不会帮他解决问题。根据定义,这是一个过于本地化的问题,因此不是一个有效的问题。事实上,你不断重复你对SO指导方针的反对意见与此毫无关系。@BrianRoach“我不会帮助他解决问题”如果你不想帮助人们解决问题和回答问题,为什么你会在问答网站上?至于“你不断重复你对SO指导方针的反对意见,这一事实真的没有关系。”我甚至不知道你想说什么。重复我的反对意见?我还反对什么?请不要那么自命不凡。是的,这个问题是局部性的,所以为什么不让他做代码审查而不是一个蠢货呢?