SciPy FFTpack
傅里叶变换 是对时域信号进行计算,以检查其在频域的行为。傅里叶变换在信号和噪声处理、图像处理、音频信号处理等学科中都有应用。SciPy提供了fftpack模块,它可以让用户计算快速傅立叶变换。
下面是一个正弦函数的例子,它将被用来计算fftpack模块的傅里叶变换。
快速傅立叶变换
让我们详细了解一下什么是快速傅立叶变换。
一维离散傅里叶变换
长度为N的序列x[n]的FFT y[k]由ftt()计算,反变换则由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
上述程序将产生以下输出。
[ 4.50000000+0.j 2.08155948-1.65109876j -1.83155948+1.60822041j
-1.83155948-1.60822041j 2.08155948+1.65109876j ]
让我们看看另一个例子
#FFT is already in the workspace, using the same workspace to for inverse transform
yinv = ifft(y)
print yinv
上述程序将产生以下输出。
[ 1.0+0.j 2.0+0.j 1.0+0.j -1.0+0.j 1.5+0.j ]
scipy.ftpack 模块可以计算快速傅里叶变换。As an illustration, a (noisy) input signal may look as follows −
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秒的信号。最后一条语句打印出信号sig的大小。输出结果将如下 –
1000
我们不知道信号的频率,我们只知道信号sig的采样时间步骤。信号应该是来自一个实数函数,所以傅里叶变换将是对称的。 scipy.ftpack.ftfreq() 函数将生成采样频率, scipy.ftpack.ft() 将计算出快速傅里叶变换。
让我们在一个例子的帮助下理解这一点。
from scipy import fftpack
sample_freq = fftpack.fftfreq(sig.size, d = time_step)
sig_fft = fftpack.fft(sig)
print sig_fft
上述程序将产生以下输出。
array([
25.45122234 +0.00000000e+00j, 6.29800973 +2.20269471e+00j,
11.52137858 -2.00515732e+01j, 1.08111300 +1.35488579e+01j,
…….])
离散余弦变换
离散余弦变换(DCT) 用不同频率振荡的余弦函数之和来表达数据点的有限序列。SciPy提供了一个DCT的函数 dct 和一个相应的IDCT的函数 idct。 让我们考虑下面的例子。
from scipy.fftpack import dct
print dct(np.array([4., 3., 5., 10., 5., 3.]))
上述程序将产生以下输出。
array([ 60., -3.48476592, -13.85640646, 11.3137085, 6., -6.31319305])
反离散余弦变换从其离散余弦变换(DCT)系数重建一个序列。idct函数是dct函数的逆函数。让我们通过下面的例子来理解这一点。
from scipy.fftpack import dct
print idct(np.array([4., 3., 5., 10., 5., 3.]))
上述程序将产生以下输出。
array([ 39.15085889, -20.14213562, -6.45392043, 7.13341236,
8.14213562, -3.83035081])