SciPy 教程-SciPy FFTpack

FFT 代表 快速傅里叶变换。傅里叶变换将时域信号转换为频域信号。它将波形(函数或信号)分解为另一种由正弦和余弦表示的表达形式。它可以转换周期性时域信号,而拉普拉斯变换可以转换周期性和非周期性信号。
傅里叶变换的一个限制是,它只能转换稳定的时域信号。SciPy 提供了 fftpack 模块,用于计算傅里叶变换。
快速傅里叶变换
一维离散傅里叶变换
离散傅里叶变换(DFT)是最重要的离散变换,它被用于许多实际应用中进行傅里叶分析。
fft() 函数用于计算长度为 N 的序列 x[n] 的 FFT,而 ifft() 用于计算逆变换。
# importing the fft and inverse fft functions from fftpackage
from scipy.fftpack import fft
#Importing numpy
import numpy as np
#create an array with random n numbers
x = np.array([4.0, 2.0, 1.0, -3.0, 1.5])
#Applying the fft function
y = fft(x)
print(y)
输出:
[5.5 +0.j 6.69959347-2.82666927j 0.55040653+3.51033344j
0.55040653-3.51033344j 6.69959347+2.82666927j]
scipy.fftpack 模块允许计算快速傅里叶变换。我们可以在噪声信号中使用它,因为这些信号需要高计算量。下面给出了噪声输入信号的示例:
import numpy as np
time_step = 0.02
period = 5.
time_vector = np.arange(0, 20, time_step)
sig = np.sin(2 * np.pi / period * time_vec) + 0.5 *np.random.randn(time_vector.size)
print("The Signal Size is:", sig.size)
输出:
The Signal Size is: 1000
在上面的程序中,我们创建了一个时间步长为 0.02 秒的信号。该语句打印出信号大小,如输出所示。我们不知道信号的频率;我们只熟悉信号 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)
输出:
[ -4.36424554+0.00000000e+00j -0.04699618+2.19694444e+01j
-7.01929898+1.04796659e+01j -17.63704986-1.25717602e+01j
-9.60405228-4.95595106e+02j -11.47597041-1.51768467e+01j............]
离散余弦变换
离散余弦变换(DCT)通过对余弦函数的求和来表示数据。它将一系列实数据点转换为其实频谱,因此避免了冗余问题。DCT 主要用于图像压缩。
DCT 类似于离散傅里叶变换(DFT),但它仅使用实数。
考虑以下示例:
from scipy.fftpack import dct
import numpy as np
print(dct(np.array([6., 2., 5., 11., 5., 3.])))
输出:
[ 64. -1.55291427 -12.12435565 16.97056275 11.
-5.79555496]
DCT 的应用
DCT 在各个领域中被广泛使用。这些领域包括:
- 图像处理 - 压缩、科学分析。
- 音频处理 - 压缩(MPEG 或 Mp3)。
- 科学计算 - 偏微分方程求解器。