ピッチ検出を改善するためのヒント


21

ユーザーがギターをチューニングできるシンプルなWebアプリを開発しています。私は信号処理の本当の初心者なので、私の質問が不適切であるかどうかを厳しく判断しないでください。

そのため、FFTアルゴリズムを使用して基本周波数を取得することができましたが、この時点でアプリケーションは何らかの形で機能しています。ただし、改善の余地があり、現在、FFTアルゴリズムに未処理のpcmを送信していますが、検出を改善する前/後のアルゴリズム/フィルターがあるかもしれないと考えていました。何か提案できますか?

私の主な問題は、特定の周波数を検出すると、その周波数が1〜2秒間表示された後、他のランダムな周波数にジャンプして、音が連続していても再び戻ってくるということです。

また、そのようなことを経験したことがある場合、他のタイプの最適化にも興味があります。

回答:


20

私はそれが得る他の周波数が基本波の高調波であると推測していますか?100 Hzを再生していて、代わりに200 Hzまたは300 Hzを選択しますか?最初に、ギターがそうである可能性が高い周波数に検索スペースを制限する必要があります。必要となる可能性最も高い基本を見つけ、それに限定します。

基本波の振幅が高調波よりも小さい場合(または完全に欠落しているが、ギターの問題ではない場合)自己相関基本波を見つける際にFFTよりもうまく機能します。

ここに画像の説明を入力してください

また、低域に重みを付けて基本波を強調し、高調波を最小限に抑えるか、このようなピーク選択アルゴリズムを使用して、最も低い周波数を選択することもできます。

また、FFTを適用する前に信号をウィンドウ処理する必要があります。それにウィンドウ関数を掛けるだけで、波形の始まりと終わりが先細りになり、周波数スペクトルがきれいになります。次に、幅の広い成分ではなく、周波数成分の背の高い細いスパイクを取得します。

補間を使用して、より正確なピークを取得することもできます。スペクトルのログを取り、次に放物線をピークと2つの隣接する点に適合させ、放物線の真のピークを見つけます。ただし、これほどの精度は必要ないかもしれません。

ここで、このすべてのための私の例のPythonコードは


これは私が探していたものです、非常に良い答え、ありがとう!
バレンティンラドゥ

2
先細の窓関数を掛けると、実際に信号のスペクトル線が塗りつぶされ、それにより信号線が広くなります。ただし、購入できるのはダイナミックレンジであり、たとえば、高出力干渉トーンが存在する場合に非常に低出力のスペクトルラインを識別することができます。
ジェイソンR

@JasonRは、これが高出力干渉トーンの確率が本当に低い環境で動作するように設計されているという事実を考えると、ハミングウィンドウを使用しない方が良いとお考えですか?
バレンティンラドゥ

1
ハミングウィンドウを使用すると、読み取り値を安定させるという目標に近づいたことが確認できます。現在、A4をプレイすると、ほとんどの場合440 Hzを取得しますが、非常にまれなことですが、650 Hz程度の読み取り値を取得します。それらは高調波だと思いますか?また、高周波数ではアプリが問題なく動作し、低周波数ではエラーが発生し始めることに気づかずにはいられませんでした。おそらく、私はFTTを使用してピーク振幅の周波数ビンを検出し、低周波数では常に基本周波数ではないのでしょうか?
バレンティンラドゥ

1
@mindnoise:660 Hzは440 Hzの高調波ではありませんが、220 Hzの高調波、または440を超える完全な5分の1です。別の弦が共鳴したり歪んだりする可能性がありますか?FFTをプロットして見ることができれば、このような問題を見つけるのがずっと簡単です。はい、機械的効果またはアナログ回路により、低周波数がフィルタリングされ、高周波数に比べて低減される場合があります。
エンドリス

12

ピッチは、FFTのピーク振幅周波数ビンと同じではありません。ピッチは人間の心理音響現象です。ピッチサウンドには、欠落または非常に弱い基本波(一部の音声、ピアノ、ギターサウンドで一般的)やピッチ周波数を圧倒するスペクトルの強力な倍音が含まれている可能性があります(ただし、人間はそのピッチノートとして聞こえます) 。そのため、FFTピーク周波数検出器(ウィンドウイングや補間を含む)は、ピッチ推定の堅牢な方法ではありません。

このstackoverflowの質問には、より良い結果をもたらす可能性のあるピッチを推定するいくつかの代替方法のリストが含まれています。

追加:ギターサウンドでこれを行っている場合、人間の耳には倍音の倍数に密接に関連するピッチ周波数が聞こえる可能性があるため、実際にギターの最低弦でわずかに不調和な倍音が生成され、ピッチ推定がさらに難しくなることに注意してください、弦の実際の基本振動周波数ではなく。

追加#2:これは非常に頻繁に尋ねられるので、トピックに関する長いブログ投稿を作成しました:http : //www.musingpaw.com/2012/04/musical-pitch-is-not-just-fft-frequency.html


ちょうどあなたが私たちを紹介したブログを訪れた(そしてコメントした)。
ロバートブリストージョンソン

5

ポリフォニック音楽のピッチ検出の研究に長年費やしました。たとえば、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()関数にアクセスする必要があります。

ここに画像の説明を入力してください


ジェームズ、あなたのDFTピッチ検出器は、基本波が欠けている(または弱い)ノートを検出しますか?
ロバートブリストージョンソン

はい、私の2ステージピッチ検出アルゴリズムは、信号に「欠落(または弱い)基本波」がある場合でも音を検出します。これがこの2ステージプロセスの大きな強みです。対数DFTダイアグラムのノートに表示される時間幅でオクターブ検出が実行されるとき、基本は第2段階で決定されます。このピッチ検出機能は、ポリフォニックMP3信号の混乱の中で機能するため、基本を含む多くの倍音が欠落しているノートを検出します。この回答に、オクターブ検出アルゴリズムを説明する2番目の図を追加しました。
ジェームズポールミラード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.