SciPy FFTpack


对时域信号计算 傅里叶变换 以检查其在频域中的行为。傅立叶变换可用于信号和噪声处理,图像处理,音频信号处理等领域.SciPy提供fftpack模块,可让用户计算快速傅里叶变换。

以下是一个正弦函数的例子,它将用于使用fftpack模块计算傅里叶变换。

快速傅立叶变换

让我们来了解一下快速傅立叶变换的细节。

一维离散傅立叶变换

长度为N的序列x [n]的长度为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

上述程序将生成以下输出。

[ 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.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秒时间步长的信号。最后一条语句显示信号sig的大小。输出结果如下 -

1000

我们不知道信号频率; 我们只知道信号sig的采样时间步长。信号应该来自实际函数,所以傅里叶变换将是对称的。所述 scipy.fftpack.fftfreq() 函数将生成的采样频率和 scipy.fftpack.fft() 将计算快速傅立叶变换。

让我们通过一个例子来理解这一点。

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])