ポリフォニック音楽のピッチ検出の研究に長年費やしました。たとえば、mp3録音内のギターソロの音を検出するようなものです。また、プロセスの簡単な説明を提供するウィキペディアのセクションを作成しました(以下のリンクの「ピッチ検出」サブセクションをご覧ください)。
単一のキーがピアノ時に押されたとき、私たちは聞く音の振動のただ一つの周波数ではなく、複合複数の音振動のは、異なる数学的に関連頻度で起こります。この異なる周波数の振動の複合要素は、高調波または部分音と呼ばれます。たとえば、ピアノのミドルCキーを押すと、コンポジットの倍音の個々の周波数は基本周波数として261.6 Hzから始まり、523 Hzが2次高調波、785 Hzが3次高調波、1046 Hzになります後の高調波は、基本周波数261.6 Hzの整数倍です(例:2 x 261.6 = 523、3 x 261.6 = 785、4 x 261.6 = 1046)。
修正されたDFT対数変換を使用して、最初にピークレベルの周波数を探して、可能な高調波を検出します(下図を参照)。変更されたLog DFTのデータを収集する方法のため、ウィンドウ関数を信号に適用する必要はなく、追加や重複もしません。そして、ギター、サックスなどのノートによって倍音が作成される周波数と直接一致するように、周波数チャンネルが対数的に配置されるようにDFTを作成しました。
現在は廃止されているため、ピッチ検出エンジンのソースコードをPitchScope Playerと呼ばれる無料のデモアプリ内でリリースすることにしました。PitchScope PlayerはWebで入手できます。Windows用の実行可能ファイルをダウンロードして、選択したmp3ファイルで動作している私のアルゴリズムを確認できます。以下のGitHub.comへのリンクから、完全なソースコードにアクセスできます。ここでは、カスタム対数DFT変換で高調波を検出する方法を確認し、「ピッチ'。
私のピッチ検出アルゴリズムは実際には2段階のプロセスです:a)最初にScalePitchが検出されます( 'ScalePitch'には12の可能なピッチ値があります:{E、F、F#、G、G#、A、A#、B、C、C#、D 、D#})b)およびScalePitchが決定された後、4つの可能なオクターブ候補ノートのすべての倍音を調べることにより、オクターブが計算されます。このアルゴリズムは、ポリフォニックMP3ファイル内の任意の時点で最も支配的なピッチ(音符)を検出するように設計されています。これは通常、インストゥルメンタルソロのノートに対応します。私の2ステージピッチ検出アルゴリズムのC ++ソースコードに興味がある人は、GitHub.comのSPitchCalc.cppファイル内のEstimate_ScalePitch()関数から始めることをお勧めします。
https://github.com/CreativeDetectors/PitchScope_Player
https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection
以下は、ポリフォニックMP3録音でのギターソロの3秒間の対数DFT(私のC ++ソフトウェアで作成)の画像です。ソロを演奏しながら、ギターの個々の音に対してどのように倍音が現れるかを示しています。この対数DFTの各音について、各倍音は同じ時間幅を持つため、垂直に伸びる複数の倍音を見ることができます。音のオクターブが決定されると、基本周波数がわかります。
以下の図は、そのノートのScalePitchが決定されると、正しいオクターブ候補ノート(つまり、正しい基本)を選択するために開発したオクターブ検出アルゴリズムを示しています。C ++でそのメソッドを見たい場合は、GitHubのソースコードに含まれているFundCandidCalcer.cppというファイル内のCalc_Best_Octave_Candidate()関数にアクセスする必要があります。