語譜圖
生成語譜圖的前提:
在一段時間內(如10~30ms,即所謂一幀內)可以認為頻譜是不變的。【blog鏈接】
如何理解在一段時間內頻譜是不變的?
先看圖:

上圖引自《傅里葉變換終極解釋》
理解:對於頻率方向上的若干個頻率,當在時間方向上前進一段10-30ms的距離時,我們可以認為這些個頻率對應的振幅不變。(時間太短,振幅還沒變化。)
所以如果幀長時間太長,則這些個頻率對應的振幅可能是有變化的。此時若再放在一幀里面表示則不能精確地刻畫各個頻率隨時間變化的振幅值。
語譜圖生成流程
引自blog:《語音信號處理之(四)梅爾頻率倒譜系數(MFCC)》
我們處理的是語音信號,那么如何去描述它很重要。因為不同的描述方式放映它不同的信息。那怎樣的描述方式才利於我們觀測,利於我們理解呢?這里我們先來了解一個叫聲譜圖的東西。
這里,這段語音被分為很多幀,每幀語音都對應於一個頻譜(通過短時FFT計算),頻譜表示頻率與能量的關系。在實際使用中,頻譜圖有三種,即線性振幅譜、對數振幅譜、自功率譜(對數振幅譜中各譜線的振幅都作了對數計算,所以其縱坐標的單位是dB(分貝)【關於分貝的理解】。這個變換的目的是使那些振幅較低的成分相對高振幅成分得以拉高,以便觀察掩蓋在低幅噪聲中的周期信號)。
我們先將其中一幀語音的頻譜通過坐標表示出來,如上圖左。現在我們將左邊的頻譜旋轉90度。得到中間的圖。然后把這些幅度映射到一個灰度級表示(也可以理解為將連續的幅度量化為256個量化值?),0表示黑,255表示白色。幅度值越大,相應的區域越黑。這樣就得到了最右邊的圖。那為什么要這樣呢?為的是增加時間這個維度,這樣就可以顯示一段語音而不是一幀語音的頻譜,而且可以直觀的看到靜態和動態的信息。優點稍后呈上。
這樣我們會得到一個隨着時間變化的頻譜圖,這個就是描述語音信號的spectrogram聲譜圖。
下圖是一段語音的聲譜圖,很黑的地方就是頻譜圖中的峰值(共振峰formants)。
那我們為什么要在聲譜圖中表示語音呢?
首先,音素(Phones)的屬性可以更好的在這里面觀察出來。另外,通過觀察共振峰和它們的轉變可以更好的識別聲音。隱馬爾科夫模型(Hidden Markov Models)就是隱含地對聲譜圖進行建模以達到好的識別性能。還有一個作用就是它可以直觀的評估TTS系統(text to speech)的好壞,直接對比合成的語音和自然的語音聲譜圖的匹配度即可。
總結:
對於一段語音信號x(t),
(1)首先分幀,變為x(m,n)(n為幀長,m為幀的個數);
(2)然后做FFT變換,得到X(m,n),做周期圖Y(m,n)(Y(m,n) = X(m,n) * X(m,n)');
(3)接着取10 *log10(Y(m,n)),把m根據時間變換一下刻度M,n根據頻率變化一下刻度N;
(4)最后將(M,N, 10*log10(Y(m,n) 畫成二維圖就是語譜圖了。
共軛復數,兩個實部相等,虛部互為相反數的復數互為共軛復數(conjugate complex number)。復數z的共軛復數記作zˊ。
z· z′=|z|2=a2+b2(實數);
在matlab中conj(x)是求x的共軛數。
問題:
序列的DFT的輸出是什么?
一個序列可以看成是一個函數。比如序列 [a,b,c,d],可以看成是一個函數f(x)在x=1,2,3,4出分別取值a,b,c,d。
由於任何周期函數都可以用正弦函數和余弦函數構成的無窮級數來表示。
那么對該序列做DFT的意義就是找出這個函數f(x)是由哪些振幅和頻率的正弦余弦函數構成的。
參考鏈接
http://old.sebug.net/paper/books/scipydoc/frequency_process.html
參考書籍:
王永琦. MATLAB與音視頻技術[M]. 清華大學出版社, 2013. P125
梁瑞宇, 趙力, 魏昕. 語音信號處理實驗教程[M]. 機械工業出版社, 2016. P60




