比如說有一段演奏小星星的聲音,它的波形其實並不是週期函數,但是每一瞬間能視作有周期性的,所以我們能聽見它的音高是 1155665,也能算出它每一瞬間的頻率;但是如果頻率是連續變化的,比如說從 220Hz 均勻變化到 440Hz,應該怎麼得出每一瞬間的瞬時頻率呢?

更進一步地,可以做瞬時傅裏葉變換嗎?


看原音頻的特點吧,想當然地提供些思路:

  1. 如果成分單一、泛音很少,比如就是較理想的正弦波形,可以直接用希爾伯特變換獲得瞬時頻率;
  2. 如果是樂器的錄音(有豐富的泛音),且雜訊很小,可以先用一個濾波器把基頻提取出來(可以在DAW裏畫個envelope,實現變頻率的濾波器),再用希爾伯特變換;
  3. 如果雜訊比較大,那就得用時頻域分析方法了,如STFT和WT(短時傅裏葉和小波),但它們過於傳統,在這種頻率較稀疏的場景下有更好的方法:可以用Synchrosqueezed Wavelet Transform(同步壓縮小波變換)獲得比較精確的瞬時頻率。已經有人寫出了開箱即用的matlab代碼:Time-frequency representations (lancs.ac.uk)

問題拓展:瞬時頻率的求取

這裡多扯幾句小想法。在一片混雜的原信號裏提取單一成分並求瞬時頻率,是個很有工程意義的問題,在信號降噪、模態提取、顫振預測、故障診斷上都有應用。傳統的STFT和WT的思路是用統一的方法對整個頻率範圍做分析(本質上都是用一組不同尺度的基與不同時間的原信號求內積,獲得係數矩陣),自然會遇到測不準原理的限制,出現解析度不足的問題。

比較直接的解決方案是,分為兩步:①把每一個成分先提取出來,②逐個求瞬時頻率和瞬時幅值。即,「先分解、再分析」。但是在分解提取各成分時會遇到以下幾個問題:

  1. 每個成分的頻率都可能是時變的,比如小提琴會揉弦,機器的轉速有波動。而演算法並不知道原信號每一個成分都是怎麼變的;
  2. 兩個成分的頻率可能靠的很近,受採樣頻率的限制,演算法從原理上可能就分辨不出這兩個成分;成分之間的頻率可能會有交叉,在交叉點也會出現類似的問題;
  3. 巨大且頻域分佈均勻的雜訊

所以成分提取的方法需要有幾個特點:①一定的自適應性,允許每一成分有頻率波動;②較好的分辯能力,不至於分量間交叉後就糊成一片;③一定的雜訊魯棒性。

提取成分有兩大類方案:時域裏提取和頻域裏提取。

時域提取

時域裏提取方案的代表有大名鼎鼎的EMD(經驗模態分解)[1],它的思路比較直觀:求原信號的上下包絡線(並保證一定的平滑性),再求上下包絡線的中值,作為一個分量從原信號中減去,並不斷重複整個過程。相當於用一個很模糊的標準將不同頻域尺度的分量分離開來,故演算法名中有「經驗」二字。其所得的結果是一個個分量的時域信號,因為它們成分足夠單一,可以直接用希爾伯特變換求瞬時頻率和瞬時幅值了,所以這種方案也叫HHT(希爾伯特-黃變換)。

可想而知,如果原信號的分量在頻域上是較為稀疏的(比如機械振動),這個方法會很好用。但也有很多問題,比如端點延拓(信號較短,生成包絡線的時候會在端點處產生巨大的失真),比如模態混疊(因為分離標準過於模糊,所以一些瞬時高頻信號會出現在低頻分量裏)。另外,很多人還會嫌棄EMD沒有很好的數學根基。

頻域提取

代表方案是Synchrosqueeze Wavelet Transform(同步壓縮變換)[2]。SSWT是發明小波變換的Daubechies在2011年發表的時頻域分析方法(其實在2000年她就提出了思路)。SSWT也是「先分解、再分析」的思路,不過是從頻域進行了分解操作。

SSWT先假設原信號在頻域上有一定的稀疏性,且每一個成分的頻率變化與幅值變化滿足一定要求,在這些條件成立的情況下,就可以做以下操作了:先求小波變換;從小波係數矩陣的基礎上求出每一個分量的瞬時頻率;把瞬時頻率附近的能量聚集到瞬時頻率上。

這種看似簡單粗暴的方法效果非常好,而且數學基礎搭建得比較完善。對比下小波和SSWT的結果:

小波

SSWT

BTW,濟大的於剛老師在這個方向上做了很多拓展工作(SET[3]與MSST[4]),而且提供了matlab代碼,值得關注。

參考

  1. ^Huang N E, Shen Z, Long S R, et al. The empirical mode decomposition and the hilbert spectrum for non - linear and non - stationary time series analysis [J]. Proceedings of the Royal Society, 1998, 454(1971):903-995
  2. ^Daubechies, I., et al. (2011). "Synchrosqueezed wavelet transforms: An empirical mode decomposition-like tool." Applied and Computational Harmonic Analysis 30(2): 243-261
  3. ^Yu, G., et al. (2017). "Synchroextracting Transform." IEEE Transactions on Industrial Electronics 64(10): 8042-8054.
  4. ^Yu, G., et al. (2019). "Multisynchrosqueezing Transform." IEEE Transactions on Industrial Electronics 66(7): 5441-5455.


針對題主的問題

可以做STFT,而且在滿足一些假設的情況下可以完美還原瞬時頻率。然而事實上這些假設並不容易滿足,因為一是錄來的音頻信號並不太乾淨,二是可能相位雜訊很強,因此常常會遇到問題。

工程界解決的主要是魯棒性的問題。

對於相位雜訊不是很強的錄音

一般清澈的歌聲、指板按到位的吉他、鋼琴之類的錄音都屬於這種情況。

目前工程界常用方法有很多,只要錄音不是很嘈雜,這些演算法效果都不錯的.

一、基於Autocorrelation的方法(比如Yin[1])。

二、基於Cancellation的方法(比如YANGsaf[2])。

三、基於STFT並考慮諧波的方法(比如SRS)。

對於相位雜訊很強的錄音

比如黑嗓、死嗓等嘶吼類的唱法,或者說話唱歌時嗓子啞了,就屬於這種情況。如果嗓子啞的太嚴重,這種情況沒有太好的辦法,試試神經網路吧。

最後

如果題主是語音信號處理小白,想簡單瞭解基礎知識可以看看我已經咕了的專欄:

言葉之箱?

www.zhihu.com圖標

具體演算法實現可以參考我寫的一個演算法垃圾堆:

tuxzz/revoice?

github.com圖標

最後之後是針對其他答主回答中的一些問題所提出的一些專業內容

其實一部分答主例如 @DoubleBiao 的其實過分「通用」了,而一部分答主例如 @V777的方法並不常用於音樂。

針對說需要無限短窗口的答主

簡單說下結論:如果信噪比還不錯,而且原信號切片後能夠被看作線性掃頻的話,第一沒必要無限短的窗口,第二是沒必要用小波變換一類複雜的變換。乾淨的樂器錄音或者人聲錄音是符合第一點,而且只要切片不是過分大(10ms以下通常都沒問題),也是符合第二點的。

第一種情況,假設信號是正弦信號,頻率為線性掃頻,且信噪比無窮大,只要兩個採樣點,通過相位差就能直接求出準確的頻率。

進一步假設信號是諧波信號,其基頻為線性掃頻,且信噪比無窮大,至少需要 [公式] 那麼長的窗做FFT,通過補零找峯就能完美求出瞬時頻率。其中, [公式]是窗的Equivalent Noise Bandwidth。因為在這個窗長度以上就可以完美地分辨出各個諧波分量了。

再進一步假設信號信噪比並非無窮大,雜訊是積分為常數的隨機雜訊,這種情況可以簡單通過增長窗口長度來增加精度。如果願意的話,之後還可以用卡爾曼濾波一類的方式來增加魯棒性。

再進一步假設信號信噪比並非無窮大,雜訊還包括週期性雜訊,這時候可以通過一開始說的三大類考慮諧波成分的方法來解決。

針對說需要小波變換或者其他奇怪變換的答主

什麼變換都無法超越測不準原理的魔爪,對於切片後可近似成線性調頻的信號(比如音樂信號),其他變換對比DFT家族在實際應用中表現並沒有任何亮點,而且運行還慢

當然,抽取諧波用CZT會更快,這個是例外。


利益相關:興趣使然的歌聲/音樂信號處理工程師。

參考

  1. ^De Cheveigné, Alain, and Hideki Kawahara. "YIN, a fundamental frequency estimator for speech and music." The Journal of the Acoustical Society of America 111.4 (2002): 1917-1930. http://audition.ens.fr/adc/pdf/2002_JASA_YIN.pdf
  2. ^Kawahara, H., Y. Agiomyrgiannakis, and H. Zen. "YANG vocoder, Google." https://github.com/google/yang_vocoder


時頻分析,短時傅立葉變換,或者小波,但這些變換都要取一段時間計算,我想你真正需要的可能是Hilbert-huang變換,可以求你需要的瞬時頻率。


難道不應該是HT希爾伯特變換嗎?或者更嚴格些的HHT。

建議搜索瞭解一下


一般來說使用短時傅裏葉變換就可以做到。這個技術的想法大概是把音頻裁成一段段時間超短的小音頻,然後對每段分別做傅裏葉變換。

當小音頻的時間段足夠短的時候,傅裏葉變換的結果就可以當作那個時刻的瞬時頻率了。更加準確的說,應該是每次傅裏葉變換的主瓣頻率視為瞬時頻率。

這個和高中物理那個由平均速度到瞬時速度的思想是一致的:當時間跨度無限短,平均值就可以表示瞬時值。但對信號頻率來說,有個區別:頻譜分析有一個理論上的解析度極限。通俗說就是,無法同時保證時間跨度足夠短,頻率足夠精準(對,就是海森伯測不準原理的信號分析版本)。準確表述可以參考 維基百科Gabor limit

由於時間跨度和精度這對trade off存在,所以衍生了一系列更高端的可以自適應的處理這對trade off的演算法. This is one of the reasons for the creation of thewavelet transformandmultiresolution analysis, which can give good time resolution for high-frequency events and good frequency resolution for low-frequency events, the combination best suited for many real signals.[1]

reference

[1]: https://en.wikipedia.org/wiki/Short-time_Fourier_transform


採樣信號求取相位,相位的變化率就是頻率


傅立葉變換,流水處理


可能你把客觀的聲音,和你聽到的聲音混淆了。你聽到的聲音是你(人)對客觀聲音的響應。

人對客觀聲音的大小的響應,頻率計權和時間計權。對頻率的響應,可能現在還沒有研究清楚。

你說的是客觀聲音,不存在瞬時頻率。只有一段時間的頻譜。


推薦閱讀:
相關文章