32

音声信号からピッチを抽出しようとしています。

IRC の誰かが、ダブル FFT を使用してこれを実現する方法を説明してくれました。具体的には:

  1. FFTを取る
  2. 絶対値の 2 乗の対数を取る (ルックアップ テーブルで実行可能)
  3. 別のFFTを取る
  4. 絶対値をとる

vDSPを使用してこれを試みています

なぜこのテクニックを以前に知らなかったのか理解できません。私はたくさんの狩りと質問をしました。数週間分。もっと言えば、なぜそれを考えなかったのか理解できません。

vDSP ライブラリでこれを達成しようとしています。これらすべてのタスクを処理する機能を備えているようです。

ただし、最終結果の精度については疑問に思っています。

以前、単一の FFT の周波数ビンを調べて極大値を求める手法を使用しました。ピークが検出されると、狡猾な手法 (最後の FFT からの位相の変化) を使用して、ビン内の実際のピークをより正確に配置します。

ここで紹介するこの手法では、この精度が失われるのではないかと心配しています。

2 番目の FFT の後にこの手法を使用して、基本波を正確に取得できると思います。しかし、ステップ 2 で情報が失われているように見えます。

これは潜在的にトリッキーなプロセスであるため、経験のある誰かが私が行っていることを見て、正気かどうかをチェックしてもらえますか?

また、隣接するビンに二次関数を当てはめることを含む代替手法があると聞きました。これは同等の精度ですか?もしそうなら、ビンフェーズを覚える必要がないので、私はそれを支持します。

だから、質問:

  • このアプローチは理にかなっていますか?改善できますか?
  • 「対数二乗」コンポーネントが少し心配です。まさにそれを行う vDSP 関数があるようです: vDSP_vdbcon. ただし、対数テーブルを事前計算するという兆候はありません-FFT関数では、明示的な事前計算関数を呼び出して渡す必要があるため、そうではないと思います。そして、この機能はそうではありません。
  • 高調波を拾う危険性はありますか?
  • vDSP に最大値を最初に引き出させる狡猾な方法はありますか?
  • この手法に関する研究や文献を教えてくれる人はいますか?

  • 主な質問: それは十分に正確ですか? 精度を上げることはできますか?専門家から、正確さは確かに十分ではないと言われました. これは行の終わりですか?

円周率

PS タグを作成したいときにとてもイライラしますが、できません。:| 私はメンテナーにタグの試行を追跡するよう提案しましたが、無視されたことは確かです。vDSP、加速フレームワーク、ケプストラム分析用のタグが必要です

4

5 に答える 5

80

では、1 つずつ見ていきましょう。

音声信号からピッチを抽出しようとしています。

私は専門家ではなく、正式なトレーニングも最小限しか受けていませんが、この問題に対する最善の答えを知っていると思います。過去数年間、私は多くの検索、読書、実験を行ってきました。私のコンセンサスは、精度、複雑さ、ノイズの堅牢性、および速度の間のトレードオフに関して、自己相関法が群を抜いて最良のピッチ検出器であるということです。非常に特殊な状況でない限り、ほとんどの場合、自己相関を使用することをお勧めします。これについては後で詳しく説明します。その他の質問にお答えします。

あなたが説明しているのは、主に音声からピッチを抽出するために使用される方法である「ケプストラム分析」です。ケプストラム分析は、信号の倍音の豊富さと強さに完全に依存しています。たとえば、純粋な正弦波をケプストラム分析に渡すと、ひどい結果が得られます。しかし、複雑な信号である音声には、多数の倍音が存在します。(ちなみに、倍音は、基本周波数の倍数で振動している信号の要素です。つまり、私たちが知覚するピッチです)。ケプストラム分析は、基本周波数が欠落している音声を検出する際に堅牢です。つまり、関数をプロットしたとします。sin(4x)+sin(6x)+sin(8x)+sin(10x) . それを見ると、関数sin(2x)と同じ周波数を持っていることが明らかです。ただし、この関数にフーリエ解析を適用すると、sin(2x) に対応するビンのマグニチュードはゼロになります。したがって、この信号には、私たちが考える周波数の正弦波が含まれていないため、「基本周波数が欠落している」と見なされます。したがって、フーリエ変換で最大のピークを選択するだけでは、この信号では機能しません。

以前、単一の FFT の周波数ビンを調べて極大値を求める手法を使用しました。ピークが検出されると、狡猾な手法 (最後の FFT からの位相の変化) を使用して、ビン内の実際のピークをより正確に配置します。

あなたが説明しているのは、特定のパーシャルの周波数をより正確に測定するための位相ボコーダー技術です。ただし、基本周波数成分が欠落しているか弱い信号を使用する場合、最大のビンを選択する基本的な手法は問題を引き起こします。

ここで紹介するこの手法では、この精度が失われるのではないかと心配しています。

まず第一に、位相ボコーダー技術は単一の部分音の周波数をより正確に測定するだけであることを覚えておいてください。基本周波数に関するより高い部分音に含まれる情報は無視されます。次に、適切な FFT サイズが与えられれば、ピーク補間を使用して非常に高い精度を得ることができます。ここにいる他の誰かが放物線補間を指摘しています。私もこれを提案します。

データの 4098 サンプル ブロックの FFT を 44100 Hz、ピッチ約 440 Hz で放物線補間すると、40 番目 (430.66 Hz) と 41 番目 (441.430664064) ビンの間にあることになります。この論文が一般的なケースでほぼ正しいと仮定すると、放物線補間によって解像度が 1 桁以上向上すると言われています。これにより、人間の聴覚のしきい値である 1 Hz 以上の解像度が維持されます。実際、理想的なガウス ウィンドウを使用すると、放物線補間はピークで正確になります (そうです、正確です。ただし、真のガウス ウィンドウは両方向に無限に広がるため、決して使用できないことを覚えておいてください)。まだより高い精度を得ることが心配な場合は、いつでも FFT をパディングできます。これは、変換前に FFT の最後にゼロを追加することを意味します。これは、周波数が制限された信号の理想的な補間機能である「sinc補間」と同等であることがわかります。

2 番目の FFT の後にこの手法を使用して、基本波を正確に取得できると思います。しかし、ステップ 2 で情報が失われているように見えます。

それは正しいです。位相ボコーダ技術は、連続するフレームが接続され、特定の位相関係を持っているという事実に依存しています。ただし、連続するフレームの FFT の対数振幅は、位相に関して同じ関係を示さないため、この変換を 2 番目の FFT に使用しても意味がありません。

  • このアプローチは理にかなっていますか?改善できますか?

はい、はい、最後に自己相関に関する私のビットの改善について詳しく説明します。

  • 私は少し心配です そして対数二乗成分; まさにそれを行うvDSP関数があるようです:vDSP_vdbconしかし、それがログテーブルを事前計算する兆候はありません-FFT関数は明示的な事前計算関数を呼び出して渡す必要があるため、そうではないと思いますそれに。この関数はそうではありません。

vDSP ライブラリの詳細はわかりません。申し訳ありません。

  • 高調波を拾う危険性はありますか?

オリジナルのフェーズ ボコーダー ピーク ピッキング テクニックでは?はい。ケプストラム法で?いいえ、そうではありません。要点は、すべての高調波を考慮して周波数推定値を取得することです。たとえば、周波数が 1 だとしましょう。倍音は 2、3、4、5、6、7、8、9 などです。 8 など、倍音の 1 つと混同される前に基本周波数を削除します。

  • vDSP に最大値を最初に引き出させる狡猾な方法はありますか?

vDSP についてはわかりませんが、一般的なケースでは、通常、それらすべてを繰り返し処理し、最大のものを追跡します。

  • この手法に関する研究や文献を教えてくれる人はいますか?

私がコメントであなたに与えたリンク P. は、良いもののように思えました。

また、このWeb サイトでは、あらゆる種類のピッチ抽出、操作など、理論的および実践的な方法で、DSP トピックの信じられないほど詳細で驚くほど幅広い説明を提供しています。(これは、サイト上のインデックスへのより一般的なリンクです)。私はいつも自分自身がそれに戻ってくることに気づきます。途中で飛び込むと少し圧倒されることもありますが、基本的な構成要素に戻ってすべての説明をいつでもたどることができます.

次に自己相関です。基本的な手法は次のとおりです。(ウィンドウ化された) 信号を取得し、時間遅延をさまざまな量にします。元の信号に最適な量を見つけてください。それが基本的な期間です。それは多くの理論的な意味があります。信号の反復部分を探しています。

実際には、信号のこれらすべての時間遅延コピーとの相関を取るのは時間がかかります。通常、代わりに次のように実装されます (これは数学的に同等です)。

元の長さを 2 倍にするためにゼロ パディングします。FFT を実行します。次に、0 に設定した最初の係数を除いて、すべての係数を振幅の 2 乗に置き換えます。次に、IFFT を実行します。すべての要素を最初の要素で割ります。これにより、自己相関が得られます。数学的には、循環畳み込み定理(調べてください)を使用し、ゼロパディングを使用して線形畳み込み問題を循環畳み込み問題に変換します。これは効率的に解決できます。

ただし、ピークの選択には注意してください。遅延が非常に小さい場合、信号は連続的であるため、信号自体と非常によく一致します。(つまり、ゼロを遅らせると、それ自体と完全に相関します) 代わりに、最初のゼロ交差の後に最大のピークを選択します。他の手法と同様に、自己相関関数を放物線補間して、より正確な値を得ることができます。

これだけでも、すべての基準で非常に優れたピッチ検出が得られます。ただし、ピッチが半分になったり、ピッチが 2 倍になったりすると、問題が発生することがあります。基本的に問題は、信号が 1 秒ごとに繰り返される場合、2秒ごとにも繰り返されることです。同様に、倍音が非常に強い場合、ピッチが半分になることがあります。そのため、最大のピークが必ずしも希望どおりになるとは限りません。この問題の解決策は、Phillip McLeod による MPM アルゴリズムです。アイデアは次のとおりです。

最大のピークを選択する代わりに、考慮するのに十分な大きさの最初のピークを選択します。ピークが考慮に値するほど大きいかどうかをどのように判断しますか? それが少なくともA*最大ピークと同じくらい高い場合、Aは定数です。Phillip は A の値を約 0.9 と提案しています。実際、彼が書いたプログラム、Tartini を使用すると、いくつかの異なるピッチ検出アルゴリズムをリアルタイムで比較できます。ダウンロードして試してみることを強くお勧めします(Cepstrum、直線自己相関、MPM を実装しています): (ビルドに問題がある場合は、こちらの手順を試してください.

最後に注意すべきことは、ウィンドウ処理についてです。一般に、滑らかなウィンドウであれば問題ありません。ハニング ウィンドウ、ハミング ウィンドウなど。より正確な時間測定が必要な場合は、ウィンドウを重ねることもお勧めします。

ところで、自己相関の優れた特性は、周波数が測定中のウィンドウ領域で直線的に変化している場合、ウィンドウの中心で正しい周波数が得られることです。

もう 1 つ: 私が説明したのは、偏った自己相関関数と呼ばれるものです。これは、タイム ラグが大きいほど、元の信号とタイム ラグ バージョンのオーバーラップが少なくなるためです。たとえば、N-1 サンプル遅延されたサイズ N のウィンドウを見ると、1 つのサンプルだけが重なっていることがわかります。したがって、この遅延での相関は明らかにゼロに非常に近くなります。これを補正するには、自己相関関数の各値をサンプルのオーバーラップ数で除算して取得します。これは不偏自己相関と呼ばれます。ただし、一般に、自己相関の遅延値が大きいほどノイズが多くなり、少数のサンプルのみに基づいているため、これを使用すると悪い結果が得られます。

いつものように、より多くの情報を探しているなら、グーグルはあなたの友達です. 適切な検索用語: 自己相関、ピッチ検出、ピッチ追跡、ピッチ抽出、ピッチ推定、ケプストラムなど。

于 2011-08-27T00:16:59.983 に答える
8

これは、ピッチ決定に使用されるケプストラムの簡単な分析です。

まず、合成信号を調べてみましょう。

以下のプロットは、典型的な近 DC コンポーネント、82.4 Hz の基本波、および 82.4 Hz の整数倍の 8 つの高調波を使用して合成された合成定常状態 E2 ノートのケプストラムを示しています。合成正弦波は、4096 サンプルを生成するようにプログラムされました。

12.36 で顕著な非 DC ピークを観察します。ケプストラム幅は 1024 (2 番目の FFT の出力) であるため、ピークは 1024/12.36 = 82.8 Hz に対応し、これは真の基本周波数である 82.4 Hz に非常に近い値です。

合成 E2 ノートのケプストラム

それでは、実際の音響信号を調べてみましょう。

以下のプロットは、実際のアコースティック ギターの E2 ノートのケプストラムを示しています。信号は、最初の FFT の前にウィンドウ処理されませんでした。542.9 で顕著な非 DC ピークを観察します。ケプストラム幅は 32768 (2 番目の FFT の出力) であるため、ピークは 32768/542.9 = 60.4 Hz に対応し、これは真の基本周波数である 82.4 Hz からかなり離れています。

アコースティック ギターの E2 ノートのケプストラム、窓なし

以下のプロットは、同じ本物のアコースティック ギターの E2 ノートのケプストラムを示していますが、今回の信号は最初の FFT の前にハン ウィンドウ処理されています。268.46 で顕著な非 DC ピークを観察します。ケプストラム幅は 32768 (2 番目の FFT の出力) であるため、ピークは 32768/268.46 = 122.1 Hz に対応し、これは真の基本周波数である 82.4 Hz からさらに離れています。

アコースティック ギター E2 ノートのケプストラム、ハン ウィンドウ

この分析に使用されたアコースティック ギターの E2 ノートは、スタジオ条件下で高品質のマイクを使用して 44.1 KHz でサンプリングされました。バックグラウンド ノイズは基本的にゼロで、他の楽器や声は含まれておらず、後処理もありません。

これは、実際の音響信号のピッチ決定にケプストラル分析を使用することの重要な課題を示しています。

参考文献:

実際のオーディオ信号データ、合成信号生成、プロット、FFT、およびケプストラム分析は、ここで行われました:楽器のケプストラム

于 2013-02-13T08:02:10.783 に答える
5

新しい技術に興味があるのに、既存の技術の何が問題になっていますか? それが目標であれば、ケプストラムがより正確なピッチを提供するとは思いません。ただし、抑制されたファンダメンタルズには役立ちます。ケプストラムを使用して接近し、最初の 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基本波 (または高調波) の周りで二次ビン フィットを実行するために使用します。

この(or higher harmonic)注記は、実際にファンダメンタルズを抑制している場合に適用されます。

他の質問でこれについて言及しましたが、ログにルックアップ テーブルが必要だと考える理由は何ですか? ログ関数を呼び出さないのはなぜですか? 2 つの FFT (O(n*logn)) にかかる時間は、実行できる他の処理よりも小さいと思います。

于 2011-01-03T12:00:35.180 に答える
4

ケプストラム分析は、Oppenheim & Schafer による書籍「Discrete-Time Signal Processing」で説明されている準同型処理の形式です。フォーメント エンベロープからエキサイター周波数を分離するのに役立つと考えられていました (今でもそうかもしれませんが)。定常データのかなり長いウィンドウを指定すると、よりうまく機能するようです。

ただし、ケプストラム分析は、周波数推定の精度を目的としたものではありません。それは実際には損失の多い形式の分析です。しかし、基本周波数のスペクトル成分が比較的弱いか、欠落している可能性がある一連の高調波から基本周波数を見つけるのに役立つ場合があります。

位相ボコーダー分析 (技術はおそらく半世紀前から存在しているため、それほど狡猾ではありません) は、特定のピークの周波数推定に優れています。正しいピーク (必ずしも最強のピークであるとは限りません) を選択すると仮定すると、ピーク スペクトルは全体にわたって定常的です。両方の fft フレームであり、基本波がスペクトルから完全に欠落しているわけではありません。

ウィンドウ関数の変換が放物線に似ている場合は、二次補間または放物線補間が適している可能性があります。sinc 補間は、長方形のウィンドウでうまく機能します。

于 2011-01-04T02:06:30.537 に答える