0

私は、ピーク周波数をもたらすDFT(またはFFT)の簡単な実装を見つけようとしてきました。しかし、私が見たほとんどの実装は、複素数の配列を出力します。これらの基数2の結果を具体的な周波数に変換するにはどうすればよいですか?

たとえば、私が持っている入力データは、次のように500〜2000Hzの間で振動する正弦波関数の16サンプルです。

int n = 16;    
double[] input = { 1250, 1537, 1780, 1943, 2000, 1943, 1780, 1537,
            1250, 963, 720, 557, 500, 557, 720, 963 };

ここで、(2000-500)/ 2 = 750であるため、これからのピーク周波数は正確に750Hzになると想定します。

Fs = 2000 Hz正弦波を制限している振動の上限であるため、サンプリングレートを考えています。各ビンkの中心周波数は、として定義されk * Fs / nます。したがって、私のビンは125 Hz、250 Hz、375 Hz、500 Hz、625 Hz、および750Hzです。しかし、振動の下限は500 Hzだったので、ビンを500 Hzでオフセットする必要があると想定しているため、次のようになります750 Hz, 825 Hz, 1000 Hz, 1125 Hz, 1250 Hz, 1375 Hz, 1500 Hz

次に、jtransformsのDoubleFFT_1Dクラスを使用して、いくつかのFFTデータを取得します。

DoubleFFT_1D fft = new DoubleFFT_1D(n);
fft.realForward(input);

入力変数に含まれるもの:

[20000.0, 0.0, -4.547473508864641E-13, -5999.381020591891, 0.0, 0.0, -1.6292522886374172E-14, 1.1183950775908065, 0.0, -0.0, 1.6292522886374172E-14, -0.7488526914476931, 0.0, 0.0, 4.547473508864641E-13, -1.2482683609296146]

配列値をより理解しやすい形式にグループ化する(SOの他の場所で取得したいくつかの情報に照らして):

20000.0                                         [sum of input array values]
0.0,                                            [1625 Hz]
-4.547473508864641E-13, -5999.381020591891,     [re1 and im1] [750 Hz]
0.0, 0.0,                                       [re2 and im2] [875 Hz]
-1.6292522886374172E-14, 1.1183950775908065,    [re3 and im3] [1000 Hz]
0.0, -0.0,                                      [re4 and im4] [1125 Hz]
1.6292522886374172E-14, -0.7488526914476931,    [re5 and im5] [1250 Hz]
0.0, 0.0,                                       [re6 and im6] [1375 Hz]
4.547473508864641E-13, -1.2482683609296146      [re7 and im7] [1500 Hz]

2つの質問:

  1. 周波数ビンに関する私の仮定は正しいですか?
  2. いくつかの大きさを合計して、このデータからピーク周波数を取得するにはどうすればよいですか?

ありがとう。

4

3 に答える 3

1

定義上、FFT の出力値は周波数ではありません。変数(つまり、グラフの軸) は頻度です。あなたがしたいことは、複素数の結果の大きさを見つけて絶対値を取得することですが、これらは周波数ではありません。代わりに、最大のピークを生成するx値が必要な周波数です。

ご不明な点がある場合は、 Wikipediaに複素数の大きさが記載されています。これは単純に、実数部と複素数部の平方和の平方根ですが、最大値を見つけるために平方根を計算する必要がないことは明らかです。

于 2013-03-12T09:22:47.193 に答える
1

ビンの周波数を把握すると、振幅が最大のビンの周波数がピークに近くなるのは事実です。しかし、補間することでかなり改善できます。ほとんどの場合、ピークはビンの間にあります。このサイトには、補間するためのいくつかの良い方法があるようです: http://www.dspguru.com/dsp/howtos/how-to-interpolate-fft-peak

于 2013-03-15T03:33:17.570 に答える
0

周波数ビンごとに、実数(x)と虚数(y)の2つの値が必要です。二乗和は、その周波数での大きさを示します。

magnitude = sqrt(x*x + y*y);

ピークのみを見つけたい場合は、平方根は必要ありませんが、最も高い周波数を見つけるだけです。

magSquared = x*x + y*y
于 2013-03-12T09:20:39.763 に答える