音源から基本周波数を抽出しようとしています。誰かがマイクに向かって 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 高調波になると感じています。しかし、これに頼ってよいかどうかはわかりません...
非常に多くの要因があり、頭が泳いでいます。このような厄介な質問を事前にお詫び申し上げます。死後に整理できるといいですね。