我正在尝试了解matplotlib.mlab.psd()
函数返回的频率分档。
使用以下代码我可以检查返回的频率,我不相信它们是正确的。
import matplotlib.mlab as ml
import numpy as np
sampf=500.
nfft=2**4
testdat=np.random.randn(10000,)
p2,f2=ml.psd(testdat, nfft,sampf,sides='twosided')
p1,f1=ml.psd(testdat, nfft,sampf,sides='onesided')
print testdat.shape
print "Twosided"
print "\tbin1 : {:f} ".format(f2[0])
print "\tbin2 : {:f} ".format(f2[1])
print "\tbinlast : {:f} ".format(f2[-1])
print "onesided"
print "\tbin1 : {:f} ".format(f1[0])
print "\tbin2 : {:f} ".format(f1[1])
print "\tbinlast : {:f} ".format(f1[-1])
print "recreate"
f3=np.arange(nfft)*(sampf/2.)/nfft
print "\tbin1 : {:f} ".format(f3[0])
print "\tbin2 : {:f} ".format(f3[1])
print "\tbinlast : {:f} ".format(f3[-1])
给出了这个输出:
Twosided
bin1 : -250.000000
bin2 : -218.750000
binlast : 218.750000
onesided
bin1 : 0.000000
bin2 : 31.250000
binlast : 250.000000
recreate
bin1 : 0.000000
bin2 : 15.625000
binlast : 234.375000
我是否正确地认为双面情况下的最大频率(binlast)应该是采样频率的一半?
关注this SO post我认为它应该是sampf / 2。
答案 0 :(得分:2)
所有单方面的做法都不是回到负面。
因为您正在传递一个真实的信号f_hat(w) = conj(f_hat(-w))
(即负Ω的傅立叶分量是欧米茄组分的复共轭),因此它们将具有相同的幅度,因此就功率谱而言是多余的。
如果你错过了sampf/2
,那是因为有一个与偶数步骤有关的问题,但如果要包含0并且完全对称,需要和奇数个点。请注意,在双面情况下,最负面的频率为-sampf/2
,而您的最大误差为sampf/2
一个二进制步骤。您的重建箱最后是(nfft-1)/nfft * (sampf/2)
并且由于我怀疑浮动舍入错误而错过了该值。