Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java apachefft中复系数的使用_Java_Apache_Math_Fft_Jfreechart - Fatal编程技术网

Java apachefft中复系数的使用

Java apachefft中复系数的使用,java,apache,math,fft,jfreechart,Java,Apache,Math,Fft,Jfreechart,我正在使用ApacheCommons库处理FFT的一个基本示例。我有两门课: public class Fourier { private static XYSeries data; private static XYSeriesCollection collection; Fourier(){ collection =new XYSeriesCollection(); createSquare(); createF

我正在使用ApacheCommons库处理FFT的一个基本示例。我有两门课:

   public class Fourier {
    private static XYSeries data;
    private static XYSeriesCollection collection;

    Fourier(){
        collection =new XYSeriesCollection();
        createSquare();
        createFourier();
        showGraph();
    }

    private static void createSquare(){
        data=new XYSeries("Dati");
        for(double i=-8;i<8;i+=1d/128){
            data.add(i,((i<-4||(i<4&&i>0)?1:0)));
            //data.add(i,(i<0?i+1:-i+1));
        }
        collection.addSeries(data);
    }

    private static void createFourier(){
        double[] arrayFourier= new double[data.getItemCount()];
        for(int i=0;i<data.getItemCount();i++){
            arrayFourier[i]=data.getDataItem(i).getYValue();
        }
        FastFourierTransformer transformer=new FastFourierTransformer(DftNormalization.STANDARD);
        Complex[] coeff=transformer.transform(arrayFourier, TransformType.INVERSE);
        double norm = 0;
        for(Complex Z: coeff){
            System.out.println(Z.abs()+"\t"+Z.toString());
            norm+=(Z.abs())*(Z.abs());
        }
        System.out.println(norm);

        XYSeries fourier=new XYSeries("Fourier");
        FourierSeries series=new FourierSeries(coeff,8);
        for(double i=data.getMinX();i<data.getMaxX();i+=0.05){
            fourier.add(i,series.getSeries(i));
        }
        collection.addSeries(fourier);

    }

    private static void showGraph(){
        JFreeChart chart = ChartFactory.createXYLineChart("Fourier", "x", "f(x)", collection, PlotOrientation.VERTICAL, true, false, false);
        ChartFrame window=new ChartFrame("Fourier", chart, false);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.pack();
        window.setVisible(true);
    }

    public static void main(String[] args) {
        Thread t=new Thread(new Runnable() {

            @Override
            public void run() {
                new Fourier();
                try {
                    Thread.sleep(60000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                System.exit(0);
            }
        });
        t.start();
    }

}
公共类{
私有静态数据;
私有静态XYSeriesCollection集合;
Fourier(){
集合=新的XYSeriesCollection();
createSquare();
createFourier();
showGraph();
}
私有静态void createSquare(){
数据=新的XY系列(“Dati”);

对于(double i=-8;i在将傅里叶级数的复形式转换为实形式时,必须以不同的方式对待常数项。或者,对于所讨论的代码,必须将非常数系数校正2倍。因此,得到的结果是
0.5+-0.5
,而不是像当前ca那样
0.5+-0.25

您使用的是逆变换,由此产生的系数可以解释为

f(x) approx sum(m = -N/2+1, N/2-1) c[k]*exp(-i*m*k*x)
对于索引
m>=1
组合两个复共轭项对,使用
c[k]=a+ib
,得到的实数项为

(a+i*b)*exp(-i*m*k*x) + (a-i*b)*exp(+i*m*k*x) 

= 2*a*cos(m*k*x) + 2*b*sin(m*k*x)
因此,您的傅里叶级数计算应该如下所示

    value = coeff[0].getReal();
    for (int m=1; m<coeff.length/2; m++) {
        value += 2*coeff[m].getReal()*Math.cos(x*k*m) 
               + 2*coeff[m].getImaginary()*Math.sin(x*k*m);
    }
value=coeff[0].getReal();

对于(int m=1;m在将傅里叶级数的复数形式转换为实数形式时,必须以不同的方式对待常数项。或者,对于所讨论的代码,必须将非常数系数校正2倍。因此,得到的结果是
0.5+-0.5
,而不是当前的
0.5+-0.25

您使用的是逆变换,由此产生的系数可以解释为

f(x) approx sum(m = -N/2+1, N/2-1) c[k]*exp(-i*m*k*x)
对于索引
m>=1
组合两个复共轭项对,使用
c[k]=a+ib
,得到的实数项为

(a+i*b)*exp(-i*m*k*x) + (a-i*b)*exp(+i*m*k*x) 

= 2*a*cos(m*k*x) + 2*b*sin(m*k*x)
因此,您的傅里叶级数计算应该如下所示

    value = coeff[0].getReal();
    for (int m=1; m<coeff.length/2; m++) {
        value += 2*coeff[m].getReal()*Math.cos(x*k*m) 
               + 2*coeff[m].getImaginary()*Math.sin(x*k*m);
    }
value=coeff[0].getReal();

对于(int m=1;请编辑您的问题,使其包含显示您描述的问题的a。可能此相关QA将有所帮助:我打赌您忘记将结果与标准化常数相乘,但太懒了,无法分析代码…请编辑您的问题,使其包含显示您描述的问题的a。可能此相关QA将有所帮助:我敢打赌,你忘了用归一化常数乘以结果,但懒得分析你的代码……这对我来说很有效,但总的来说是负数!将符号倒过来放在正弦波之前。当你使用逆变换时,指数因子必须两者都是负数。--在答案中更改了它。这对我来说很有效,但是总的来说,h值为负数!将窦房结前的符号反转。当你使用逆变换时,指数因子必须两者都为负数。--在答案中改变了它。