我查看了python“matplotlib.pylab”库,并允许我使用“plt.hist”函数绘制直方图。问题是它只需要一个数据参数,即一个数组。在我的例子中,我想绘制傅立叶变换产生的数据的直方图。傅里叶变换显示各种频率的相对数量。所以我可以把这个数量的数组放到“plt.hist”中并获得一个信息图表,但x轴不会以频率为单位。我的猜测是x轴只是数组的索引,但是当我绘制它时,即使这似乎也不正确。 谢谢,
答案 0 :(得分:3)
制作X
的直方图的天真答案,时域信号的DFT x
import matplotlib.pyplot as plt
import numpy as np
...
w = np.linspace(0,N*dw-dw,N)
plt.bar(w, abs(X), align='center', width=dw)
plt.show()
对于看起来很漂亮的情节,你必须考虑X
与频率0*dw, 1*dw, ..., (N-1)*dw
相关联,并且在一个漂亮的情节中,你通常想要使用范围{{1} },-N*dw/2
为你的横纹。
+N*dw/2
这是迄今为止的结果
如你所见,这种类型的情节强调DFT的周期性,但通常将DFT绘制在零频率的中心,这可以这样做
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(57)
N = 64 ; dw = 0.2
w = np.linspace(0,N*dw-dw,N)
X = 200 + (np.arange(N)-N/2)**2*np.random.random(N)
plt.bar(w, abs(X), align='center', width=dw)
plt.xticks([i*8*dw for i in range(N/8)]+[N*dw-dw/2])
plt.xlim(-dw/2,N*dw-dw/2)
plt.show()
这就是结果
我描述的程序是针对OP需求的良好程序,但我想说w2=np.concatenate((w-N*dw,w))
X2=np.concatenate((X,X)
plt.bar(w2, abs(X2), align='center', width=dw)
plt.xticks([i*8*dw for i in range(-N/16,1+N/16)])
plt.xlim(-dw*N/2,dw*N/2)
plt.show()
数据已经在现场合成,并且与现实生活中的DFT没有相似之处。相反,如果我看到上面的情节,我会对时域中的采样率不足做出评论。