2

以下のWinAmpのようなスペクトラムアナライザを実装するにはどうすればよいですか?

Winampの「イコライザーバー」の例

それを見るだけで、これらのバーは、着信オーディオデータの特定の周波数帯域の「音量レベル」を表示するようにレンダリングされていると思います。ただし、棒を描くというかなり簡単な作業に必要なこのデータを実際に計算する方法がわかりません。

私が聞いて理解したことから、これらの値の計算はFFTを使用して行うことができますが、入力データのバッファーを考えると、これらの値を計算する方法が正確にはわかりません。私はFFTについて正しい方向に進んでいますか?入力データにFFTを適用して、たとえば、特定の周波数帯域の「ボリューム」を表す整数をFFTから取得するにはどうすればよいですか?

フレームバッファに直接描画してレンダリングできるので、描画部分は問題ありません。誰かが潜在的なハードウェアの制限について疑問に思っている場合に備えて、Nios IIソフトCPUを使用して、FPGA上のプロジェクトとしてこれを行っています。オーディオデータは、96kHzで24ビットデータとして受信されます。

4

2 に答える 2

6

あなたはおそらくFFTwを探しています。

編集:

あなたの質問を詳しく説明するには:

これらの値の計算はFFTを使用して行うことができますが、入力データのバッファーを考えると、これらの値を計算する方法が正確にはわかりません。それはまさにそれが行われる方法です。あなたは(時間-周波数の不確定性原理のために、必然的に小さい)現在再生中のオーディオデータからセグメントをサンプリングし、それを(通常)離散的な実数のみのFFT(最もよく知られており、最も広く使用されており、最も高速なDFTのDCTファミリーの1つです-実際には高度に最適化されていますFFTwのほとんどのDCTのバージョン)。次に、次のサンプルセグメントを取り出して、プロセスを繰り返します。FFTの出力は、供給されたオーディオ信号の周波数分解になります。次に、それを表示する方法(つまり、FFTの出力で使用する関数、一般的な候補はf(x)=)を決定する必要があります。 x; f(x)= sqrt(x); f(x)= log(x))また、次の読み取り値を表示/アニメートする方法(たとえば、時間方向の各バンドを平均化するか、最大値を設定することができます "ゆっくりと落ちる」)。


怒り編集:誰かが反対票を投じる方法を知っているが、グーグルの使い方を知らないように見えるので、追加のリンク:

于 2013-03-10T08:39:31.780 に答える
0

これは非常に簡単です。多くのFFTアルゴリズムの1つを使用するだけです。それらのほとんどは浮動小数点計算を必要としますが、グーグル検索は整数だけのメソッドを表示します。しかし、あなたはその場にいます、FFTはあなたが望むものです。

FFTを適用する方法を理解するには、離散フーリエ変換に関するこのページを読む必要がありますが、数学にはかなりの負担がかかります。

FPGAに実装するために、このプロジェクトのソースコードを見てみましょう。

これは、それがどのように機能するか(任意の言語で)の要約を与える以前のSOの質問です。

ちなみに「スペクトラムアナライザ」と呼ばれるものを作成することについては膨大な量の情報があります。ソースコードが自由に利用できる完全な実装が数十あるはずです。たとえば、「スペクトラムアナライザのソースコードC」をグーグル検索するだけです。

于 2013-03-10T08:24:50.650 に答える