4

オーディオ ストリームからピッチ データを抽出しようとしています。私が見る限り、FFT が使用するのに最適なアルゴリズムであるように見えます。

数学を直接掘り下げるのではなく、誰かがこの FFT アルゴリズムの機能を理解するのを手伝ってくれませんか?

「FFT は生の信号から周波数データを抽出します」のような明白なことは言わないでください。次のレベルの詳細が必要です。

何を渡し、何を取り出すか?

インターフェイスを明確に理解すると、実装を理解するのに役立ちます。

オーディオ バッファーに渡す必要があると思います。各計算に使用するバイト数を伝える必要があります (たとえば、このバッファーからの最新の 1024 バイト)。検出するピッチの範囲を指定する必要があるかもしれません。今、それは何を返しますか?周波数ビンの配列?これは何?

(編集:) 使用する C++ アルゴリズムを見つけました (理解できる場合のみ)

Performousは、マイクからピッチを抽出します。また、コードはオープンソースです。これは、アルゴリズムをコーディングした人による、アルゴリズムの機能の説明です。

  • PCM入力(バッファリングあり)
  • FFT (一度に 1024 サンプル、その後バッファの先頭から 200 サンプルを削除)
  • 再割り当て方法 (200 サンプル前の前の FFT に対して)
  • ピークのフィルタリング (この部分は、はるかに適切に行うことも、除外することもできます)
  • ピークを組み合わせてハーモニクスのセットにする (組み合わせをトーンと呼びます)
  • トーンの一時的なフィルタリング (単に新しく検出されたトーンを使用するのではなく、以前に検出されたトーンのセットを更新します)
  • 最良のボーカル トーンを選択します (周波数制限、重み付け、ハーモニック アレイも使用できますが、使用しないと思います)。

しかし、誰かがこれがどのように機能するかを理解するのを手伝ってくれますか? FFT から Reassignment メソッドに送られるのは何ですか?

4

3 に答える 3

3

FFTは、プロセスの1つの構成要素にすぎず、ピッチ検出に最適なアプローチではない場合があります。ピッチ検出を読み、最初に使用するアルゴリズムを決定します(これは、スピーチ、単一の楽器、その他の種類の音など、ピッチを正確に測定しようとしているものによって異なります。低くなる前にこれを正しく取得してくださいFFTなどのレベルの詳細(すべてではありませんが、一部のピッチ検出アルゴリズムは内部でFFTを使用します)。

SOについては、すでに多くの同様の質問があります。たとえば、 FFTを使用したリアルタイムピッチ検出トランペット用のFFTを使用したピッチ検出、およびWikipediaなどに優れた概要資料があります。これらを読んでから、独自のFFTをロールするかどうかを決定してください。ベースのソリューション、または特定のアプリケーションに適した既存のライブラリを使用することもできます。

于 2010-11-01T10:21:55.750 に答える
2

ここには選択の要素があります。実装する最も簡単な方法は、(2^n サンプルの) 複素数を入力し、2^n 複素数を出力することです。

DCT (離散コサイン変換) の特殊なケースでは、通常、入力は 2^n サンプル (多くの場合浮動小数点) であり、出力は 2^n 値であり、多くの場合浮動小数点です。DCT は FFT ですが、実際の値のみを取り、関数をコサインで分析します。

複雑な値を処理する構造体を定義するのは賢明です (ただし、一般的にスキップされます)。従来、FFT はその場で行われますが、そうしなくても問題なく動作します。

FFT の作業バッファーを含むクラスをインスタンス化し (FFT をインプレースで実行したくない場合)、それを複数の FFT に再利用すると便利です。

于 2010-11-01T10:26:52.020 に答える
1

PCM (純粋な実数の複素数) の N サンプルが入ります。周波数領域の N ビンが出力されます (各ビンは、サンプル レートの 1/N スライスに対応します)。各ビンは複素数です。これらの値は通常、実数部と虚数部ではなく、極形式 (絶対値と引数) で処理する必要があります。絶対値はビンの中心周波数付近の音の量を示し、引数は位相 (正弦波が移動する位置) を示します。

ほとんどの場合、コーダーは大きさ (絶対値) のみを使用し、位相角 (引数) を破棄します。

于 2010-12-16T00:47:02.823 に答える