我试图了解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。

最佳答案

单方面的都不是消极的一面。

因为您要上交真实信号f_hat(w) = conj(f_hat(-w))(也就是说,在负ω处的傅立叶分量是在ω处的分量的复共轭),所以它们将具有相同的幅度,因此在功率谱方面是多余的。

如果您缺少精确的sampf/2,则是因为与步数偶数有关,但如果要包括0且完全对称,则需要的点数与奇数有关,这是一对一的问题。请注意,在您的双面情况下,最大负频率为-sampf/2,最大未命中sampf/2为1档。您的重建bin最后为(nfft-1)/nfft * (sampf/2),并且由于我怀疑浮点舍入错误而错过了该值。

10-04 10:47