音の信号からピッチを抽出したいと思っています。
IRCの誰かが、ダブルFFTを使用することでこれがどのように達成されるかを説明してくれました。具体的には:
私はvDSPを使用してこれを試みています
以前にこのテクニックに出会わなかった理由がわかりません。私はたくさんの狩猟と質問をしました。数週間の価値があります。もっと要点を言えば、なぜ私がそれを考えなかったのか理解できません。
私はvDSPライブラリでこれを達成しようとしています。これらすべてのタスクを処理する機能があるように見えます。
しかし、最終結果の正確さについては疑問に思っています。
私は以前、極大値のために単一のFFTの周波数ビンを精査する手法を使用しました。 1つに遭遇すると、狡猾な手法(最後のFFT以降の位相の変化)を使用して、実際のピークをビン内に正確に配置します。
ここで紹介するこの手法では、この精度が失われるのではないかと心配しています。
基本を正確に取得するために、2回目のFFTの後にこの手法を使用できると思います。しかし、ステップ2で情報が失われたように見えます。
これは潜在的にトリッキーなプロセスであるため、経験のある人が私が行っていることを調べて、正気かどうかを確認できますか?
また、隣接するビンに2次式を当てはめるという別の手法があると聞きました。これは同等の精度ですか?もしそうなら、それはビンのフェーズを覚えることを含まないので、私はそれを好むでしょう。
だから、質問:
誰かが私にこの技術に関するいくつかの研究や文献を教えてもらえますか?
主な質問:それは十分に正確ですか?精度を上げることはできますか?専門家から、精度IS INDEEDでは不十分だと言われました。これで終わりですか?
円周率
PS私はSOタグを作成したいときにイライラしますが、できません。:|メンテナにSO試行されたタグを追跡することを提案しましたが、私は無視されたと確信しています.vDSP、アクセラレーションフレームワーク、ケプストラム分析用のタグが必要です
さて、1つずつ見ていきましょう:
音の信号からピッチを抽出したいと思っています。
私は専門家ではなく、最小限の正式なトレーニングしか受けていませんが、この問題に対する最善の答えを知っていると思います。私は過去数年間、検索、読み取り、実験をlot行ってきました。私のコンセンサスは、自己相関法は、精度、複雑さ、ノイズの堅牢性、および速度の間のトレードオフの観点から、はるかに最良のピッチ検出器であるということです。非常に特殊な状況がない限り、ほとんどの場合、自己相関を使用することをお勧めします。これについては後で詳しく説明します。他の質問にお答えします。
あなたが説明しているのは、主に音声からピッチを抽出するために使用される方法である「ケプストラム分析」です。ケプストラム分析は、信号の倍音のplentifulnessおよびstrengthに完全に依存しています。たとえば、純粋な正弦波をケプストラム分析に通すと、ひどい結果が得られます。ただし、複雑な信号である音声の場合、倍音が多くなります。 (ちなみに、倍音は、基本周波数、つまり私たちが知覚するピッチの倍数で振動している信号の要素です)。ケプストラム分析は、ミッシングファンダメンタル周波数の音声を検出する際に堅牢になります。つまり、関数 sin(4x)+ sin(6x)+ sin(8x)+ sin(10x) をプロットしたとします。それを見ると、関数sin(2x)と同じ周波数であることがわかります。ただし、この関数にフーリエ解析を適用すると、sin(2x)に対応するビンの大きさはzeroになります。したがって、この信号には、私たちが考える周波数の正弦波が含まれていないため、「ミッシング基本周波数」があると見なされます。したがって、フーリエ変換で最大のピークを選択するだけでは、この信号では機能しません。
私は以前、極大値のために単一のFFTの周波数ビンを精査する手法を使用しました。 1つに遭遇すると、狡猾な手法(最後のFFT以降の位相の変化)を使用して、実際のピークをビン内に正確に配置します。
あなたが説明しているのは、与えられたpartialの周波数をより正確に測定するためのフェーズボコーダー技術です。ただし、最大のビンを選択する基本的な手法では、基本周波数成分が欠落しているか弱い信号を使用すると問題が発生します。
ここで紹介するこの手法では、この精度が失われるのではないかと心配しています。
まず第一に、フェーズボコーダー技術は単一のパーシャルの周波数をより正確に測定するだけであることを忘れないでください。基本周波数に関する上位部分に含まれる情報は無視されます。第二に、まともなFFTサイズが与えられれば、ピーク補間を使用して非常に良い精度を得ることができます。ここにいる他の誰かが、放物線補間を指摘しています。私もこれを提案します。
ピッチが約440Hzの44100Hzのデータの4098サンプルブロックのFFTを放物線で補間すると、40番目(430.66 Hz)と41番目(441.430664064)のビンの間になります。 この論文 が一般的なケースでほぼ正しいと仮定すると、放物線補間によって解像度が1桁以上向上すると言われています。これにより、人間の聴覚のしきい値である少なくとも1Hzの解像度が残ります。実際、理想的なガウスウィンドウを使用する場合、放物線補間はピークでexactになります(そうです、正確です。ただし、真のガウスウィンドウは永久に拡張されるため、使用できないことに注意してください。両方向。)still精度が高くなることを心配している場合は、いつでもFFTを埋めることができます。これは、変換する前にFFTの最後にゼロを追加することを意味します。これは、周波数が制限された信号の理想的な補間関数である「sinc補間」と同等であることがわかります。
基本を正確に取得するために、2回目のFFTの後にこの手法を使用できると思います。しかし、ステップ2で情報が失われたように見えます。
それは正しいです。フェーズボコーダー技術は、シーケンシャルフレームが接続され、特定の位相関係を持っているという事実に依存しています。ただし、シーケンシャルフレームのFFTの対数の大きさはnot位相に関して同じ関係を示しているため、この変換を2番目のFFTに使用することは無意味です。
- このアプローチは理にかなっていますか?改善できますか?
はい、はい、最後に自己相関に関する私のビットの改善について詳しく説明します。
- 少し心配ですそして対数二乗コンポーネント。正確にそれを行うvDSP関数があるようです:vDSP_vdbconただし、ログテーブルを事前計算することを示すものはありません-FFT関数では明示的な事前計算関数を呼び出して渡す必要があるため、そうではないと思いますそれに。この関数はそうではありません。
VDSPライブラリの詳細がわかりません。申し訳ありません。
- 高調波が拾われる危険性はありますか?
オリジナルのフェーズボコーダーのピークピッキングテクニックでは?はい。ケプストラム法では?いいえ、実際にはそうではありませんが、要点は、周波数推定値を取得するためにすべての高調波を考慮するということです。たとえば、周波数が1であるとします。倍音は2、3、4、5、6、7、8、9などです。すべての奇数倍音を取り除く必要があります。つまり、2、4、6を残します。 8などand倍音の1つと混同され始める前に、基本周波数を削除します。
- vDSPに最大値を最初に最大に引き出すための狡猾な方法はありますか?
VDSPはわかりませんが、一般的なケースでは、通常、それらすべてを繰り返し処理して、最大のものを追跡します。
- 誰かが私にこの技術に関するいくつかの研究や文献を教えてもらえますか?
コメントであなたに与えたリンクP.私は良いもののようでした。
また、 this Webサイトでは、あらゆる種類のピッチ抽出、操作などを含む、DSPトピックの非常に詳細で、驚くほど幅広い説明が理論的および実用的な方法で提供されています。 ( this は、サイト上のインデックスへのより一般的なリンクです)。私はいつもそれに戻ってきます。途中に飛び込むと少し圧倒されることもありますが、すべての説明を基本的な構成要素に戻すことができます。
自己相関についてです。基本的にテクニックはこれです:あなたはあなたの(ウィンドウ化された)信号を取り、それを異なる量だけ時間遅延させます。元のシグナルと最もよく一致する量を見つけます。それが基本的な時期です。それは多くの理論的に意味があります。あなたはあなたの信号の繰り返しの部分を探しています。
実際には、これらすべての時間遅延信号のコピーとの相関関係をとるのは遅いです。通常、代わりに次のように実装されます(数学的に同等です)。
元の長さの2倍になるようにゼロパッドします。FFTを使用します。次に、0に設定した最初の係数を除いて、すべての係数をそれらの2乗の大きさに置き換えます。次にIFFTを取得します。すべての要素を最初の要素で割ります。これにより、自己相関が得られます。数学的には、巡回畳み込み定理(調べてください)を使用し、ゼロパディングを使用して線形畳み込み問題を巡回畳み込み問題に変換します。これは効率的に解決できます。
ただし、ピークの選択には注意してください。非常に小さな遅延の場合、信号は連続しているという理由だけで、それ自体と非常によく一致します。 (つまり、ゼロに遅らせると、それ自体と完全に相関します)代わりに、最大のピークを選択しますafter最初のゼロ交差。他の手法と同様に、自己相関関数を放物線的に補間して、はるかに正確な値を取得できます。
これ自体で、すべての基準で非常に優れたピッチ検出が可能になります。ただし、ピッチの半分と倍の問題が発生する場合があります。基本的に問題は、信号が1秒ごとに繰り返される場合、two秒ごとにも繰り返されることです。同様に、それが非常に強い倍音を持っている場合、あなたはピッチを得るかもしれません半分。したがって、最大のピークが必ずしも必要なピークであるとは限りません。この問題の解決策は、PhillipMcLeodによるMPMアルゴリズムです。アイデアはこれです:
最大のピークを選択する代わりに、考慮されるのに十分な大きさのfirstピークを選択する必要があります。ピークが考慮されるのに十分な大きさであるかどうかをどのように判断しますか?少なくともA *と同じくらい高い場合、Aは一定の最大ピークです。フィリップは、Aの値が0.9前後だと思います。実際、彼が書いたプログラムTartiniを使用すると、いくつかの異なるピッチ検出アルゴリズムをリアルタイムで比較できます。 ダウンロード それを試してみることを強くお勧めします(Cepstrum、ストレート自己相関、およびMPMを実装します):(構築に問題がある場合は、手順を試してください ここ 。
最後に注意しなければならないのは、ウィンドウ処理についてです。一般的に、どんな滑らかなウィンドウでもかまいません。ハニングウィンドウ、ハミングウィンドウなど。ウィンドウの作成方法を知っておく必要があります。より正確な時間測定が必要な場合は、ウィンドウを重ねることもお勧めします。
ちなみに、自己相関の優れた特性は、測定しているウィンドウセクションで周波数が直線的に変化している場合、ウィンドウのcenterで正しい周波数が得られることです。
もう1つ、私が説明したのはbiased自己相関関数と呼ばれるものです。これは、タイムラグが大きくなると、元の信号とタイムラグバージョンのオーバーラップがますます少なくなるためです。たとえば、N-1サンプル遅延したサイズNのウィンドウを見ると、1つのサンプルのみがオーバーラップしていることがわかります。したがって、この遅延での相関は明らかにゼロに非常に近くなります。自己相関関数の各値を重なり合うサンプルの数で割って取得することで、これを補うことができます。これはnbiased自己相関と呼ばれます。ただし、一般に、これを使用すると、結果が悪化します。自己相関の遅延値が高くなると、サンプル数が少ないため、ノイズが非常に多くなるため、重みを少なくするのが理にかなっています。
あなたがより多くの情報を探しているなら、いつものように、グーグルはあなたの友達です。優れた検索用語:自己相関、ピッチ検出、ピッチトラッキング、ピッチ抽出、ピッチ推定、ケプストラムなど。
これは、ピッチ決定に使用されるケプストラムの簡単な分析です。
まず、合成信号を調べてみましょう。
以下のプロットは、典型的な近DC成分、82.4 Hzの基本波、および82.4Hzの整数倍の8倍音を使用して合成された、合成定常状態E2ノートのケプストラムを示しています。合成正弦波は、4096個のサンプルを生成するようにプログラムされています。
12.36の顕著な非DCピークを観察します。ケプストラムの幅は1024(2番目のFFTの出力)であるため、ピークは1024/12.36 = 82.8 Hzに対応し、真の基本周波数の82.4Hzに非常に近くなります。
それでは、実際の音響信号を調べてみましょう。
以下のプロットは、実際のアコースティックギターのE2ノートのケプストラムを示しています。信号は、最初のFFTの前にウィンドウ処理されませんでした。 542.9の顕著な非DCピークを観察します。ケプストラムの幅は32768(2番目のFFTの出力)であるため、ピークは32768/542.9 = 60.4 Hzに対応し、実際の基本周波数の82.4Hzからかなり離れています。
以下のプロットは、同じ実際のアコースティックギターのE2ノートのケプストラムを示していますが、今回は、最初のFFTの前に信号がハンウィンドウ化されました。 268.46の顕著な非DCピークを観察します。ケプストラムの幅は32768(2番目のFFTの出力)であるため、ピークは32768/268.46 = 122.1 Hzに対応し、真の基本周波数の82.4Hzからさらに遠くなります。
この分析に使用されたアコースティックギターのE2ノートは、スタジオ条件下で高品質のマイクを使用して44.1 KHzでサンプリングされました。バックグラウンドノイズは基本的にゼロで、他の楽器や音声は含まれず、後処理もありません。
これは、実際の音響信号のピッチ決定にケプストラム分析を使用することの重要な課題を示しています。
参照:
実際のオーディオ信号データ、合成信号生成、プロット、FFT、およびケプストラム分析はここで行われました: 楽器のケプストラム
新しいテクニックに興味があるという既存のテクニックの何が問題になっていますか?それが目標であるならば、ケプストラムがあなたにもっと正確なピッチを与えることはないと思います。ただし、 抑制されたファンダメンタルズ で役立ちます。ケプストラムを使用して近づき、最初のFFT(元の形式のままにします)に戻って、ケプストラムがガイドするビンに狡猾なテクニックを適用できると思います。
二次近似については、Ted Knowltonが この論文 で参照しています。これは最近別のSOの質問で取り上げられましたが、私はこれを使用したことがありません。
少なくともKnowltonのリファレンスで概説されているように、2次フィット手法は、最初のFFTで長方形のウィンドウを使用することに依存していることを付け加えておきます。 Paul R 別の質問で説明されているように、オーディオ処理を行う場合は、最初のFFTでハンウィンドウまたはハミングウィンドウを使用する必要があります。したがって、全体的なアルゴリズムは次のようになると思います。
x
を取り、ウィンドウコピーw
を作成します。Sx = FFT(x)
、Sw = FFT(w)
c = Log of square magnitude of Sw
_Cx = FFT(c)
Cx
を使用して基本波(およびおそらく高調波)を推定しますSw
を使用して、基本波(または高調波)ビンで狡猾な位相トリックを実行しますSx
を使用して、基本波(または高調波)の周りに2次ビンフィットを実行します。_(or higher harmonic)
_の注記は、ファンダメンタルズを実際に抑制している場合に適用されます。
他の質問でこれについて触れましたが、ログにルックアップテーブルが必要だと思われる理由は何ですか?なぜログ関数を呼び出さないのですか? 2つのFFT(O(n * logn))にかかる時間は、他の処理よりも小さいと思います。
ケプストラム分析は準同型処理の一形態であり、Oppenheim&Schaferの著書「Discrete-TimeSignalProcessing」で説明されています。かつては、エキサイター周波数をフォーメントエンベロープから分離するのに役立つと考えられていました(多分まだそうです、dunno)。定常データのかなり長いウィンドウが与えられると、よりうまく機能するようです。
しかし、ケプストラム分析は、頻度推定の正確さを目的としたものではありません。これは実際には損失の多い形式の分析です。ただし、基本周波数のスペクトル成分が比較的弱いか、欠落している可能性がある一連の高調波から基本周波数を見つけるのに役立つ場合があります。
フェーズボコーダー分析(この手法はおそらく半世紀前から存在しているため、それほど狡猾ではありません)は、正しいピーク(必ずしも最強ではない)を選択した場合、特定のピークの周波数推定に優れています。両方のfftフレームであり、基本波はスペクトルから完全に欠落しているわけではありません。
ウィンドウ関数の変換が放物線に似ている場合は、2次補間または放物線補間が適している可能性があります。 Sinc補間は、長方形のウィンドウでより適切に機能します。
この回答は、ジェレミーサルウェンの投稿に加えて読むことを目的としており、文学に関する質問にも回答することを目的としています。
まず、信号の周期性を考慮することが重要です。信号が特定の分析ウィンドウの完全に周期的な信号に近いかどうか。
用語と数学の詳細な説明については、ここを参照してください https://en.wikipedia.org/wiki/Almost_periodic_function#Quasiperiodic_signals_in_audio_and_music_synthesis
簡単に言うと、特定の分析ウィンドウで信号が完全に周期的である場合、または信号が準周期的であり、分析ウィンドウが十分に小さいために周期性が達成される場合は、自己相関で十分です。これらの条件を満たす信号の例は次のとおりです。
これらの条件を満たすことができない信号の例は次のとおりです。
自己相関を使用したピッチ検出については、Praatでの実装方法に関するチュートリアルがあります。
この論文では、ピッチ検出にバイアスのない自己相関(Jeremy Salwenが使用する用語)を使用する方法について詳しく説明しています。また、ピッチ検出にバイアスのある自己相関よりも優れていることも示しています。自己相関の結果はウィンドウサイズの半分までしか重要ではないことに注意してくださいが、後半を計算する必要はありません。
バイアスされた自己相関は、テーパーウィンドウを使用して信号をウィンドウ処理してから自己相関を実行することによって実行されます。これにより、ピッチ検出に悪影響を与える低周波数変調(遅い時間スケールでの振幅変化)の影響が軽減されます。そうしないと、振幅が大きい部品ほど自己相関係数が大きくなり、優先されるためです。
Boersmaの論文で使用されているアルゴリズムは、次の5つのステップで説明できます。
ウィンドウは両端でゼロに向かって移動し、ウィンドウの自己相関もゼロに向かって移動することに注意することが重要です。これが、偏りのない自己相関の後半が役に立たない理由です。これは、ウィンドウの終わりに近づくゼロによる除算です。
次はYINです:-DeCheveigné、Alain、HidekiKawahara。 「YIN、音声と音楽の基本周波数推定器。」 Journal of the Acoustical Society of America 111.4(2002):1917-1930。
私が理解しているように、YINペーパーは、テーパーウィンドウの使用がピッチ検出の精度に悪影響を与えるという証拠も示しています。そして興味深いことに、テーパーウィンドウ関数を使用しないことを好みます(テーパーウィンドウは結果に改善をもたらさず、代わりにそれを複雑にするという効果をもたらします)。
最後は、Philip McLeodのSNACとWSNAC(すでにJeremy Salwenによってリンクされています)です。
それらはmiracle.otago.ac.nz/tartini/papers.htmlで見つけることができます
あまり詳しくは読んでいませんが、Boersmaで使用されている方法とは異なる、バイアスされた自己相関のテーパーウィンドウの悪影響を減らす方法として言及されています。 (私はMPMについて何も出会っていないので、それについて何も言うことができないことに注意してください)
最後の提案は、計器チューナーを作成している場合、自己相関と比較してより簡単で少し良い結果が得られる方法は、所定の周波数の純粋な正弦波信号との相互相関を使用することです。
ジェレミー・サルウェン:
つまり、関数sin(4x)+ sin(6x)+ sin(8x)+ sin(10x)をプロットしたとします。それを見ると、関数sin(2x)と同じ周波数であることがわかります。ただし、この関数にフーリエ解析を適用すると、sin(2x)に対応するビンの大きさはゼロになります。したがって、この信号には、私たちが考える周波数の正弦波が含まれていないため、「ミッシング基本周波数」があると見なされます。
与えられた信号は\ omega = 2で周期的ですが、関数sin(2x)と同じ周波数を持つことと同じではないことを主張したいと思います。フーリエ解析では、成分sin(2x)の大きさがゼロであることが示されます。これは、信号のピッチ、周波数、基本周波数の間に関係があるという点に関連していますが、それらは異なり、互換性がありません。ピッチは主観的な測定値であり、それを知覚するのは人間に依存することを覚えておくことが重要です。それはsin(2x)と同じ周波数を持っているように見えます、それは私たちがそれを視覚的に知覚する方法です。同じ効果は、ピッチとオーディオの知覚でも同様に発生します。すぐに頭に浮かんだ例はビートです。これは、周波数が近いが周波数が異なる2つの正弦波があるときに聞こえる知覚ピッチです。