17

音源から基本周波数を抽出しようとしています。誰かがマイクに向かって A3 を歌っているかもしれないので、〜 110Hz を検出したい

私のアプローチは次のとおりです。

  • FFT 1024 フロート
  • 各ビンの位相を使用して、その正確な周波数を正確に決定します
  • ピークを決定する (通常は 50 程度)
  • 大きい順に並べる

(ピーク[0].パワー=1063.343750、.freq=2032.715088
(ピーク[1].パワー=1047.764893、.freq=3070.605225
(ピーク[2].パワー=1014.986877、.freq=5925.878418
(ピーク[3].パワー= 1011.707825、.freq=6963.769043
(ピーク[4].パワー=1009.152954、.freq=4022.363037
(ピーク[5].パワー=995.199585、.freq=4974.120605 (
ピーク[6].パワー=987.2437.
[7].power=533.514832, .freq=908.691833

  • (MARKER1) 最も大きなものから始めて、それを残りのすべてのピークと照合します。したがって、N 個のピークがある場合、この時点で N-1 個のピーク ペアを持つことになります。
  • 各ピークペアの高調波を調べます。つまり、分数 a/b にどれだけ近いか、つまり |peakA.freq/peakB.freq - a/b| となるような b<20 の a/b を見つけることができるか。< 0.01 (これは 20 番目までの高調波に一致します)
  • これで、互いに調和していると見なされるピークの洗練されたリストができました

    高調波 PeakPair: (0,1)=2/3、エラー:0.00468 => f0 @ 1019.946289
    高調波 PeakPair: (0,2)=1/3、エラー:0.00969 => f0 @ 2004.003906
    高調波 PeakPair: (0,3) =2/7、エラー:0.00618 => f0 @ 1005.590820
    高調波ピークペア: (0,4)=1/2、エラー:0.00535 => f0 @ 2021.948242
    高調波ピークペア: (0,5)=2/5、エラー:0.00866 => f0 @ 1005.590820
    高調波ピークペア: (0,6)=1/4、エラー:0.00133 => f0 @ 2027.331543
    高調波ピークペア: (0,7)=9/4、エラー:0.01303 => f0 @ 226.515106

私の質問は、上記の基本波を ~1000Hz として正しく識別するアルゴリズムをどのように考案できるでしょうか?

~2000 や ~3000 よりも ~1000 に高い値が集中することは決して保証されません。 ~1000 のエントリがあることさえ保証されません。~5000 x 1 エントリ、~4000 x 3 エントリ、~3000 x 2 エントリ、および上記のリストの 226 のようにいくつかの偽の値が浮かぶ可能性があります。

リストの残りの部分と「調和」していない提案されたファンダメンタルズを除外して、手順をもう一度繰り返すことができると思います。これにより、少なくとも偽の値が取り除かれます...

正しい質問をしていないのかもしれません。たぶん、このアプローチ全体が最悪です。しかし、最も強いピークを選び、そのピークに関連する一連の高調波を抽出することは理にかなっていると思います。

理論的には、比率の負荷を生成する必要があります。たとえば、元の最強のピークが 3 番目の高調波であった場合、この一連のピークには 3/1 3/2 3/3 3/4 3/5 3/6 3/7 などを含める必要があります。 ...一部欠落している場合がありますが。

現実的には、最大の強さを持つのは常に基本波か第 1 高調波になると感じています。しかし、これに頼ってよいかどうかはわかりません...

非常に多くの要因があり、頭が泳いでいます。このような厄介な質問を事前にお詫び申し上げます。死後に整理できるといいですね。

4

3 に答える 3

9

ケプストラム(またはケプストラム分析)とハーモニックプロダクトスペクトルは、倍音列からエキサイター周波数を推定する2つのよく研究されたアルゴリズムです。

倍音のシーケンスが適切な間隔で配置されている場合、ケプストラム(FFTピークの対数のFFT)は、周波数間隔の周期を推定するのに役立つ場合があります。これを使用して、周波数を推定できます。

Harmonic Product Spectrumは、基本的に、スペクトルを複数の低整数比でデシメートし、それらをオーバーラップさせることにより、スペクトルピークをそれ自体のn番目の複数のコピーと比較します。

于 2011-01-19T04:27:50.967 に答える
2

次のリンクから、音声認識に関する記事に移動できます。

記事:音声認識のための位相空間点分布パラメーター(全文を読むには購読が必要です)

于 2011-11-21T13:40:01.667 に答える
1

私は質問を言い換えて、ここで答えを提供しました: {301,102,99,202,198,103} のような一連の数字を取り入れて ~100 を捨てる方法は?

私はいくつかのアプローチを見てきましたが、これは私が見つけた他のどのアプローチよりもかなり簡潔です。私はそれをテストしましたが、非常にうまく機能します。

于 2011-02-01T05:14:19.543 に答える