Numpy:为什么scipy和numpy FFT的图形看起来不同
在本文中,我们将介绍Numpy(Numerical Python)的基础知识,特别是关于FFT(快速傅里叶变换)的使用和理解。同时,我们也会解释为什么在使用不同的库时,如Scipy和Numpy,在绘制FFT图形时会有所不同。
阅读更多:Numpy 教程
Numpy和FFT的基础知识
Numpy是一个用于科学计算的开源Python库,它强大的数据结构可以支持大量的数值计算。它可以用于处理各种数据类型,包括整数、浮点数和复数数据,以及N维数组和矩阵运算。其中,FFT是一种广泛使用的数学工具,用于将一个信号在不同频率上的成分进行分离。
对于Numpy中的FFT函数,我们可以使用np.fft函数来计算一个实数或复数序列的傅里叶变换。使用该函数,我们可以将信号转换成频域或时域表示,可以用于信号过滤、图像滤波、心电图信号处理和光学显微镜图像分析等领域。
使用Scipy和Numpy绘制FFT图形的差异
虽然Scipy和Numpy都基于FFT算法来计算傅里叶变换,但我们会发现在绘制FFT图形时,两者显示的结果却是有所不同的。
我们在Scipy中使用signal库中的periodogram函数绘制一个噪音信号的FFT图形,代码如下:
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
# 生成一个噪音信号
signal = np.random.randn(1000)
# 使用periodogram函数计算FFT
freq, Pxx = signal.periodogram(signal, fs=1000)
# 绘制FFT图形
plt.plot(freq, Pxx)
plt.show()
而在Numpy中,我们使用fft函数绘制同样的FFT图形:
import numpy as np
import matplotlib.pyplot as plt
# 生成一个噪音信号
signal = np.random.randn(1000)
# 计算FFT
freq = np.fft.fftfreq(signal.size, 1/1000)
Pxx = np.fft.fft(signal)
# 绘制FFT图形
plt.plot(freq, np.abs(Pxx)**2)
plt.show()
对比两段代码,我们可以看到主要的差异在于计算FFT和绘图的代码实现方式不同。在Scipy中使用的是periodogram函数,而在Numpy中使用的是fft函数。这两个函数在计算FFT时有所不同。
在使用periodogram函数时,我们需要提供采样率(fs)、信号序列和窗口函数等参数。而在使用fft函数时,我们需要先调用fftfreq函数生成频率数组,再使用fft函数计算信号的FFT结果。
此外,两者在计算FFT时也有所不同。Scipy中的periodogram函数会默认进行Welch重叠平均处理,而Numpy中的fft函数会返回实部和虚部的值。
因此,在绘制FFT图形时结果有所不同。
FFT的可视化
除了前面的区别以外,我们还可以使用不同的方式来呈现FFT的图形。下面展示一些常见的FFT可视化方式。
箱形图
箱形图对于FFT图形的展示可以提供感官的信息,它显示了FFT的幅度范围。最高点是FFT分解的主要分量,而箱形图中的水平线显示了FFT的最大和最小区间。
# 生成一个噪音信号
signal = np.random.randn(1000)
# 计算FFT
Pxx = np.fft.fft(signal)
# 绘制FFT箱plt.boxplot(np.abs(Pxx)**2)
plt.show()
热图
热图可以呈现FFT频率和幅度的交叉关系,颜色越深表示幅度越大,可以帮助我们更直观地理解FFT的结果。
# 生成一个噪音信号
signal = np.random.randn(1000)
# 计算FFT
Pxx = np.fft.fft(signal)
# 绘制FFT热图
plt.specgram(signal, Fs=1000)
plt.show()
表面图
表面图的展示方式将FFT频率、幅度和相位综合在一起,可以让我们更全面地了解信号的性质。
# 生成一个噪音信号
signal = np.random.randn(1000)
# 计算FFT
Pxx = np.fft.fft(signal)
# 绘图
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
x = np.linspace(0, 1, 1000)
y = np.fft.fftfreq(signal.size, 1/1000)
X, Y = np.meshgrid(x, y)
Z = np.abs(Pxx)
ax.plot_surface(X, Y, Z)
plt.show()
总结
Numpy是一个强大的Python库,其中包括FFT算法和计算傅里叶变换的函数。在使用不同的库时,如Scipy和Numpy,在绘制FFT图形时会有所不同。我们可以通过可视化方式呈现FFT图形,包括箱形图、热图和表面图等,来更好地理解信号的性质。