个性化阅读
专注于IT技术分析

SciPy使用FFTpack实现傅立叶变换

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

赞(0)
未经允许不得转载:srcmini » SciPy使用FFTpack实现傅立叶变换

评论 抢沙发

评论前必须登录!