對時域信號計算傅里葉變換以檢查其在頻域中的行為。 傅里葉變換可用于信號和噪聲處理,圖像處理,音頻信號處理等領(lǐng)域。SciPy提供fftpack模塊,可讓用戶計算快速傅立葉變換。
以下是一個正弦函數(shù)的例子,它將用于使用fftpack模塊計算傅里葉變換。
下面來了解一下快速傅立葉變換的細節(jié)。
一維離散傅立葉變換
長度為N的序列x [n]的FFT y [k]由fft()計算,逆變換使用ifft()計算。 看看下面的例子
#Importing the fft and inverse fft functions from fftpackage
from scipy.fftpack import fft
#create an array with random n numbers
x = np.array([1.0, 2.0, 1.0, -1.0, 1.5])
#Applying the fft function
y = fft(x)
print (y)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
[ 4.50000000+0.j 2.08155948-1.65109876j -1.83155948+1.60822041j
-1.83155948-1.60822041j 2.08155948+1.65109876j]
再看另一個示例 -
#Importing the fft and inverse fft functions from fftpackage
from scipy.fftpack import fft
from scipy.fftpack import ifft
#create an array with random n numbers
x = np.array([1.0, 2.0, 1.0, -1.0, 1.5])
#Applying the fft function
y = fft(x)
#FFT is already in the workspace, using the same workspace to for inverse transform
yinv = ifft(y)
print (yinv)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
[ 1.0+0.j 2.0+0.j 1.0+0.j -1.0+0.j 1.5+0.j]
scipy.fftpack模塊允許計算快速傅立葉變換。 作為一個例子,一個(嘈雜的)輸入信號可能看起來如下 -
import numpy as np
time_step = 0.02
period = 5.
time_vec = np.arange(0, 20, time_step)
sig = np.sin(2 * np.pi / period * time_vec) + 0.5 *np.random.randn(time_vec.size)
print (sig.size)
我們正以0.02秒的時間步長創(chuàng)建一個信號。 最后一條語句顯示信號sig的大小。 輸出結(jié)果如下 -
1000
我們不知道信號頻率; 只知道信號sig的采樣時間步長。 信號應(yīng)該來自實際函數(shù),所以傅里葉變換將是對稱的。 scipy.fftpack.fftfreq()函數(shù)將生成采樣頻率,scipy.fftpack.fft()將計算快速傅里葉變換。
下面通過一個例子來理解這一點。
from scipy import fftpack
sample_freq = fftpack.fftfreq(sig.size, d = time_step)
sig_fft = fftpack.fft(sig)
print (sig_fft)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
array([
25.45122234 +0.00000000e+00j, 6.29800973 +2.20269471e+00j,
11.52137858 -2.00515732e+01j, 1.08111300 +1.35488579e+01j,
…….])
離散余弦變換(DCT)根據(jù)以不同頻率振蕩的余弦函數(shù)的和表示有限數(shù)據(jù)點序列。 SciPy提供了一個帶有函數(shù)idct的DCT和一個帶有函數(shù)idct的相應(yīng)IDCT??纯聪旅娴囊粋€例子。
from scipy.fftpack import dct
mydict = dct(np.array([4., 3., 5., 10., 5., 3.]))
print(mydict)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
[ 60. -3.48476592 -13.85640646 11.3137085 6. -6.31319305]
逆離散余弦變換從其離散余弦變換(DCT)系數(shù)重建序列。 idct函數(shù)是dct函數(shù)的反函數(shù)。 可通過下面的例子來理解這一點。
from scipy.fftpack import dct
from scipy.fftpack import idct
d = idct(np.array([4., 3., 5., 10., 5., 3.]))
print(d)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
[ 39.15085889 -20.14213562 -6.45392043 7.13341236 8.14213562
-3.83035081]