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

問題は次の 2 行にあります。

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

wx2 行目での新しい値を計算するために使用する前に、最初の行で の値を新しい値に置き換えることで、の値を壊していますwy。したがって、複素乗算の結果は正しくありません。また、これはエラーの原因ではありませんが、 と の再帰呼び出しによって設定されるため、を初期y0化する必要はありません。他にも未使用の変数があります。y1fft

于 2013-01-31T09:22:37.227 に答える