2015-08-04 4 views
2

Я очень новичок в Python, и у меня есть основная проблема понимания. Для меня кажется, что результат БПФ основан только на том, что выбранное вами linspace.FFT-результат в зависимости от python от выбранного linspace?

# Number of samplepoints 
N = 600 
# sample spacing 
T = 1.0/800.0 
x = p.linspace(0.0, N*T, N) 
y = p.sin(50.0 * 2.0*p.pi*x) + 0.5*p.sin(80.0 * 2.0*p.pi*x) 
yf = p.fft(y) 
xf = p.linspace(0.0, 1.0/(2.0*T), N/2) 

plt.plot(xf, 2.0/N * np.abs(yf[0:N/2])) 
plt.grid() 
plt.show() 

Запустив этот fft в качестве примера, я получаю два пика при 50 и 80 Гц. Когда я меняю xf на:

xf = p.linspace(0.0, 5.0/(2.0*T), N/2) 

Шипы около 250 и 400 Гц.

Не означает ли это, что я должен знать правильные результаты заранее (в этом случае частоты двух синусоидных волн, из которых состоит входной сигнал), так что я могу позже настроить масштабирование оси, чтобы она соответствовала эти результаты? Наверное, нет, поэтому я был бы рад, если бы кто-нибудь мог объяснить эту проблему.

ответ

1

Вы должны рассчитать правильные частоты в зависимости от частоты дискретизации, количества образцов и образцов, используемых в fft (NFFT). Алгоритм FFT не знает, в какой временной шкале вы работаете. Например, частотная ось также может быть задана с угловой частотой, и в этом случае вы просто масштабируете ось с помощью 2 * pi.

Следовательно, вы должны знать частоту дискретизации и количество выборок входного сигнала для создания правильной оси частот для результата FFT - вам, однако, не нужно ничего знать о форме входного сигнала (без учета проблемы с псевдонимом).

Частоты [Гц] можно вычислить с помощью:

dt = 0.0001 # your T 
Fs = 1/dt # sample rate 
xt = np.arange (0, 10, dt) 
nt = len (xt) # length of time series, your N 

# make signal 
st = .5 * np.sin (50 * 2 * np.pi * xt) + .5 * np.sin (80 * 2 * np.pi * xt) 

# take fourier transform and shift frequency spectra 
S = np.fft.fftshift(np.fft.fft (st)) 

## make argument array, frequency [Hz] 
# 
# extending from -Fs/2 to Fs/2, the Nyquist frequency, with the same 
# number of samples as in the time series (xt and st). 

freqs = Fs * np.linspace (-1/2, 1/2, nt) 

# plot absolute value, scaled with number of samples 
# (note that it is also interesting to plot the complex angle 
# using np.angle()). together they make a bode-plot. 

plt.plot (freqs, np.abs(S)/nt) 
plt.xlabel ('Frequency [Hz]') 
-1

Вы правильно вычисления FFT синусоидальной функции в:

yf = p.fft(y) 

Тогда вы ploting его против списка значений построенный с использованием пространства линий, что является неправильным. Вы должны наложить величину БПФ на ее частоту. См. Пример this.

Смежные вопросы