Python matplotlib返回的最大PSD频率bin是否错误?

Python matplotlib返回的最大PSD频率bin是否错误?,python,matplotlib,fft,sampling,psd,Python,Matplotlib,Fft,Sampling,Psd,我试图理解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,

我试图理解
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)应该是采样频率的一半,对吗


下面我认为它的范围应该是sampf/2。

所有的单面都不返回负面

因为您正在处理一个实信号
f_hat(w)=conj(f_hat(-w))
(即负ω处的傅里叶分量是ω处分量的复共轭),因此它们将具有相同的幅度,因此在功率谱方面是冗余的


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

是的,我知道我传递的数据是真实的,因此我只需要FFT的一半。我的问题是频率箱应该标记什么值?如果我做双面fft,那么最大bin频率应该是(sampf/2)还是((sampf/2)-(2/nfft))?再次阅读我答案的最后一段,然后阅读。好的,因此我用较低的nfft重新计算了值,以表明没有舍入误差。wiki页面(和其他页面)指出单面fft的最后一个bin应该是((sampf/2)-(1/nfft))。因此,您关于实际数据双面fft对称性的观点表明,第一个箱子应标记为-((sampf/2)-(1/nfft))。这不是matplotlib函数返回的结果,我感兴趣的是want。我想知道我是否可以信任stock函数。您有偶数个存储箱(如果您使用的fft长度的幂为2)。您需要包括0->您必须在正或负的一侧有一个以上的频率栏。这是DFFT的结构。我向您保证,FFT的numpy实现1)正确2)无缺陷3)比您将编写的任何东西都更高效