[英]Algorithm to determine fundamental frequency from potential harmonics
我試圖從聲源中提取基頻。 也許有人在麥克風上唱A3,所以我想要檢測~110Hz
我的方法是:
(峰值[0] .power = 1063.343750,.freq = 2032.715088
(峰值[1] .power = 1047.764893,.freq = 3070.605225
(峰值[2] .power = 1014.986877,.freq = 5925.878418
(峰值[3] .power = 1011.707825,.freq = 6963.769043
(峰值[4] .power = 1009.152954,.freq = 4022.363037
(峰值[5] .power = 995.199585,.freq = 4974.120605
(峰值[6] .power = 987.243713,.freq = 8087.792480
(峰值[7] .power = 533.514832,.freq = 908.691833
我們現在有一個精確的峰值列表,這些峰值被認為是彼此諧波的
Harmonic PeakPair:(0,1)= 2/3,錯誤:0.00468 => f0 @ 1019.946289
Harmonic PeakPair:(0,2)= 1/3,錯誤:0.00969 => f0 @ 2004.003906
Harmonic PeakPair:(0,3)= 2/7,錯誤:0.00618 => f0 @ 1005.590820
Harmonic PeakPair:(0,4)= 1/2,錯誤:0.00535 => f0 @ 2021.948242
Harmonic PeakPair:(0,5)= 2/5,錯誤:0.00866 => f0 @ 1005.590820
Harmonic PeakPair:(0,6)= 1/4,錯誤:0.00133 => f0 @ 2027.331543
Harmonic PeakPair:(0,7)= 9/4,錯誤:0.01303 => f0 @ 226.515106
我的問題是:如何設計一種能夠正確識別上述基波的算法~1000Hz?
絕不保證在~1000處的值集中度高於~2000或~3000等。甚至不能保證任何進入~1000。 我們可以有~5000 x一個條目,~4000 x三個條目,~3000 x 2條目,以及漂浮的幾個虛假值,如上面列表中的226。
我想我可以再次重復這個過程,淘汰與列表其余部分不“諧波”的建議基礎。 這至少可以擺脫假的價值......
可能我甚至沒有問正確的問題。 也許這整個方法很糟糕。 但我認為選擇最強峰並提取與該峰相關的一組諧波是有意義的。
在理論上應該產生一定比例的負載,比如說原始最強峰值是三次諧波,那么這組峰值應該包含3/1 3/2 3/3 3/4 3/5 3/6 3/7等......雖然有些人可能會失蹤。
實際上,我有一種感覺,它總是要么是基礎的,要么是具有最大力量的一次諧波。 但我不知道我是否可以依靠這個......
這么多因素,它讓我的頭腦游泳。 我提前為這樣一個混亂的問題道歉。 希望我可以在死后收拾它。
Cepstum(或倒譜分析)和諧波產品譜是兩種經過充分研究的算法,可以估算泛音系列的激勵頻率。
如果泛音序列被適當地間隔,則倒譜(FFT峰的對數的FFT)可用於估計頻率間隔的周期,然后可用於估計頻率。
諧波產品譜基本上通過用多個低整數比率抽取光譜並將它們重疊來比較光譜峰值與它們自身的第n個多個拷貝。
您可以通過以下鏈接查看有關語音識別的文章。
文章: 語音識別的相空間點分配參數(全文需要訂閱)
我已經改寫了這個問題,並在這里提供了一個答案: 如何接受一組數字,如{301,102,99,202,198,103}並扔掉~100?
我看過幾種方法,這比我發現的任何其他方法都簡潔得多。 我測試過它並且效果很好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.