語音信號分析之FFT變換過程

語音信號分析從FFT變換開始

概述

語音信號是人爲經過聲學設備採集轉換而來的便於編碼、儲存以及做聲學處理用途抽象而成的信號。首先一段WAV音頻擁有固定的幾個參數用來規定語音信號的屬性。正確的區分通道數、採樣率、分辨率這些基本參數是語音信號分析的基本功。

語音採集

聲學麥克風設備當前有很多種,普通單麥、雙麥、線麥、環麥。麥克風陣列不同,對於工程上面的分析和處理有不同的實際要求。而它們在整體處理流程上面是一致的。而無論是想做AEC(聲學回聲消除)、GSC(旁瓣相消)、NR(噪聲消除)這些基本的前端聲學信號處理,都離不開一個常用的分析方法—頻域分析法。想使用頻域分析法,前提是要保證原始音頻信號的正確性和完整性。現在多數的設備上都是通過PCM模塊從底層直接給上層提供轉換好的數字信號。應用層工程師可以直接用PCM原始數據進行處理和輸出。

語音信號預處理

當然,很多剛開始入門的人都不太明白爲什麼需要將信號放在頻域上面進行處理。也不知道怎麼將信號從時域轉換到頻域。畢竟當初在學校學習微積分-拉普拉斯變換-積分變換各種數學工具時,根本不清楚這些數學工具的思想和實際用途。雖然數學是搞語音信號處理或者機器學習等熱門行業的攔路虎,但是從一個點入手,把數學從實際的工程再抽象回理論,是比當初在學校中生硬的理解公式要有趣和容易的多。
聲學信號處理常用的FFT點數從256-4096都有,這取決與工程中面對實際問題時的取捨和決策。而每一個FFT點數我們可以理解爲是一個頻點。語音信號的採樣率16000是基於採樣定理和人耳能分辨的最高頻8k而定的。現在我們簡單的跳過一系列的嚴謹的數學推理,簡單的理解FFT就是一個工具,把連續的聲學信號通過FFT變換成分辨率爲256-4096不等,分別對應0-8k等分頻點的數據。那麼比如我想要消除直流分量,我現在可以簡單的將0頻點或者第一個頻點的數據置零。當然,頻域中的數據是用複數來表示。我們將實部和虛部的平方和簡單的看做是這個頻點的能量。只要這個頻點的能量是0,那麼就相當於我把直流分量進行了消除。那現在我們就完成了語音信號處理最簡單的一個實驗。
當我們想要把數據從時域轉換成頻域時,以單通道原始音頻爲例,我們沒辦法一口氣將所有的數據一次進行處理,所以我們可以一段一段的進行。那就有了“幀”的概念,處理的一段數據就是一幀,而一幀的大小取決於我們使用的是多少點的FFT。如果我們想用256點的FFT,那麼可以設定一幀數據的大小爲256。當然這不是固定的,這取決於你想怎麼處理你的數據。
現在我從原始的PCM數據中按照時間的順序,截取了一幀數據。如果想事情比較嚴謹的人一定會想到一個問題,是不是一幀的大小決定了語音信號處理的精度呢?而每一幀做相同的處理,表面上看起來是正常不過的事。但是怎麼保證前後幀的關聯性呢?如果簡單的處理完後,可以發現處理後的數據怎麼好像是一段一段的,就像我們在P圖的時候,人家會說你有“P的痕跡”。爲了解決這個“P的痕跡”就需要在這幀數據進行FFT前,給它做個小小的處理。用一個函數或者映射關係將數據進行包裝。這個包裝過程俗稱“加窗”。常用的窗函數有漢寧窗等,當我們具體做的時候就是將每一幀數據256個數,每個都乘以一個用窗函數生成的係數。另外,因爲數據的精度是通過一個short字節長度來保存的,爲了能夠方便的計算。我們將short型的整數,縮小2^15倍數通過數據範圍不超過正負1的小數來方便運算。
現在數據可以正式的做FFT運算了。

語音信號頻域分析

FFT運算到底在幹什麼,其實說的簡單些,任何一個信號都是可以用不同頻率的三角函數之和給表達出來的。三角函數我們比較容易理解它有關於角頻率這些概念。這個頻率的係數其實就可以簡單理解爲不同的頻率。而三角函數的幅值係數也可以表達該信號的強弱。FFT就是通過推理好的變換方式,將數據從時域映射到頻域。有興趣的童鞋可以自行去研究歐拉公式、拉普拉斯變換、傅里葉變換以及具體的蝶形運算過程的推導原理。如果只是做工程處理,其實不會推導這個過程也沒關係。畢竟FFT現在的應用已經比較成熟。函數庫和工具也比較完善。唯一需要深入研究的可能就是FFT的運算效率以及結合具體的項目對FFT進行優化。
現在我們得到了256個時域數據變換後的256個頻域數據。而有意思的是,這256個數據由於加窗的關係是對稱的。也就是說我們其實只需要處理256/2 + 1個數據就可以了。
現在我們可以對數據進行簡單的處理。比如,當我們看這個數據中前10個或者20個數據的幅值遠遠高於後面的頻點的幅值。那說明低頻的信號中混合這大量的噪聲。而怎麼把這些噪聲消除,又可以保留聲音的數據不被破壞。這個就是語音信號處理工作中要研究的問題。
現在我們有兩個思路可以做這個處理
1.通過消除有特徵的數據信號。
2.保留有聲學特徵的數據信號。
生活中的噪聲多數集中在低頻段,如果能夠把低頻段中噪聲都去除掉。那信號的質量就會大大提升。同時不能破壞語音信號。語音信號有自己的特徵,比如諧波特性。從頻譜圖中可以簡單的看到語音信號就是從低頻到高頻的柱狀紋路有規律的這樣的信號。保留這樣特徵的信號是處理噪聲時需要注意的事情。

語音信號處理總結

當然,僅僅以爲把噪聲消除就是信號處理的所有那就太過簡單了。這只是一個開始。比如,我想把兩個人的人聲進行區分。那這回是不是難的想要去找文獻,找資料去研究了?
雖然語音處理工作繁瑣又枯燥,但是如果掌握了對於頻域分析和FFT這一利器,必定事半功倍。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章