web-dev-qa-db-ja.com

リアルタイムのピッチ検出

ユーザーの歌声をリアルタイムでピッチ検出しようとしていますが、多くの問題が発生しています。 FFT( FFT Problem(Returns random results) )や自己相関( Autocorrelation pitch detectionはマイク入力でランダムな結果を返す )を含む多くの方法を試しましたが、良い結果を出すためのメソッドを取得していないようです。誰かがリアルタイムのピッチ追跡の方法や、すでに持っている方法を改善する方法を提案できますか?リアルタイムのピッチ検出に適したC/C++メソッドが見つからないようです。

おかげで、

ニアル。

編集:ただ注意して、マイク入力データが正しいこと、および正弦波を使用した場合の結果が多かれ少なかれ正しいピッチであることを確認しました。

編集:これは遅いですが、現時点では、結果の配列と各インデックスから値を取り出し、X軸にインデックスをプロットし、Y軸に値をプロットすることで、オートコレレーションを視覚化しています(両方が100000か何か、そしてOpenGLを使用している場合)、VSTホストにデータをプラグインし、VSTプラグインを使用することは私には選択肢ではありません。現時点では、ランダムなドットのように見えます。私はそれを正しくやっていますか、それともそれを行うためのいくつかのコードを私に引き寄せてくれますか、それとも生のオーディオデータと自己相関データを視覚化する方法を理解するのを助けてくれますか?.

26
Niall

一歩下がって...これを機能させるには[〜#〜] must [〜#〜]このプロセスの中間ステップをプロットする方法を理解します。あなたがやろうとしていることは特に難しいことではありませんが、エラーが発生しやすく、面倒です。クリッピング、ウィンドウ処理、配線不良、エイリアシング、DCオフセット、誤ったチャネルの読み取り、奇妙なFFT周波数軸、インピーダンスの不一致、フレームサイズのエラーなど...生データ、FFTをプロットすると、すべてが明確になります。

32
tom10

リアルタイムのピッチ追跡のオープンソース実装がいくつか見つかりました

リアルタイム用に設計されていないかもしれないが、私が知っているすべての方法でそのように使用できるピッチトラッカーもいくつかあります。また、リアルタイムトラッカーを以下と比較するためのリファレンスとしても役立ちます。

19
Deanna Gelbart

私はこの答えがみんなを幸せにするつもりはないことを知っていますが、ここに行きます。

これは大変です。まず、FFT、自己相関、ウェーブレットで見つけることができる限り多くのチュートリアルを読みます。私はまだDSPに苦労していますが、以下からいくつかの洞察を得ました。

https://www.coursera.org/course/audio コースは現在実行されていませんが、ビデオは引き続き利用できます。

http://miracle.otago.ac.nz/tartini/papers/Philip_McLeod_PhD.pdf ピッチ認識アルゴリズムの開発に関する論文。

http://dsp.stackexchange.com デジタル信号処理専用のサイト全体。

私のように、チュートリアルを完全に実行するのに十分な計算をしなかった場合でも、図と例のいくつかがまだ何が起こっているのかを理解するのに役立つので、あきらめないでください。

次はテストデータとテストです。アルゴリズムのチェックに使用するテストファイルを生成するライブラリを自分で作成します。

1)超シンプルな純粋な正弦波発生器。 YAT(Yet Another Tuner)を記述している場合、サインジェネレーターを使用して、さまざまな増分で440〜460 Hzから440 Hz前後の一連のファイルを作成し、コードの感度と正確さを確認します。 5Hz、1Hz、さらに細かい範囲で解決できますか?

2)次に、正弦波ジェネレータをアップグレードして、信号に一連の弱い高調波を追加します。

3)次は、高調波の実際の変動です。したがって、ほとんどの弦楽器では一連の高調波が基本周波数F0の単純な倍数として表示されますが、クラリネットやフルートなどの楽器では、チャンバー内の空気の振る舞いにより、偶数の高調波が失われるか非常に弱くなります。また、一部の機器ではF0がありませんが、他の高調波の分布から決定できます。 F0は人間の耳がピッチとして認識するものです。

4)調和ピーク周波数を不規則に上下にシフトすることにより、意図的な歪みを投入します

重要なのは、既知の結果を持つファイルを作成している場合、ビルドしているものが実際に機能していることを確認する方が簡単であること、もちろんバグです。

サウンドサンプルを含む「ライブラリ」も多数あります。 https://freesound.org 上記のCourseraシリーズから。 http://theremin.music.uiowa.edu/MIS.html

次に、マイクが完全ではないことに注意してください。何千ドルも費やしていない限り、周波数応答範囲はかなり変動します。特に、低音よりも安価なマイクを使用している場合は、PCまたは電話に組み込まれているマイクを読み取り、約80〜100 Hzで大幅なロールオフを開始します。適度に良好な外部の場合、30〜40Hzに低下する可能性があります。マイクでデータを探しに行きます。

スピーカーでトーンを再生し、お気に入りのマイクで録音することで、何が起こるかを確認することもできます。しかしもちろん、ここでは2セットの周波数応答曲線について話しています。

パフォーマンスに関しては、さまざまなライセンスモデルに注意する必要がありますが、無料で入手できるライブラリが多数あります。

何よりも、最初の数回の試行の後、あきらめないでください。幸運を祈ります。

7
TJA

これは、私が考案した珍しい2ステージアルゴリズムのC++ソースコードで、リアルタイムピッチ検出polyphonicMP3ファイルで実行できます。 Windowsで再生されています。この無料のアプリケーション(PitchScope Player、Webで入手可能)は、MP3録音時にギターまたはサックスのソロのノートを検出するために頻繁に使用されます。このアルゴリズムは、MP3音楽ファイル内の任意の時点で最も支配的なピッチ(音符)を検出するように設計されています。音符の開始は、MP3録音中の任意の瞬間の最も支配的なピッチ(音符)の大幅な変化によって正確に推測されます。

ピアノで単一のキーを押すと、聞こえるのは1つの周波数の振動だけではなく、数学的に関連するさまざまな周波数で発生する複数の音響振動の複合です。異なる周波数での振動のこの複合の要素は、harmonicsまたはパーシャルと呼ばれます。たとえば、ピアノの中央のCキーを押すと、複合周波数の個々の周波数は基本周波数として261.6 Hzから始まります。523Hzは2次高調波、785 Hzは3次高調波、1046 Hzは後の高調波は基本周波数の整数倍、261.6 Hzです(例:2 x 261.6 = 523、3 x 261.6 = 785、4 x 261.6 = 1046)。下部にリンクされているのは、ギターソロのポリフォニックMP3レコーディング中に発生する実際のハーモニクスのスナップショットです。

FFTの代わりに、対数周波数間隔の変更された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が決定された後、Octaveは4つの高調波を調べることによって計算されます可能なオクターブ候補ノート。このアルゴリズムは、ポリフォニックMP3ファイル内の任意の時点で最も支配的なピッチ(音符)を検出するように設計されています。これは通常、インストゥルメンタルソロのノートに対応します。私の2ステージピッチ検出アルゴリズムのC++ソースコードに興味がある人は、GitHub.comのSPitchCalc.cppファイル内のEstimate_ScalePitch()関数から始めたいと思うかもしれません。 https://github.com/CreativeDetectors/PitchScope_Player

以下は、ポリフォニックmp3レコーディングでのギターソロの3秒間の対数DFT(私のC++ソフトウェアで作成)の画像です。ソロを演奏しているときに、ギターの個々のノートのハーモニクスがどのように表示されるかを示します。この対数DFTの各ノートについて、複数の高調波が垂直に伸びているのがわかります。これは、各高調波が同じ時間幅を持つためです。ノートのオクターブが決まると、ファンダメンタルの周波数がわかります。

enter image description here

5

数年前に行ったプロジェクトのマイク入力に同様の問題がありました-DCオフセットが原因であることが判明しました。

FFTまたは使用している他の方法を試す前に、バイアスをすべて削除してください。

ヘッドルームまたはクリッピングの問題が発生している可能性もあります。

グラフは、オーディオに関するほとんどの問題を診断する最良の方法です。

5
Dipstick

このサンプルアプリケーションを見てください。

http://www.codeproject.com/KB/audio-video/SoundCatcher.aspx

アプリがC#であり、C++が必要であることがわかります。これは.Net/Windowsであり、Macを使用しています...しかし、彼のFFT実装が出発点となる可能性があると考えました。 FFTの実装を彼と比較してみてください。 (彼は、Cooley-TukeyのFFTの反復幅広バージョンです)。それらは似ていますか?

また、あなたが説明している「ランダムな」動作は、バイト配列の値を適切にアセンブルせずに、サウンドカードから返されたデータを直接取得しているためかもしれません。サウンドカードに16ビット値をサンプリングするように要求してから、値を格納するためのバイト配列を与えましたか?その場合、返される配列内の2つの連続するバイトが1つの16ビットオーディオサンプルを構成することに注意してください。

2

aubio を確認してください。また、ピッチトラッキング用のいくつかの最先端のメソッドを含むオープンソースライブラリもご覧ください。

2
piem

リアルタイムリアルディテクターのJavaコードは http://code.google.com/p/freqazoid/ で入手できます。

これは、2008年以降のリアルタイムJavaを実行している任意のコンピューターでかなりうまく機能します。このプロジェクトは中止され、関係者に取り上げられる可能性があります。詳細が必要な場合は、私に連絡してください。

2
James Beauchamp

私はここで同様の質問をしました:

C/C++/Obj-Cリアルタイムアルゴリズムにより、ボーカル入力からノート(ピッチではない)を確認

編集:

Performous には、リアルタイムのピッチ検出用のC++モジュールが含まれています

また Yin ピッチ追跡アルゴリズム

1
P i

楽器チューナーから何かを適応できますか?私の楽しくコンパクトなギターチューナーは、弦のピッチをかなりよく検出できます。私はこのアルゴリズムをある程度説明している piano tuner を参照しています。

0
djna