SciPy使用FFTpack实现傅立叶变换

FFT代表快速傅立叶变换。傅立叶变换将时域信号转换为频域。它将波形(函数或信号)分解为另一个以正弦和余弦为特征的替代波形。它可以转换周期性的时间信号, 而拉普拉斯变换既可以转换周期性的信号, 也可以转换非周期性的信号。
傅里叶变换存在局限性, 它只能转换稳定的时间信号。 SciPy提供了fftpack模块, 该模块用于计算傅立叶变换。
快速傅立叶变换
一维离散傅立叶变换
离散傅立叶变换(DFT)是最关键的离散变换, 在许多实际应用中用于执行傅立叶分析。
【SciPy使用FFTpack实现傅立叶变换】长度为N的序列x [n]的FFT是通过fft()函数计算的, 逆变换是使用ifft()计算的。

# importing the fft and inverse fft functions from fftpackagefrom scipy.fftpack import fft#Importing numpyimport numpy as np#create an array with random n numbersx = np.array([4.0, 2.0, 1.0, -3.0, 1.5])#Applying the fft functiony = fft(x)print(y)

输出
[5.5+0.j6.69959347-2.82666927j 0.55040653+3.51033344j 0.55040653-3.51033344j 6.69959347+2.82666927j]

scipy.fftpack模块允许计算快速傅立叶变换。我们可以将其用于噪声信号, 因为这些信号需要大量计算。噪声输入信号的示例如下:
import numpy as nptime_step = 0.02period = 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 fftpacksample_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与离散傅立叶变换(DFT)相似, 但仅使用实数。
让我们考虑以下示例:
from scipy.fftpack import dctimport numpy as npprint(dct(np.array([6., 2., 5., 11., 5., 3.])))

输出
[ 64.-1.55291427 -12.1243556516.9705627511.-5.79555496]

DCT的用法
DCT用于各种领域。这些字段如下:
  • 图像处理-压缩, SciPy分析。
  • 音频处理-压缩(MPEG或Mp3)。
  • SciPy计算-偏微分方程求解器。

    推荐阅读