????????周期信號的基頻估計(fundamental frequency estimation)在許多應用中都起著重要的作用辛孵,例如:在漢語語音識別中议谷,由于不同的聲調(diào)對應不同的字詞,所以音高是非常重要的特征弯囊,另外在識別說話人情感的時候氢拥,說話的語調(diào)也含有顯著的情緒傾向;還有在數(shù)字音樂應用中暂刘,包括樂譜轉(zhuǎn)錄饺谬、哼唱識別、K歌軟件等中都有用武之地鸳惯。
????????音高識別算法非常之多商蕴,包括在近些年發(fā)展起來的深度學習領域中也出現(xiàn)了音高估計模型的身影,下面介紹一下比較通用的YIN算法芝发,并羅列出用于閱讀代碼的主要幾大步驟绪商,并增加一些個人演算;更詳細的見大佬的原論文《YIN, a fundamental frequency estimator for speech and music》辅鲸。進一步格郁,工程中可以使用更加穩(wěn)定的probabilisitc YIN算法,我們將在以后的文章進行介紹独悴。
第一步:自相關函數(shù)和差函數(shù)
????????若信號有周期例书,則將信號在時間軸上平移一個周期將與自身重合。因而自相關函數(shù)(見下式)(autocorrelation function)將在周期的整倍數(shù)時刻取最大值刻炒,因而自相關函數(shù)顯然可以用來做基頻估計决采。
其中:是執(zhí)行一次自相關運算的窗口大小坟奥;
是時域信號树瞭。
? ? ? ? 自相關函數(shù)用來估計基頻的方法是,窮舉一定范圍內(nèi)所有的值爱谁,并且挑選最高的非零
作為基本周期晒喷。換言之,自相關方法傾向于挑選較大的周期访敌,即傾向于較小的基頻凉敲。當
的取值上限較大時,很容易發(fā)生低估基頻的錯誤寺旺。
????????還有一種自相關函數(shù)的定義:
? ? ? ? 該定義中爷抓,隨著的增加,被加項越來越少阻塑,將會形成振幅逐漸衰減的自相關函數(shù)形狀蓝撇。因而在新的定義中,盡管
有較大的取值上界叮姑,理論上也不會容易出現(xiàn)低估基頻的錯誤唉地。但是當
的取值下限足夠接近0時,由于
振幅逐漸衰減的性質(zhì)传透,會傾向選擇接近0的基本周期耘沼,因而容易造成高估基頻的錯誤。
? ? ? ? 該論文首先就提出了若干論點朱盐,說明自相關函數(shù)在實際應用中不如新提出來的差函數(shù)(difference function)好用群嗤,其為:
? ? ? ? 換成差函數(shù)后,基本周期是使得該函數(shù)取最小值的那個值兵琳。并且差函數(shù)和自相關函數(shù)之間有如下關系:(其中狂秘,對中間的那個式子做個簡單的變量變換就可以了)
此時,若為常量躯肌,則最大化
就等價于最小化
者春。但是其中
這一項是和
有關的項,所以這兩個準則的確會導致不同的估計清女。僅僅由于這一個改變就在測試數(shù)據(jù)上钱烟,將誤差從10%降低到了1.95%。作者給的解釋是自相關函數(shù)對信號的幅度變化非常敏感嫡丙;當信號振幅隨著時間增大時拴袭,自相關函數(shù)在基本周期的一定范圍內(nèi)的倍數(shù)時刻
的值會呈現(xiàn)增加的現(xiàn)象,因此由于自相關函數(shù)選擇最大周期對應的那個頻率作為識別的基礎頻率曙博,因此會高估基本周期拥刻,從而出現(xiàn)低估基礎頻率的錯誤。
? ? ? ? 而作者提出的差函數(shù)并沒有這類問題父泳,因為可以想象一下一個正弦函數(shù)的周期保持不變般哼,但是幅度變化,但是不管是逐漸變小還是逐漸變大尘吗,都是在平移一個基本周期時出現(xiàn)的差函數(shù)低洼比其他更大周期出現(xiàn)的差函數(shù)低洼更低逝她,甚至當振幅忽高忽低時,由于信號的規(guī)律性睬捶,差函數(shù)會在所有的上都變大黔宛,所以對變化的振幅會不那么敏感。
第二步:累計均值規(guī)范化差函數(shù)
? ? ? ? 直接使用差函數(shù)會出現(xiàn)兩個問題:1)和自相關函數(shù)類似擒贸,由于差函數(shù)仍然在為0的時候給出最小值0臀晃,并且由于實際音頻數(shù)據(jù)不是完美周期性,導致差函數(shù)在真實的基本周期處的取值仍然小于在0處的取值介劫,我們可以通過設置一個基本周期的取值下限還改善該問題徽惋。2)當在第一共振峰(first formant)處出現(xiàn)一個較強的共振,仍然會在2倍基頻處(即1/2倍基本周期處)出現(xiàn)一些次級的低洼座韵,這些次級低洼可能比基本周期對應的低洼還要更低险绘;而對于這第二個問題踢京,并不能通過增加一個取值下限來改善,因為基本周期
和第一共振峰
的取值范圍是重合的宦棺。所以作者進一步提出了“累計均值規(guī)范化差函數(shù)”(cumulative mean normalised difference function)瓣距,如下式所示。
? ? ? ? 直接設置差函數(shù)在0處取1代咸,并且用直到時刻的差函數(shù)相應取值的均值(累積均值)來規(guī)范化蹈丸;可以想象,當信號原始的差函數(shù)在低于基本周期的地方出現(xiàn)更深的次級低洼時呐芥,累積均值同樣也會很小逻杖,因而除以很小的數(shù)相當于放大原始的差函數(shù)的值,因而更好地降低次級共振峰引起的錯誤率思瘟。并且直到
達到真正的基本周期處出現(xiàn)很深的低洼荸百。見下圖,圖a)是原始的差函數(shù)形狀滨攻,圖b)是均值規(guī)范化后的管搪。新的差函數(shù)顯然可以抑制低估周期(高估基頻)的現(xiàn)象,并且新的差函數(shù)并不需要設置顯式的基頻上限铡买。
第三步:絕對閾值
? ? ? ? 實際應用中很容易出現(xiàn)差函數(shù)在更大的上出現(xiàn)更深的低洼更鲁,例如上圖b),若圖中第二個很深的低洼處于候選區(qū)域內(nèi)奇钞,則很容易選擇第二個低洼對應的基頻澡为,而出現(xiàn)低估基頻的錯誤。為了應對這個問題景埃,我們可以考慮設置一個絕對的閾值(如圖中虛線)媒至,找到候選區(qū)域內(nèi)所有低于虛線的那些低洼所對應的頻率,將最小的
對應的頻率(更高的頻率)作為基頻返回谷徙;而我們之所以可以放心地這么做拒啰,是因為在上一步我們用“均值規(guī)范化差函數(shù)”大大降低了高估基頻的錯誤。但是因為閾值是固定的完慧,一旦在閾值下方?jīng)]有找到仍和候選值谋旦,則算法直接返回全局的最小值。
? ? ? ? 通過閾值屈尼,作者將測試數(shù)據(jù)上的錯誤率從1.69%降低到0.78%册着;大大降低了低估錯誤率,僅僅輕微地增加了高估錯誤率脾歧,而這是很容易理解并接受的甲捏。那么如何選擇該閾值呢?作者給了閾值的意義一個解釋:“一個近似周期信號功率中的非周期性功率所占的比例”鞭执。作者給出了下面的恒等式:
? ? ? ? 等式左邊可以近似視為信號的功率司顿;而右邊作為信號功率的兩部分芒粹,第二部分可以用來度量信號的非周期性:顯然若信號是周期的,并且基本周期為大溜,那么該項為0是辕,表示信號是完全周期的;當其非零時猎提,度量了非周期性強弱;并且若再疊加一個周期為
的完美周期信號旁蔼,則顯然不會改變第二項的取值锨苏;因而第二項的確是度量周期信號中非周期性的部分功率。為了看清“絕對閾值”對應物理上的非周期性功率和總功率之比率的解釋棺聊,在
時我們做一個簡單的推理:“累積均值規(guī)范化差函數(shù)”的分子項為:
伞租,而分母項為:
其中第三項中的表示近似周期函數(shù)在一個周期內(nèi)積分,其結(jié)果可以近似視為0限佩,所以第三項可以忽略。所以只剩下
兩項晕城,設
為信號的平均功率豌熄,則可將第2項近似為:
囱持,第1項近似為:
晴弃;所以:
????????這是一個信號的非周期性功率與信號的平均功率的比率形式世曾,但是我這里推導的分母是1/2的平均功率萧锉,而不是論文里說的2倍的平均功率禀崖,所以是作者的1/4。我暫時沒有繼續(xù)推敲了不恭,不過這的確是作者所述的功率比率形式叶雹,這說明了絕對閾值的物理意義。
? ? ? ? 所以對這部分總結(jié)一下就是:“累計均值歸一化差函數(shù)”的閾值對應的是信號的非周期性程度换吧,我們的目的是估計周期信號的基頻折晦,所以當我們將其設置為很小的值時,我們就是期望信號是周期信號的置信度很高沾瓦,因而我們對我們估計出來的基頻抱有較大的信心满着。
第四步:拋物線插值
? ? ? ? 若信號的基本周期是剛好是采樣周期的整數(shù)倍,則我們使用前面的方法找到正確的差函數(shù)低洼贯莺,對應的就是正確的基頻风喇。但是一般不會滿足這個條件,所以使用樣本序列在時域進行基頻估計顯然是不準確的缕探,因此作者提出了拋物線插值:在函數(shù)的每個極小值點魂莫,使用左右兩個相鄰點加上極小值點本身三個點進行拋物線插值,將插值得到的拋物線的最小值對應的橫坐標作為候選者放到最后的基頻選擇列表里爹耗。
????????事實上耙考,由于使用了“累積均值規(guī)范化差函數(shù)”谜喊,而規(guī)范化后的差函數(shù)和原始的差函數(shù)對極小值點橫坐標的估計有一定的偏差。所以倦始,實際會使用原始的差函數(shù)對應的三點進行插值斗遏。
? ? ? ? 設是無周期的離散時間信號,
為其傅立葉變換鞋邑,且
為周期
的周期函數(shù)诵次。所以信號
的功率譜的傅立葉變換為:
其中,利用了為實數(shù)序列枚碗,并交換了積分和求和次序逾一。
????????所以我們得到了功率譜密度的傅立葉變換是信號的自相關函數(shù)
,并且再次利用實信號性質(zhì)视译,得到
,所以功率譜密度函數(shù)是偶函數(shù)归敬,因而其傅立葉變換中正弦變換部分消失了酷含,又假設
是帶限的,所以功率譜密度的傅立葉變換僅由一組余弦函數(shù)就能表達汪茧。
????????又每個余弦函數(shù)的在0點的泰勒展開式僅僅包括偶次項椅亚,即常數(shù)項、二次項舱污、4次項等等呀舔,所以總體上在0點可以由一組偶次項的多項式函數(shù)級數(shù)來表示。進一步扩灯,而4次以上的多項式多半來自于信號中的高頻部分媚赖,所以若假設信號中的高頻部分很弱,則可以近似用0次項和2次項就可以近似
對應的實數(shù)函數(shù)在0點的形狀珠插,即可以用拋物線來進行插值惧磺。
一些證明
????????下面證明幾個閱讀源碼時使用傅立葉變換進行加速的證明
1. 設是實數(shù)信號,
捻撑,(其中
表示傅立葉變換磨隘,
表示逆序信號)
2. 對任意N維信號,則
顾患。
因而可知的傅立葉逆變換是
番捂,所以可以分別先用傅立葉正變換求出
和
,計算復雜度為
江解,再執(zhí)行線性復雜度的復數(shù)乘法设预,最后再執(zhí)行復雜度為
的傅立葉逆變換,總體上計算復雜度為
犁河,當n足夠大時絮缅,速度將遠遠快于直接計算相關函數(shù)
的
的復雜度鲁沥。