Java 递归FFT误差?
下面是我的FFT java程序。对于输入{0,2,3,-1},its以复点表示返回错误输出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]
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指导方针的反对意见,这一事实真的没有关系。”我甚至不知道你想说什么。重复我的反对意见?我还反对什么?请不要那么自命不凡。是的,这个问题是局部性的,所以为什么不让他做代码审查而不是一个蠢货呢?