語譜圖html
生成語譜圖的前提:python
在一段時間內(如10~30ms,即所謂一幀內)能夠認爲頻譜是不變的。【blog連接】函數
如何理解在一段時間內頻譜是不變的?性能
先看圖:url
上圖引自《傅里葉變換終極解釋》.net
理解:對於頻率方向上的若干個頻率,當在時間方向上前進一段10-30ms的距離時,咱們能夠認爲這些個頻率對應的振幅不變。(時間過短,振幅還沒變化。)code
因此若是幀長時間太長,則這些個頻率對應的振幅多是有變化的。此時若再放在一幀裏面表示則不能精確地刻畫各個頻率隨時間變化的振幅值。orm
語譜圖生成流程視頻
引自blog:《語音信號處理之(四)梅爾頻率倒譜系數(MFCC)》htm
咱們處理的是語音信號,那麼如何去描述它很重要。由於不一樣的描述方式放映它不一樣的信息。那怎樣的描述方式才利於咱們觀測,利於咱們理解呢?這裏咱們先來了解一個叫聲譜圖的東西。
這裏,這段語音被分爲不少幀,每幀語音都對應於一個頻譜(經過短時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