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)。
  • 科学计算 - 偏微分方程求解器。

标签: Scipy, Scipy学习, Scipy教程, Scipy下载, Scipy指南, Scipy基础教程, Scipy使用指南, Scipy库, Scipy入门, Scipy进阶, Scipy模块, Scipy安装教程