Pages

星期六, 8月 22, 2015

[python] 傅立葉轉換

我們量測到一段訊號後,除了觀看時域上是否有任何特徵外,另外最常見的分析方法,便是將訊號轉換到頻域上,看看訊號在頻譜上的特性。在python裡,我們可以使用numpy的fft模組(numpy.fft)來對我們的訊號進行離散傅立葉轉換(Discrete Fourier Transform; DFT)。

首先我們利用scipy.io.wavfile模組將訊號讀取進來成為一tuple變數,第0個成員為該訊號的取樣頻率,而第1個成員即為存成array的時域訊號數值。

tupleWav = wav.read('database/voxforge/voxforgeivr-20070410-062052-1176186024.14/wav/vf3-06.wav')


接著,利用numpy.fft模組,將訊號進行離散傅立葉轉換:


sp = np.fft.fft(tupleWav[1])


所得之結果(sp)為一複數,我們可以進一步求其頻譜大小及相位:


ampSP = np.abs(sp)
phaseSP = np.unwrap(np.angle(sp))


而因為所得之頻譜為一從0→-→0之序列,為了作圖需要,我們要將其順序調換為從負到正。首先我們利用fftfreq來計算頻率軸座標,再將其排序,並儲存排序後的座標索引(idx):


time_step = 1./tupleWav[0]
freqs = np.fft.fftfreq(sp.size, time_step)
idx = np.argsort(freqs) # from negative to positive


再根據排序後的索引將頻譜大小與相位給畫出來:


plt.figure()
plt.subplot(211)
plt.plot(freqs[idx[len(idx)/2:]], ampSP[idx[len(idx)/2:]])
plt.xlabel('Hz')
plt.ylabel('Amplitude')
plt.subplot(212)
plt.plot(freqs[idx[len(idx)/2:]], phaseSP[idx[len(idx)/2:]])
plt.xlabel('Hz')
plt.ylabel('rad')


因為頻譜是對稱的,所以我們通常只畫出0-的部份,因此取排序後的前半部頻譜來作圖即可,所得之結果如下圖所示:


圖2.1 頻譜之大小(上)與相位(下)

特別注意的是在圖2.1中,相位大小的單位為radian(rad),而頻率軸已經轉換成我們所熟悉的類比頻率。基本上,離散傅立葉轉換後的結果頻譜上應為0-2的範圍,其中2對應到輸入訊號的取樣頻率。然而我們人是活在類比的世界,因此通常我們會將頻率軸轉換成類比頻率以方便我們觀看與分析。

from http://hcliao.twbbs.org/signal-processing-using-python/chap-02


創用 CC 授權條款
本著作由廖憲正製作,以創用CC 姓名標示-非商業性-禁止改作 4.0 國際 授權條款釋出。

1 則留言:

  1. The Golden Nugget Casino in Las Vegas - MapYRO
    The Golden Nugget Casino in Las Vegas is 수원 출장샵 located on the north 영주 출장안마 end 나주 출장샵 of the Las Vegas Strip just a few blocks 구리 출장안마 from the Las Vegas Strip. With over 3,300 slot 광주광역 출장마사지

    回覆刪除