2019年12月5日 星期四

Praat 語音分析筆記 (五) : 頻譜分析

本篇主題是 Praat 語音分析中的頻譜分析, 在 SoundEditor 視窗中這些功能放在 Spectrum 選單內. 相較於音高分析, 頻譜較為複雜些, 但能觀察的聲學參數也較豐富. 本系列前面的文章參考 :

Praat 語音分析筆記 (一) : 簡介與軟體下載
Praat 語音分析筆記 (二) : 錄音與存檔匯入
Praat 語音分析筆記 (三) : SoundEditor 操作
Praat 語音分析筆記 (四) : 音高分析


五 頻譜分析

在使用 Praat 的頻譜分析功能前, 有必要對頻譜的理論基礎--傅立葉分析做個簡單的說明, 雖然牽涉一點點數學, 但只需要理解概念即可, 使用 Praat 操作頻譜分析並不需要任何複雜的數學計算.


4.1 傅立葉級數與傅立葉變換

所謂的頻譜 (spectrum) 是指信號 (例如語音) 在頻域 (frequency domain) 的能量分布, 以圖形來表示的話, 其橫軸是頻率 (單位為 Hz, 即每秒振動的次數), 縱軸為振幅 (amplitude, 即大小), 所以頻譜就是聲音中的能量隨頻率變化的情形.

頻譜分析的理論基礎來自數學中的傅立葉級數 (Fourier series), 這是法國數學家傅立葉 (Jean Baptiste Joseph Fourier, 1768~1830) 在研究熱傳導方程式時發展出來的解法, 這套數學後來被演進為更一般化的傅立葉變換 (Fourier transformation), 其應用非常廣泛 (例如 CT 掃描之影像處理), 也是現代數位信號處理的基礎.




傅立葉證明所有的函數都可以展開為三角函數之和 :




根據傅立葉的理論, 一個週期性函數 g(t) 可以拆解成許多不同頻率三角弦波之疊加, 這些弦波稱為此信號之諧波成分 (harmonic), 因此, 原本時域 (time domain) 的時間信號 g(t) 可以換一種方式用每一個諧波的頻率與其振幅表示, 其橫軸單位為頻率 (Hz), 縱軸為該頻率之振幅, 從這個角度來看信號就稱為頻域, 而從時間軸角度來看信號 g(t) 就稱為時域. 簡言之, 傅立葉級數是將週期函數從時域轉換到頻域的方法; 而傅立葉變換則是將非週期信號從時域轉換到頻域的方法.




上圖中紅色的波形就是時域中的信號波形, 藍色的弦波就是將其作傅立葉分解後的各諧波成分, 從右側的頻域來看, 這個近似方波的信號可以用諧波的振幅與其頻率來表示.

1965 年美國數學家 James CooleyJohn Turkey 提出了快速傅立葉轉換 (Fast Fourier Transformation, FFT) 演算法, 使傅立葉轉換的計算速度獲得革命性的提升, Praat 的頻譜分析演算法也是快速傅立葉轉換的一種實作.

參考 :

如果看了此文你還不懂傅里葉變換那就


4.2 用傅立葉級數合成聲音信號

上面提到任何週期性信號都可以分解為不同頻率的弦波, 也就是說, 將這些弦波加起來就可以還原成原來的信號. 以方波 (square wave) 為例, 依據傅立葉分析公式可以分解為正弦波 (sine wave) 的無窮級數和 :





其中第一項中的 f 就是第一諧波頻率 (單位 Hz), 第二諧波頻率為 6f, 第三諧波頻率為 10f, .... 依此類推. 如果 f=100 Hz, 則第二諧波頻率為 200 Hz, 第三諧波頻率為 600 Hz. 參考 :

# Wiki : 方波

在 Praat 物件視窗的 New 選單中有一個 Sound 子選單, 點選其中的 "Create Sound from formula" 功能項可用來合成任何波形的信號 :




在彈出的選單中, 最底下有一個 formula 欄, 參考上面方波的正弦波級數和公式, 代入 f=100 Hz 轉成如下表示法 (只取前三項) :

4/pi*(sin(2*pi*100*x)+(1/3)*sin(6*pi*100*x)+(1/5)*sin(0*pi*100*x))

其中 pi 是 Praat 的內建常數, 其值為圓周率 3.1415926, 變數 x 為時間 (單位為秒), 注意, Praat 裡面變數要用 x, 不可用 t. 將此式子貼到 formula 欄中, 第一欄 Name 可取名為 square_wave, 按 OK 就會依據此數學式合成出一個近似方波的信號, 這時物件視窗會出現一個 square_wave 的聲音物件 :





按 "View & Edit" 鈕開啟 SoundEdit 視窗, 再按左下角 in 鈕數次放大波形就可看到這個近似方波的合成信號了. 按圖形底下的灰色長條鈕播放此聲音, 可聽到頻率為 100 Hz 的低沉哼哼聲.




注意, 這裡我們說近似而非還原是因為在方波的傅立葉無窮分解式中我們只取了前三個諧波來組合, 所以只能重建出近似方波的信號, 而無法還原為完美的方波, 如果加入更多諧波就能逼近完美之方波了.

在 Object 視窗中點選此近似方波之聲音物件, 按右方的 Draw 鈕, 在彈出的繪圖設定視窗中的 Time range 欄位填入上圖中波形的時間範圍 0.46875 與 0.53125 按 OK 即可將此時段內的近似方波輸出到 Picture 視窗 :






4.3 寬頻與窄頻聲譜

聲譜圖 (spectrogram) 又稱為語圖或聲紋圖, 在 SoundEditor 視窗中, 下半部圖形預設顯示寬頻聲譜圖 (wide band spectrogram) 與音高曲線, 這個聲譜圖就是 Praat 對聲音物件進行頻譜分析的結果.

Praat 在做頻譜分析時會像切吐司那樣, 將整個聲音物件切成連續等長的分析窗或時框 (window 或 time frame), 然後對每一片時框進行頻譜分析 (spectral analysis, 即快速傅立葉轉換) 得到該時框的頻譜 (spectrum).

以前面從 this_is_a_book.wav 切出來的第一音節 this.wav 為例, 按 Open 選單的 "Read from file" 匯入後, 點選此物件按 "Edit & View" 開啟 SoundEditor 視窗, 按 Spectrum 選單之 "Spectrogram settings" 功能項 :




彈出的設定視窗中, 第一欄為分析的頻譜範圍, 使用預設的 0~5000 Hz 即可. 可能需要調整的是第二個欄位 Window length (單位秒), 預設 0.005 秒表示這是寬頻頻譜 :




頻譜分析的原理簡單來講, 就是使用許多濾波器來鑑別頻率成分, 而寬頻頻譜與窄頻頻譜 (narrow band spetrum) 之差別在於進行頻譜分析時所使用之帶通濾波器 (band pass filter) 頻寬是大還是小, 使用大頻寬濾波器 (約 300 Hz) 去過濾原始信號得到的結果就是寬頻頻譜; 使用小頻寬濾波器 (約 45 Hz) 得到的結果就是窄頻頻譜.

帶通濾波器允許一個頻率範圍 (高低截止頻率 fL 與 fH 之間) 內之信號成分通過, 在此範圍外之頻率成分會被濾掉, 高低截止頻率之差即為其頻寬 (band width). 濾波器可以想像成篩子, 孔徑大 (大頻寬) 的允許更多東西過篩, 孔徑小 (小頻寬) 則只允許細物過篩, 其餘會被濾掉無法通過.




上面的聲譜圖設定視窗中的 Window length 欄位 (分析窗寬度) 就是用來控制濾波器的頻寬, 一般來說, 要得到寬頻頻譜的話, Window length 設為 0.005 秒 (5 毫秒); 而窄頻頻譜則設為 0.03 秒 (30 毫秒), 如下表所示 :




窄頻頻譜使用的濾波器頻寬小, 頻率解析度高, 因此能夠精細地解析出各次諧波成分, 也能夠看出基本頻率 fo (因為 fo 就是一次諧波); 反之, 寬頻頻譜使用的濾波器頻寬大, 頻率解析度低, 所以看不出諧波成分, 但能宏觀地看出共振峰 (formant, 又稱特強頻率帶) 的分布區域. 總之, 窄頻頻譜看細微 (見樹), 寬頻頻譜看大局 (見林).

窄頻與寬頻頻譜之差異可以用城門比喻來理解, 想像自己是管理城門進出的士兵, 若城門很窄 (窄頻), 只能容 1 或 2 人進出, 那麼就很容易鑑別出逃亡的朝廷要犯 (見樹); 反之若城門很寬 (寬頻), 同時進出的人太多, 就不容易鑑別出來了, 但是卻很容易察覺是進城的人潮多還是出城的人潮多 (見林).

SoundEditor 預設的寬頻聲譜圖與其 0.005 秒分析窗如下 :




此處是將 View 選單的 Show analyses 子選單設定只顯示 Show spectrogram 與 Show formant 這兩項, 顏色越深能量越高, 紅點所在之處是能量的頂峰, 稱為共振峰 (formant),  宛如山頂連成一線之稜線, 頻率由低到高標為 F1, F2, F3, 與 F4, 這是聲音氣流經過發音腔時產生共振所致, 共振點頻率能量獲得增強形成 F1~F4 共振峰現象.

在上面寬頻聲譜圖上點一下, 按 Spectrum 選單點選最底下的 "View spectrum slice" 可取出游標所在時間點之頻譜分析切片, 可較清楚看出該分析窗聲音切片的共振峰位置 :





此切片剖面顯示第一共振峰 F1 約在 304 Hz, F2 約在 1760 Hz, F3 約在 2430 Hz, 而 F4 約在 3020 Hz. 這只是游標所在時間點分析窗之寬頻頻譜圖而已, 隨著時間推移, 每一個分析窗的共振峰都不同.

聲譜圖實際上是三維的 (時間, 能量, 頻率), 但 Praat 目前僅能輸出二維 (時間, 頻率) 聲譜圖, 第三維的能量以顏色的灰階深淺表示. 一個 3D 聲譜的範例圖形如下 :




此圖朝向頁面為時間軸, 朝右為頻率軸, 朝上為強度 (能量) 軸, 圖中每一個切片就是用 0.005 秒分析窗寬度對聲音切片做頻譜分析的結果 (寬頻聲譜) , 隨著發聲時間由後往前逐片分析的結果排列起來就是 3D 聲譜圖, 其中由左向右清晰可見 F1~F5 五個共振峰, 是能量頂峰連成的稜線. 

若將 Window length 設為 0.03 秒可得到窄頻頻譜 :





此處是將 View 選單的 Show analyses 子選單設定只顯示 Show spectrogram 這一項, 可見下半部的聲譜圖呈現許多水平的橫紋, 這些就是聲音的諧波成分, 由下往上為一次, 二次, 三次, ... N 次諧波, 最底下的一次諧波也就是基本頻率 (fundamental frequency, 即音高).

在窄頻聲譜圖上點一下, 按 Spectrum 選單點選最底下的 "View spectrum slice" 可取出游標所在時間點之頻譜分析切片, 可較清楚看出該分析窗聲音切片的各次諧波成分 :





在彈出的頻譜分析視窗中可看到各次諧波 (請按左下角的 in 按鈕放大顯示), 其中最左邊的是一次諧波, 也就是基本頻率 (音高), 約 145 Hz, 其他較高次諧波頻率為此頻率之整數倍.

若將同一個聲音物件的某個切片之寬頻與窄頻頻譜套在一起, 可以看出寬頻頻譜其實是窄頻頻譜的外形 (envelop), 寬頻濾波器使得頻譜勻化了, 可以看出能量的大致分布情形; 而窄頻頻譜則顯示了精細的頻率成分 :




上圖中橘色為寬頻頻譜, 其峰值能量即 F1~F4 共振峰; 藍色為窄頻頻譜, 每一個脈衝代表一個諧波, 最左邊的一次諧波為基本頻率 Fo.


4.4 從 SoundEditor 視窗中取出聲譜圖

SoundEditor 視窗下半部的聲譜圖可以單獨取出來, 按 SoundEditor 視窗的 Spectrum 選單點選 "Extract visible spectrogram" :




取出的聲譜圖會放在 Object 視窗內, 點選後按右方的 View 按鈕就會開啟一個視窗呈現此聲譜圖 :





4.5 輸出聲譜圖

若要輸出 SoundEditor 視窗的聲譜圖至 Picture 視窗, 可按 Spectrum 選單點選 "Paint visible spectrogram" 功能項 :





可見輸出的是單純的聲譜圖, 沒有共振峰等資訊.


4.6 直接從聲音物件產生 Spectrogram 物件 

除了可 SoundEditor 視窗操作頻譜分析外, 也可以在物件視窗中直接產生 Spectrogram 物件, 首先在 SoundEditor 視窗點選聲音物件後, 按右方的 "To spectrogram" 按鈕 :




在彈出的視窗中, 將第一欄位 Window length 設定為 0.03 秒, 按 OK 鈕就會在 Object 視窗中產生一個窄頻聲譜之 Spectrogram 物件 :




點選此物件, 按右方 "Analyze" 鈕點選 "To spectrum(slice)" 會彈出一個設定視窗, 請在 Time 欄位輸入欲擷取之頻譜切片 :





此處輸入時間為 0.141432 秒, 表示要取出此時間點附近之切片, 按 OK 就會將擷取之頻譜切片放進 Object 視窗中, 點選此頻譜切片物件, 再按右邊的 "View & Edit" 鈕就就會顯示頻譜分析的結果了 :





由於分析窗框度 (Window lenght) 設為 0.03 秒, 故所建立的 Spectrogram 與 Spectrum 物件均為窄頻頻譜, 由上圖可清楚看出各諧波成分, 一次諧波頻率為 141 Hz, 即基本頻率 fo, 其餘高次諧波頻率為其整數倍.

沒有留言 :