FFTの結果があります。これらは2つに保存されますdouble
、実部配列と虚部配列の配列にます。これらの配列の各要素に対応する周波数をどのように決定しますか?
言い換えると、FFTの各実数成分と虚数成分の周波数を格納する配列を作成したいと思います。
FFTの結果があります。これらは2つに保存されますdouble
、実部配列と虚部配列の配列にます。これらの配列の各要素に対応する周波数をどのように決定しますか?
言い換えると、FFTの各実数成分と虚数成分の周波数を格納する配列を作成したいと思います。
回答:
FFTの最初のビンはDC(0 Hz)、2番目のビンはですFs / N
。ここFs
で、はサンプルレートで、N
はFFTのサイズです。次のビンは2 * Fs / N
です。これを一般的に表すと、n番目のビンはn * Fs / N
です。
したがって、サンプルレートFs
が44.1 kHzで、FFTサイズN
が1024の場合、FFT出力ビンは次のようになります。
0: 0 * 44100 / 1024 = 0.0 Hz
1: 1 * 44100 / 1024 = 43.1 Hz
2: 2 * 44100 / 1024 = 86.1 Hz
3: 3 * 44100 / 1024 = 129.2 Hz
4: ...
5: ...
...
511: 511 * 44100 / 1024 = 22006.9 Hz
実際の入力信号(虚数部がすべてゼロ)の場合、FFTの後半(ビンからN / 2 + 1
までN - 1
)には有用な追加情報が含まれていないことに注意してください(最初のN / 2 - 1
ビンとの複素共役対称性があります)。最後の有用なビン(実用的なアプリケーション)はN / 2 - 1
にあり、上記の例の22006.9 Hzに対応します。ビンはN / 2
、ナイキスト周波数Fs / 2
(この例では= 22050 Hz)のエネルギーを表しますが、アンチエイリアスフィルターは通常、とそれ以上の信号を減衰させるため、これは一般に実用的ではありませんFs / 2
。
コメントへの回答:
FFTは実際には、等間隔の周波数の範囲で、入力信号と正弦関数および余弦関数(基底関数)との相互相関を計算します。与えられたFFT出力に対して、私が投稿した回答で示されているように、対応する周波数(F)があります。出力サンプルの実数部は入力信号との相互相関でcos(2*pi*F*t)
あり、虚数部は入力信号との相互相関ですsin(2*pi*F*t)
。入力信号sin
とcos
関数が相関している理由は、入力信号と基底関数の間の位相差を説明するためです。
複素FFT出力の大きさを取得することにより、入力信号の位相に関係なく、入力信号が一連の周波数で正弦波とどの程度相関しているかを測定できます。信号の周波数成分を分析するだけの場合、ほとんどの場合、FFTの複素出力の絶対値または絶対値の2乗を取得します。
私は以下を使用しました:
public static double Index2Freq(int i, double samples, int nFFT) {
return (double) i * (samples / nFFT / 2.);
}
public static int Freq2Index(double freq, double samples, int nFFT) {
return (int) (freq / (samples / nFFT / 2.0));
}
入力は次のとおりです。
i
:アクセスするビンsamples
:ヘルツ単位のサンプリングレート(つまり、8000 Hz、44100Hzなど)nFFT
:FFTベクトルのサイズsamples
かnFFT
。ですから、より説明的にしてください。
i * samples / nFFT
。なぜ2
そこに余分があるのですか?何か不足していますか?
FFT出力係数(サイズNの複素数入力の場合)は、0〜N-1で、[LOW、MID、HI、HI、MID、LOW]周波数としてグループ化されます。
実データの場合、FFT [Nk] = FFT [k]の複素共役であるため、kの要素はNkの要素と同じ周波数であると考えます。
LOWからHIGHの頻度でスキャンする順序は次のとおりです。
0,
1,
N-1,
2,
N-2
...
[N/2] - 1,
N - ([N/2] - 1) = [N/2]+1,
[N/2]
インデックスi = 0から[N / 2]までの[N / 2] +1グループの周波数があり、それぞれが frequency = i * SamplingFrequency / N
したがって、ビンFFT [k]での周波数は次のとおりです。
if k <= [N/2] then k * SamplingFrequency / N
if k >= [N/2] then (N-k) * SamplingFrequency / N