python - numpy fft 中的意外振幅

标签 python numpy fft

我遇到了一个问题,numpy fft 没有给我 fft 图中的预期幅度。这仅在特定时期作为输入发生。

我在 240 个数据点上使用周期为 25 个点的干净正弦信号。

np.fft.rfft 的峰值为 24。

enter image description here

我想知道是什么原因造成的。我认为干净的信号应该产生类似于 25 左右结果的狄拉克三角洲函数。我在某些时期得到这种类型的结果,但不是全部。是否需要多次重复这个周期才能准确指定周期?这对我来说没有意义。 fft 通过以下方式完成,其中 y=周期为 25 的正弦数据点:

fft = np.fft.rfft(y)
fft = abs(fft)
x=np.fft.rfftfreq(len(y),d=1./1)
x = 1/x # to convert from freq to periods. T = 1/f
plt.plot(x,fft)

最佳答案

回想一下,从技术上讲,FFT 是在信号的无限周期扩展上计算的。因此,如果您的信号不包含整数个周期,则周期性扩展将在周期边界处包含不连续性(在相位上,通常也在幅度上)。这将表现为您的信号在多个相邻频率仓之间出现“拖尾”。此外,请注意 FFT 的各个 bin 代表特定的频率(使用 fftfreq 作为列表);任何无法在单个 bin 中表示的频率都需要从附近的 bin 重建。

您可以通过应用窗口来改进 FFT 结果,例如通过将您的信号与窗口函数(通常类似于汉明、汉恩或升余弦滤波器)相乘,这将减少幅度不连续性,从而使您的峰值变锐利,但代价是信号边缘的一些精度。

关于python - numpy fft 中的意外振幅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66030740/

相关文章:

python - 按日期排序(字符串和日期时间)

python - 将字典插入 sqlite3 数据库 - python

python - Numpy - 数组中行和列的自定义排序

python - 是否可以在pygame中使用简单的旋转矩阵来模拟圆形轨道?

java - 如何检测超声波?

performance - 两个 Toeplitz 矩阵的乘积?

python - 套接字对象可以与 Python 的多处理共享吗? socket.close() 似乎不起作用

python - Matplotlib 不同颜色的刻度线和标签

python - 如何在 Spark/Pyspark 中通过 saveAsTextFile 保存不带方括号的列表

opencv - 如何在频域中旋转非正方形图像