オーディオ ファイルがあり、ファイルを反復処理し、各ステップで 512 個のサンプルを取得してから、それらを FFT に渡します。
ブロック 514 フロート ロング (IPP の ippsFFTFwd_RToCCS_32f_I を使用) としてデータを出力し、実数成分と虚数成分をインターリーブします。
私の問題は、これらの複素数を取得したらどうするかということです。現時点では、各値に対して行っています
const float realValue = buffer[(y * 2) + 0];
const float imagValue = buffer[(y * 2) + 1];
const float value = sqrt( (realValue * realValue) + (imagValue * imagValue) );
これにより、少し使用可能なものが得られますが、値を 0 から 1 の範囲で取得する何らかの方法が必要です。上記の問題は、ピークが約 9 またはそれ以上に戻ってしまうことです。これは、オーディションのスペクトログラムでオーディオを実行すると、非常に強いように見えるという事実にもかかわらず、物事がひどく飽和し、スペクトログラムの他の部分がほとんど表示されないことを意味します. FFT によって返されるデータが何であるか 100% 確信が持てないことは十分に認めます (それ以外は、渡された 512 サンプルの長さのブロックの周波数値を表します)。特に、複素数が正確に何を表しているのかについて、私の理解が欠けています。
アドバイスや助けをいただければ幸いです。
編集:明確にするために。私の大きな問題は、返される FFT 値が、スケールが何であるかがわからないと意味がないことです。誰かがそのスケールを解決するように私に指摘できますか?
Edit2:次のようにすることで、非常に見栄えの良い結果が得られます。
size_t count2 = 0;
size_t max2 = kFFTSize + 2;
while( count2 < max2 )
{
const float realValue = buffer[(count2) + 0];
const float imagValue = buffer[(count2) + 1];
const float value = (log10f( sqrtf( (realValue * realValue) + (imagValue * imagValue) ) * rcpVerticalZoom ) + 1.0f) * 0.5f;
buffer[count2 >> 1] = value;
count2 += 2;
}
私の目には、これまでに見た他のほとんどのスペクトログラム実装よりも良く見えます。
私がやっていることに重大な問題はありますか?