2013-07-09 3 views
1

Я пытаюсь понять частотные ячейки, возвращенные функцией matplotlib.mlab.psd().Является ли максимальный бит частоты PSD возвращенным matplotlib неправильно?

Используя следующий код, я могу проверить возвращаемые частоты, и я не уверен, что они верны.

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) для 2-сторонней случае должна составлять половину частоты дискретизации?

this SO post Я думаю, что он должен варьироваться от sampf/2.

ответ

2

Все односторонние не возвращают отрицательную сторону.

Поскольку вы передаете реальный сигнал f_hat(w) = conj(f_hat(-w)) (то есть компонент Фурье при отрицательной омеге является комплексным сопряжением компонента на омеге), таким образом, они будут иметь одинаковую величину и, следовательно, в терминах спектра мощности избыточны.

Если вам не хватает точно sampf/2, это связано с проблемами, связанными с наличием четного числа шагов, но требующим и нечетным количеством точек, если вы собираетесь включить 0 и быть абсолютно симметричным. Обратите внимание, что в вашем двухстороннем случае самая отрицательная частота - -sampf/2, и ваши максимальные промахи sampf/2 одним шагом бункера. Ваш последний бит реконструкции - (nfft-1)/nfft * (sampf/2) и пропускает значение из-за подозрительной ошибки округления округления.

+0

Да, я понимаю, что данные, которые я передаю, являются Реальными, и поэтому мне нужна только половина БПФ. Мой вопрос в том, какие значения должны быть отмечены на ящиках частот? Если я делаю двустороннюю fft, тогда должна быть максимальная частота буфера (sampf/2) или должна быть ((sampf/2) - (2/nfft))? – mor22

+0

Прочтите последний параграф моего ответа, а затем прочитайте https://en.wikipedia.org/wiki/Fast_Fourier_transform. – tacaswell

+0

Итак, я пересчитал значения с более низким значением nfft, чтобы показать, что ошибки округления нет. Страница wiki (и другие) указывает, что последний бит одностороннего fft должен быть ((sampf/2) - (1/nfft)). Ваша точка относительно симметричного характера для двухстороннего fft реальных данных указывает, что первый бит должен быть помечен как ((sampf/2) - (1/nfft)). Это не то, что возвращается функцией matplotlib, которая мне интересна. Я хочу знать, могу ли я доверять функции запаса. – mor22