Java FFT后如何得到幅值和相应的频率

Java FFT后如何得到幅值和相应的频率,java,fft,Java,Fft,在数据集上执行FFT后,如何获得震级和相应的频率。我需要绘制一个数据集的震级与频率。另外,为什么我们要将FFT数组的大小增加到实际数据集大小的两倍?那么结果输出数组的大小又不同了,请帮助我理解这个FFT代码。此外,什么时候是复杂向前FFT,什么时候执行realForward FFT?两者有什么区别?我需要在一个数据集上执行FFT,并在FFT之后获得幅值和每个幅值对应的频率 int length = data.length; Floa

在数据集上执行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);
                }
int length=data.length;
FloatFFT_1D fftDo=新的FloatFFT_1D(长度);
float[]fft=新的float[长度*2];
数组复制(数据,0,fft,0,长度);
fftDo.complexForward(fft);
//用于(双d:fft){
//系统输出打印ln(d);
//}
浮点输出fft[]=新浮点[(fft.长度+1)/2];
如果(fft.长度%2==0){
对于(int i=0;i根据定义,实值数据向量的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函数

根据定义,实值数据向量的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函数

请添加stacktracelength/2+1!=length+1/2…
float outputfft[]=new float[(data.length+1)/2];
vs
for(int i=0;i
谢谢你的回复。但我真的不明白为什么数组大小不同。我修改了我的问题,试图更清楚地说明我真正想要的是什么。我对Java和FFT都是新手。如果可以,请帮助我理解代码。我只是尝试从各种来源复制它,并尝试在我的数据集上实现它。Bu即使在做了您建议的更改之后,也无法使其工作。不确定如何添加stacktrace..您的意思是只在每个步骤打印输出吗?好的,后退一步…stacktrace是发生异常时得到的输出。所有这些“BlahBlahexException at…at…at…”大多数情况下,它会将您带到实际bug隐藏的位置。数组大小可能会有所不同,因为您有两种计算方法:a)length/2+1和(length+1)/2。它们可能会以不同的方式舍入。为了避免此错误,您可以简单地使用for条件中使用的数组:
for(int i=0;i请添加stacktracelength/2+1!=长度+1/2…
float outputfft[]=新的浮点[(data.length+1)/2];
vs
for(int i=0;i
谢谢你的回复。但我真的不明白为什么数组大小不同。我修改了我的问题,试图更清楚地说明我真正想要的是什么。我对Java和FFT都是新手。如果可以,请帮助我理解代码。我只是尝试从各种来源复制它,并尝试在我的数据集上实现它。Bu即使在做了您建议的更改之后,也无法使其工作。不确定如何添加stacktrace..您的意思是只在每个步骤打印输出吗?好的,后退一步…stacktrace是发生异常时得到的输出。所有这些“BlahBlahexException at…at…at…”大多数情况下,它会将您带到实际bug隐藏的位置。数组大小可能会有所不同,因为您有两种计算方法:a)length/2+1和(length+1)/2。它们可能会以不同的方式舍入。为了避免此错误,您可以简单地使用for条件中使用的数组:
for(int i=0;我想解释一下。所以,在我问题中提到的代码中,我的数据长度为N,输出向量为fft[]的长度为(2N),那么输出数据为fft[]的长度为(N+1)…实际上不是数据大小的一半?另外,如果您能告诉我如何从fft的输出中检索频率?以及realForward fft和complexForward fft之间的差异?在您的代码中,outputfft的长度为(N+1)/2我想它是为奇数长度的输入数据保留空间。频率向量从0开始,以Fs/N[0 Fs/N 2Fs/N 3Fs/N…]隔开。实际上,你的输出向量应该和你的输入向量大小相同。只是它是复数。所以你有两种可能:1.使输入也“复杂”通过添加一个0或2的虚部。使输出两倍大,以说明实部和Img部分的交错。零可以是