FFT代表快速傅立叶变换。傅立叶变换将时域信号转换为频域。它将波形(函数或信号)分解为另一个以正弦和余弦为特征的替代波形。它可以转换周期性的时间信号, 而拉普拉斯变换既可以转换周期性的信号, 也可以转换非周期性的信号。
傅里叶变换存在局限性, 它只能转换稳定的时间信号。 SciPy提供了fftpack模块, 该模块用于计算傅立叶变换。
快速傅立叶变换
一维离散傅立叶变换
离散傅立叶变换(DFT)是最关键的离散变换, 在许多实际应用中用于执行傅立叶分析。
长度为N的序列x [n]的FFT是通过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与离散傅立叶变换(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用于各种领域。这些字段如下:
- 图像处理-压缩, SciPy分析。
- 音频处理-压缩(MPEG或Mp3)。
- SciPy计算-偏微分方程求解器。
评论前必须登录!
注册