2

私は人々がギターを学ぶのを助けるプログラムを書いています。これを行うには、時間のサンプルを見て、彼らが演奏した音符を確認できる必要があります。FFTW を見ましたが、これを機能させる方法がわかりません。私はまた、Goertzel アルゴリズムを理解しようとしましたが、それはダイヤル トーンのような単一周波数のノート用のようです (それについてはわかりません)。明確にするために、(コードが演奏されているかどうかを確認するために) 複数の音符を検出できる必要がありますが、そこにいくつかのハーモニクスが含まれていても、それほど問題ではありません。

私はこれを C++ でコーディングしていますが、クロスプラットフォームのソリューションを好むでしょう。

更新: 特定のメモを検出することはそれほど重要ではないことに気付きました。私が本当に必要としているのは、特定の周波数が存在し、他の周波数が存在しないことを確認することです。たとえば、誰かが C を演奏する場合、C 周波数 (約 262 Hz) が存在すること、およびおそらく 524 Hz と 786 Hz が存在することを確認し、倍音系列で近くにない近くの音 ( B および D) は存在しません。

4

3 に答える 3

3

メモは wav ファイルにはありません。サンプリング音です。

人間は、いくつかの wav ファイルでサウンドを作成するために演奏された可能性のあるいくつかの音符を認識する可能性がありますが、録音されたサウンドから、ギターによって生成されるような豊かで複雑な波形の転写された音楽への自動ポリフォニック ピッチ推定/認識を行うことは、依然として重要であると思われます。高度な研究テーマ。

特定の非常に制限されたタイプの音楽サウンドが可能な場合、重要な DSP が使用されます。FFTW は、ピッチ推定に必要なより高度な DSP 処理のごく一部に役立つ可能性がありますが、Goertzel フィルタリングはそれほど役に立ちません。

于 2012-07-09T01:51:37.530 に答える
0

このpdfはどうですか? http://miracle.otago.ac.nz/tartini/papers/A_Smarter_Way_to_Find_Pitch.pdf

FFT の問題は、256 サンプルの FFT を実行すると、256 の出力しか得られないことです。基本的に、これが意味することは、無限の数の周波数がある周波数空間を、限られた一連の周波数に分割することです。

これは、256 サンプル (256 は FFT に使用されるサンプル数 N に置き換えることができます) のみをチェックすると、256 の倍数で関連付けられた周波数はすべて同じに見えるためです。

つまり、時間 0、1/256、2/256、3/256、... 255/256 で取得された 256 の等間隔のサンプルをチェックすると、次に、周波数が 80 サイクル/秒の sin(2 pi 80 x) と、周波数が (80+9*256) の sin(2 pi (80 + 9*256) x) の 2 つの信号は、同じサンプル。

ここで、9 は、使用する倍数である k に置き換えることができます。9 を 1、2、3、4、5 などに置き換えることができます。256 (N) を任意の値に置き換えることもできます。

例として、サンプルの 1 つである 200/256 で両方をサンプリングすると、sin(2 pi (80 + 9*256) (200/256)) = sin(2 pi 80 (200/256) + 2 pi になります。 * 9 * 200)

2 pi の倍数は sin に影響しないため、これは sin(2 pi 80 (200/256)) と同じです。

より一般的には、sin(2 pi (M + k*N) j/N) = sin (2 pi M (j/N) + 2 pi k*j) = sin (2 pi M (j/N) ) です。 j は任意の整数 0、...、N - 1、N はサンプル数、(j/N) はサンプルする時間、M は 1 秒あたりのサイクル数、k は任意の整数 ... -2 、-1、0、1、2 ...

ナイキスト サンプリングから、1 秒あたり -128、-127、-126、-125、...、125、126、127 サイクルを区別する場合は、256 サンプル/秒を取得します。256 サンプル/秒は、256 の周波数を区別することを意味します。ただし、0 サイクル/秒、256 サイクル/秒、512 サイクル/秒、1024 サイクル/秒はすべて同じように見えます。

于 2014-04-28T04:02:32.337 に答える
0

詳細を示すことはできませんが、必要なのは、探している周波数を検出するためのフーリエ変換であると思います。ここにも同様の質問があります

于 2012-07-09T18:20:52.747 に答える