2016-07-18 12 views
1

データセットでFFTを実行した後、どのように振幅と対応する周波数を得ることができますか?データセットの振幅と周波数をプロットする必要があります。また、FFT配列のサイズを実際のデータセットの2倍にするのはなぜですか?結果の出力配列のサイズが再び異なっている、私はこのFFTコードを理解するのを助けてください。さらに、複雑なFFTが実行されるときと、realForward FFTが実行されるときは、どちらですか?両者の違いは?私は、データセットに対して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); 
       } 
+2

stacktraceを追加してください – Fildor

+1

長さ/ 2 +1!=長さ+1/2 ... 'float outputfft [] =新しいfloat [(data.length + 1)/ 2];' vs 'for(int i = 0; i Fildor

+0

返事をありがとう。しかし、私は実際に配列のサイズが異なる理由を理解していません。私は自分の質問を変更して、私が実際に望んでいることをより明確にするようにしました。私はJavaとFFTには新しいです。できるだけコードを理解するのを助けてください..私はちょうどさまざまなソースからコピーしようとし、私のデータセットでそれを実装しようとしました。しかし、あなたが提案した変更を行った後でさえ、それを動作させることができませんでした。 stacktrace..doを追加する方法がわからない場合は、すべてのステップで出力を印刷するだけですか? – Aqua

答えて

0

実数値データベクトルのFFTは、定義上、複雑で対称です。ベクトルの長さがNサンプルの場合、Fs/Nで周波数が分けられたN個の周波数データのFFTが得られます。ここで、Fsはサンプリング周波数です。複素数データが​​インターリーブされてから出力ベクトルは2倍のサイズになります[re、im、re、im ...]。 出力データは対称で、周波数[0 .. Fs/2]に対応する最初の半分だけを表示する必要があります。上半分は[-Fs/2 .. 0]

If X(n)= X(n)、または奇数対称X(n)= X(n)の場合、realForward関数を使用することができます。

+0

ありがとうございます。したがって、私の質問に記載されたコードでは、私のデータの長さはNであり、出力ベクトルはfft []は長さ(2N)であり、出力される出力データは長さ(N + 1)です。データのサイズの半分ではありませんか?また、fftの出力から周波数を取得する方法と、realForward fftとcomplexForward fftの違いを教えていただけますか? – Aqua

+0

あなたのコードでは、出力の長さは長さ(N + 1)/ 2で、奇数長の入力データのためのスペースを確保すると仮定します。周波数ベクトルは0から始まり、Fs/N [0Fs/N 2Fs/N 3Fs/N ...]で囲まれます。 –

+0

@Aqua実際には、出力ベクトルは入力ベクトルと同じサイズにする必要があります。ちょうどそれは複素数です。したがって、次の2つの可能性があります。1. 0または2の虚数部分を追加して入力を「複雑」にします。RealおよびImgの部分をインターリーブするために出力を2倍にします。 – Fildor

関連する問題