Matplotlib 如何正确地绘制信号FFT以得到正确的频率
Matplotlib 如何正确地绘制信号FFT以得到正确的频率
在本文中,我们将介绍如何使用Matplotlib正确地绘制信号的FFT,并在x轴上得到正确的频率。
首先,我们需要了解一些基本概念。FFT代表快速傅里叶变换,用于将信号从时域转换为频域。频率表示信号的周期性和重复性,通常以Hz为单位。在信号FFT中,y轴表示信号功率的量度,x轴表示频率。
让我们看一个例子。假设我们有一个正弦信号,频率为10 Hz,采样率为1000 Hz,并且我们想要绘制它的FFT。代码如下:
import numpy as np
import matplotlib.pyplot as plt
# Generate a sine wave with 10 Hz frequency
t = np.linspace(0, 1, 1000, False)
x = np.sin(2 * np.pi * 10 * t)
# Plot the sine wave
plt.plot(t, x)
plt.show()
# Plot the FFT of the sine wave
yf = np.fft.fft(x)
xf = np.linspace(0.0, 1.0 / (2.0 * (1 / 1000)), 500)
plt.plot(xf[:250], 2.0 / 1000 * np.abs(yf[:250]))
plt.show()
我们首先生成了一个频率为10 Hz的正弦信号,并将其在时域中绘制出来。然后,我们使用np.fft.fft函数计算信号FFT,并使用np.linspace函数生成x轴上的频率值。最后,我们将FFT绘制在频域上,并将x轴上的频率截断到频率的一半(因为FFT的信号是对称的)。
然而,如果我们检查上面代码中的xf数组,我们会发现它只包含频率的一半:
[0.00000000e+00 4.00801603e-03 8.01603206e-03 1.20240240e-02 ...
这是因为np.fft.fft函数返回了一个长度为n的FFT数组,其中包含了0到(n-1)的频率值,而我们只需要频率的一半。
为了解决这个问题,我们可以使用np.fft.fftfreq函数来生成完整的频率值数组,然后再将其截断一半。
下面是修复后的代码:
import numpy as np
import matplotlib.pyplot as plt
# Generate a sine wave with 10 Hz frequency
t = np.linspace(0, 1, 1000, False)
x = np.sin(2 * np.pi * 10 * t)
# Plot the sine wave
plt.plot(t, x)
plt.show()
# Plot the FFT of the sine wave
yf = np.fft.fft(x)
xf = np.fft.fftfreq(len(x), 1 / 1000)
xf = xf[:len(x) // 2]
plt.plot(xf, 2.0 / 1000 * np.abs(yf[:len(x) // 2]))
plt.show()
我们使用np.fft.fftfreq函数生成了完整的频率数组,然后使用“[:len(x) // 2]”来截断一半的频率值。现在,我们在x轴上有了正确的频率值。
问题解决了,但这并不是我们终极的目标。我们想要将x轴的频率转换成更易读的单位。为此,我们可以使用plt.xticks函数来更改x轴上的标记。
下面是一个例子:
import numpy as np
import matplotlib.pyplot as plt
# Generate a sine wave with 10 Hz frequency
t = np.linspace(0, 1, 1000, False)
x = np.sin(2 * np.pi * 10 * t)
# Plot the sine wave
plt.plot(t, x)
plt.show()
# Plot the FFT of the sine wave
yf = np.fft.fft(x)
xf = np.fft.fftfreq(len(x), 1 / 1000)
xf = xf[:len(x) // 2]
# Convert the x-axis from Hz to kHz
xf = xf / 1000
plt.plot(xf, 2.0 / 1000 * np.abs(yf[:len(x) // 2]))
plt.xticks(np.arange(0, 6, 1))
plt.show()
在这个例子中,我们将x轴的频率从Hz转换为kHz,并使用plt.xticks函数更改标记。这样,我们就可以更轻松地理解信号的频率内容。
阅读更多:Matplotlib 教程
总结
在本文中,我们介绍了如何使用Matplotlib绘制信号FFT,并在x轴上得到正确的频率。我们通过一个例子演示了如何生成一个频率为10 Hz的正弦波信号,并将其绘制出来。然后,我们使用np.fft.fftfreq生成了完整的频率值数组,并使用plt.xticks函数将x轴的频率值改成更方便的单位。现在,我们可以更容易地理解信号的频率特性。