如何使用`np.fft.fft`制作PSD图?

时间:2018-04-17 21:46:00

标签: python numpy signal-processing fft

我想使用numpy.fft.fft函数绘制信号的功率谱密度与频率的关系图。我想这样做,这样我就可以保留变换中的复杂信息并知道我在做什么,因为它依赖于numpy提供的更高级别的功能(如periodogram功能)。我正在关注Mathwork关于使用Matlab的fft函数进行PSD分析的精彩页面:https://www.mathworks.com/help/matlab/ref/fft.html

在这个例子中,我期望PSD以我用于构造信号的频率达到峰值,在这种情况下为100。我使用1000个时间点生成信号,频率为100个反时限单位。我认为fft幅度可以针对[0, nt/2]进行绘制,峰值会出现在频率中能量最多的地方。当我这样做时,事情出了问题。我预计我的PSD将达到峰值100。

如何使用np.fft.fft制作频率与能量中包含的频谱密度图?

修改

澄清,在我的实际问题中,我只知道我的特征频率比我的采样频率大得多

import matplotlib.pyplot as plt
import numpy as np
t = np.arange(1000)
sp = np.fft.fft(np.sin(100 * t * np.pi))
trange = np.linspace(0, t[-1] / 2, t.size)
plt.plot(trange, np.abs(sp) / t.size)
plt.show()

enter image description here

这是我预期输出的草图:

enter image description here

1 个答案:

答案 0 :(得分:1)

您的采样频率是多少?您生成的序列可以根据采样频率表示无限数量的连续时间信号。 采样频率需要至少是最大信号频率的两倍,如采样定理所述,因此,使用fs = 250Hz并使用10秒的正弦变为:

import matplotlib.pyplot as plt
import numpy as np

fs = 250
t = np.arange(0, 10, 1/fs)
sp = np.fft.fft(np.sin(2*np.pi * 100 * t))
trange = np.linspace(0, fs, len(t))
plt.plot(trange, np.abs(sp))
plt.show()

如果你运行它,你会看到一个100Hz的峰值。