Numpy:为什么scipy和numpy FFT的图形看起来不同

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图形,包括箱形图、热图和表面图等,来更好地理解信号的性质。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程