私は、ピーク周波数をもたらす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つの質問:
- 周波数ビンに関する私の仮定は正しいですか?
- いくつかの大きさを合計して、このデータからピーク周波数を取得するにはどうすればよいですか?
ありがとう。