3

Wave ファイル: 44100 Hz、16 ビット、デュアル チャンネル。

FFT を使用して、出力の各周波数ビンでマグニチュードを計算します。しかし、それをスケーリングして(リアルタイムの)スペクトルを描画する方法がわかりません。

誰でも私を助けることができますか?

4

2 に答える 2

4

良い; これを行うにはいくつかの方法があります...

たとえば、dB スケールが必要な場合は、虚数サンプルごとに計算します。

ymag = (x.real^2 + x.imag^2)

正の周波数が必要なため、アレイの半分だけを通過する必要があります。後半は、実際のデータが FFT に供給された前半の繰り返しになります。

結果の値から最小値と最大値を検索し、それらを保存します。最小値がゼロの場合は、代わりに非常に小さい値を選択して最小値にします。(0.000001か何か)。次に、最小 dB 値を mindB = 10 * log10(最小) に設定します。

ここで、返される最初の値 (sample[0]) が DC オフセットになり、おそらくゼロに設定する必要があります。

次に、各サンプルについて、次のように計算します: ydB = 10 * log10(ymag / 最大)。

これにより、各サンプル ビンの最大値からの dB ダウンを表す配列が得られます。これを必要に応じてスケーリングできます。プロット エリアが y=5 から y=200 になる場合、次のようなものを使用できます。

yscaled = ((ydB / -mindB) * (200 - 5) + 200)

また、FP 丸め誤差が発生した場合に備えて、スケーリングされた値が境界内に収まるようにします。

yscaled = min(max(yscaled, 5),200)

これを行ってからしばらく経ちましたので、数学的なエラーがあればお詫び申し上げます。:)

于 2011-07-12T16:13:43.530 に答える
1

異なる FFT 実装には異なるスケール係数があり、おそらく N、1/N、または 1/sqrt(N) (N は FFT の長さ) だけ異なります。少なくとも 1 種類の符号付き整数入力 FFT の場合、最大スケールはおよそ sqrt(2) * N * 2^(b - 1) です。ここで、b は小数点の左側のビット数です (この場合は 16、 FFT の前にチャネルをより大きなデータ型に合計すると、おそらく 17 になります)。

于 2011-07-13T00:19:31.847 に答える