1

在列表(大小 1024)上执行 FFT 和 FFTShift 之后,我现在正在尝试绘制输出。我在尝试以我想要的方式显示数据时遇到了一些问题。

http://i.imgur.com/HTpiX.png

目前 x 轴显示 bin 编号。在 FFT 移位之后,频率 0 Hz 位于 bin 编号 512 处,每个 bin 值额外增加 2000/1024 Hz,因此 bin 0 应为 -1000 Hz,bin 1023 应为 +1000 Hz;bin 1 应为 -998.05 Hz,bin 1022 应为 +998.05,以此类推。

我试过使用 xticks 来显示这个:

xlocs, xlabs = plt.xticks()
plt.xticks([0,(len(a)*0.25),(len(a))/2,(len(a)*0.75),len(a)],[(-1000),(-500),0,500,1000])

但是后来我无法实际读取图表上特定点的 x 值,而只显示 y 值和 x=。有什么办法可以解决这个问题吗?

此外,我还想将整个图表向左平移 302 个 bin。无论如何我可以做到这一点吗?

4

2 回答 2

3

您应该更改绘制图形的方式,即在绘制之前从箱中计算频率:

import numpy as np
import matplotlib.pyplot as plt

bins = np.arange(-512, 512)
x = 2000.*bins/1024
plt.plot(x, fft_data)

然后,您可以使用调整显示的频率范围plt.xlim

于 2012-11-16T12:16:10.530 回答
1

您还可以使用辅助函数fftfreq,它会为您提供适当缩放的频率。然后,您可以fftshift同时应用于fftfreq数组。如果你然后绘制为

plot(freq,fft_vals)

你会得到你想要的结果。

x手动设置 xticks 时无法读取值的原因是您可以将任何内容作为刻度标签(例如字符串、非单调序列等)放入,因此 matplotlib 不知道如何确定x值画布上的任意点(请参阅在 matplotlib 中设置 tickslabel 禁用鼠标光标位置)。

于 2012-11-17T19:03:53.987 回答