如何使用 scipy 在 python 中绘制 fft 并修改频率范围,以便它在中心显示两个峰值频率?

How do I plot an fft in python using scipy and modify the frequency range so that it shows the two peaks frequencies in the center?

以下 Python 代码使用 numpy 生成正弦曲线图的频率图:

import numpy as np
import matplotlib.pyplot as plt
import scipy.fftpack

# Number of samplepoints
N = 600
# sample spacing
T = 1.0 / 800.0
x = np.linspace(0.0, N*T, N)
y = np.sin(50.0 * 2.0*np.pi*x) + 0.5*np.sin(80.0 * 2.0*np.pi*x)
yf = scipy.fftpack.fft(y)
xf = np.linspace(0.0, 1.0/(2.0*T), N//2)

fig, ax = plt.subplots()
ax.plot(xf, 2.0/N * np.abs(yf[:N//2]))
plt.show()

根据上面的代码,我们正在绘制具有两个频率的正弦波,一个频率为 50Hz,另一个频率为 80Hz。您可以清楚地看到傅里叶变换图显示了这两个频率的峰值。

我的问题:如何修改上面的代码,使x轴的范围为0-100Hz?

如果我改变

xf = np.linspace(0.0, 1.0/(2.0*T), N//2)

xf = np.linspace(0.0, 100, N//2)

然后我的图表看起来像:

但是图表现在显示我的峰值在 11 和 20Hz 左右,这是不正确的。当我改变我的轴时,峰值不应该改变。

我做错了什么?

import numpy as np
import matplotlib.pyplot as plt
import scipy.fftpack

# Number of samplepoints
N = 600
# sample spacing
T = 1.0 / 800.0
x = np.linspace(0.0, N*T, N)
y = np.sin(50.0 * 2.0*np.pi*x) + 0.5*np.sin(80.0 * 2.0*np.pi*x)
yf = scipy.fftpack.fft(y)
xf = np.linspace(0.0, 1.0/(2.0*T), N//2)

fig, ax = plt.subplots()
ax.plot(xf, 2.0/N * np.abs(yf[:N//2]))
ax.set(
    xlim=(0, 100)
)
plt.show()

只需添加 xlim