0

低音オーディオを使用してオーディオのスペクトルをプロットするアプリを実装しようとしています ( http://www.un4seen.com/ )。私の理解では、次のことを行う必要があります。

  1. ストリームから FFT データを取得する float[] buffer = new float[256]; Bass.BASS_ChannelGetData(handle, buffer, (int)(BASS_DATA_FFT_COMPLEX|BASS_DATA_FFT_NOWINDOW));

  2. 各fftについて、その大きさを計算します

  3. ウィンドウ関数を FFT に適用します (ハニングまたはハミングで行います)。

  4. 次に、美しいスペクトル分析を描きます

ただし、問題は次のとおりです。

  • BASS_DATA_FFT_COMPLEX BassData に到達できないようです。ドキュメントhttp://www.bass.radio42.com/help/html/a13cfef0-1056-bb94-81c4-a4fdf21bd463.htmで利用できるはずですが、BassData というエラーが発生するため使用できません。そのような列挙型は含まれません
  • さらに、自分のしていることが正しいかどうか疑問に思っています。スペクトルをプロットするには、単純に fft の大きさをプロットするか、その fft の周波数に対して fft の大きさをプロットする必要がありますか? この場合、その fft に対応する周波数を取得するにはどうすればよいでしょうか。任意の言語 (C/C++、C#、VB、Java など) から切り取られたコードは気にしません。

注: これが役立つかどうかはわかりませんが、これは私が使用しているものです: Microsoft Chart コントロールを使用したプロット。http://www.bass.radio42.com/ による BASS.NET API を使用した C#

4

1 に答える 1

2

ステップの順序が間違っています。FFT を計算するに、時間領域データにウィンドウ関数を適用する必要があります。通常、手順は次のとおりです。

1. acquire time domain data
2. apply window function
3. calculate FFT
4. calculate log magnitude of FFT (log(re*re+im*im))
5. plot log magnitude (with appropriate scaling) against frequency

Y 軸に対数マグニチュードを使用すると、効果的にスケールが得られることに注意してくださいdB。これは、線形マグニチュード スケールよりも、音の振幅を表示するためのより自然で便利な方法です。

通常、オーディオなどを視覚化するには、上記の手順 1 ~ 5 を時間領域データの連続するブロックに適用します。通常は 50% のオーバーラップがあります。

于 2013-05-13T10:00:00.967 に答える