FFT后如何获得幅度和相应的频率

时间:2016-07-18 11:08:56

标签: java fft

如何在对数据集执行FFT后获得幅度和相应的频率。我需要绘制数据集的幅度与频率。另外,为什么我们将FFT数组的大小增加到实际数据集大小的两倍?然后产生的输出数组的大小再次不同,请帮我理解这个FFT代码。此外,何时进行复杂的FFT和执行realForward FFT?两者的区别?我需要对数据集执行FFT并获得FFT后的幅度以及每个幅度的相应频率。

                int length = data.length;
                FloatFFT_1D fftDo = new FloatFFT_1D(length);
                float[] fft = new float[length * 2];
                System.arraycopy(data, 0, fft, 0, length);
                fftDo.complexForward(fft);
                //for(double d: fft) {
                    //System.out.println(d);
                //}
                float outputfft[] = new float[(fft.length+1)/2];
                if(fft.length%2==0){
                    for(int i = 0; i < length/2; i++){
                        outputfft[i]= (float) Math.sqrt((Math.pow(fft[2*i],2))+(Math.pow(fft[(2*(i))+1], 2)));
                    }
                }else{
                    for(int i = 0; i < (length/2)+1; i++){
                        outputfft[i]= (float) Math.sqrt((Math.pow(fft[2*i],2))+(Math.pow(fft[(2*i)+1], 2)));
                    }
                }
                for (float f : outputfft) {
                    System.out.println(f);
                }

1 个答案:

答案 0 :(得分:0)

实值数据向量的FFT根据定义是复杂且对称的。如果您有一个N个样本的向量长度,您将获得N个频率数据的FFT,其频率间隔为Fs / N,其中Fs是采样频率。您的输出向量是两倍大小,因为复杂数据是交错的[re,im,re,im ...]。 输出数据是对称的一半大小,你只需要查看对应于频率[0 .. Fs / 2]的前半部分,上半部分是[-Fs / 2 .. 0)

如果你有一个偶对称输入数据,X(-n)= X(n),或奇数对称,X(-n)= - X(n),你可以使用realForward函数