2015-01-25 2 views
0

Я пытаюсь взять БПФ и построить его. Проблема в том, что мой код работает для небольших частот (например, 50), но не работает для больших частот, которые мне нужны. Что происходит с моим кодом ?! Я ожидаю увидеть всплеск на частоте синусоидальной волны I, но шип на разных частотах зависит от используемого множителя.Странный выход FFT python

bins = 600 
ss = 2048 
freq = 44100 
centerfreq = freq*bins/ss 
# Number of samplepoints 
N = ss 
# sample spacing 
T = 1/800. 
x = np.linspace(0.0, N*T, N) 
y = sin(2*np.pi*centerfreq*x) 
yf = fft(y) 
xf = np.linspace(0.0, 1.0/(2.0*T), N/2) 
plt.plot(xf, 2.0/N * np.abs(yf[0:N/2]), 'r') 
+1

Что вы подразумеваете под "это не работает"? Каковы были исходные данные, что вы ожидали увидеть, что на самом деле произошло? –

+0

Входы указаны в коде, который я разместил (бины, ss, freq); выход представляет собой всплеск на графике как частоту, не связанную с «centerfreq» в коде выше. Кажется, когда я изменяю значение «Т», он перемещает шип. –

ответ

2

код правильно, вам нужно освежить свои теории Фурье и Найквиста Sampling теорему и убедитесь, что цифры имеют смысл. Проблема заключается в вашей шкале по оси x. Функция plot отображает первый элемент в x с первым элементом в y, если x не масштабируется по вашим ожиданиям, вы находитесь в неожиданности. Вы также видите это, если вы строите синусоидальный сигнал (синусоида) и ожидаете «градусов», и вы получаете, например, радианы. Его обязанность - масштабировать его так, чтобы он соответствовал вашим ожиданиям.

См. Так ОТВЕТ https://stackoverflow.com/a/25735436/2061422.

from scipy import * 
from numpy import * 
from pylab import * # imports for me to get going 

bins = 600 
ss = 2048 
freq = 44100 
centerfreq = freq*bins/ss 
print centerfreq 
# Number of samplepoints 
N = ss 
# sample spacing 
T = 1./freq # i have decreased the spacing considerably 
x = np.linspace(0.0, N*T, N) 
sample_spacing = x[1] - x[0] # but this is the real sample spacing 
y = sin(2*np.pi*centerfreq*x) 
yf = fft(y) 
xf = np.linspace(0.0, 1.0/(2.0*T), N/2) 
freqs = np.fft.fftfreq(len(y), sample_spacing) # read the manual on this fella. 
plt.plot(freqs[:N/2], 1.0/N * np.abs(yf[0:N/2]), 'r') 
plt.grid() 
plt.show() 
Смежные вопросы