2016-07-22 3 views
2

На графике FFT (второй) я ожидаю более высокий пик на частоте = 1,0, по сравнению с другими частотами, поскольку это сигнал квадратной волны 1 Гц, отснятый на частоте 5 Гц.Как найти частоту прямоугольной волны с использованием FFT

Я новичок в этом, возможно, что-то отсутствует глупую здесь Вот что я сделал:

import numpy as np 
from matplotlib import pyplot as plt 
from scipy import signal 
t500 = np.linspace(0,5,500,endpoint=False) 
s1t500 = signal.square(2*np.pi*1.0*t500) 

Первый график показывает 1 Гц Square Wave сэмпл в 5Гц в течение 5 секунд:

t5 = np.linspace(0,5,25,endpoint=False) 
t5 = t5 + 1e-14 
s1t5 = signal.square(2.0*np.pi*1.0*t5) 
plt.ylim(-2,2); plt.plot(t500,s1t500,'k',t5,s1t5,'b',t5,s1t5,'bo'); plt.show() 

1 Hz Square Wave sampled at 5Hz

Здесь, на втором участке, я ожидаю, что магнит itude при f = 1 Гц будет больше, чем при f = 2. Я что-то упускаю ?

y1t5 = np.fft.fft(s1t5) 
ff1t5 = np.fft.fftfreq(25,d=0.2) 
plt.plot(ff1t5,y1t5); plt.show() 

FFT for 1 Hz Square Wave sampled at 5Hz

+0

Это свойство DFT, я нашел аналогичный пример в документации по matlab: http://de.mathworks.com/help/matlab/math/discrete-fourier-transform-dft.html – jojonas

ответ

4

Кажется, вы пропустили тот факт, что преобразование Фурье производит функцию (или последовательность чисел в случае DFT/FFT) в комплексном пространстве:

>>> np.fft.fft(s1t5) 
[ 5. +0.j   0. +0.j   0. +0.j   0. +0.j   0. +0.j 
    5.-15.38841769j 0. +0.j   0. +0.j   0. +0.j   0. +0.j 
    5. +3.63271264j 0. +0.j   0. +0.j   0. +0.j   0. +0.j 
# and so on 

Для того, чтобы увидеть спектр амплитуды на вашем участке, применять np.absolute или abs:

>>> np.absolute(np.fft.fft(s1t5)) 
[ 5.   0.   0.   0.   0.   16.18033989 
    0.   0.   0.   0.   6.18033989 0.   0. 
    0.   0.   6.18033989 0.   0.   0.   0. 
    16.18033989 0.   0.   0.   0.  ] 

В противном случае будет показана только реальная часть.

+0

Что делать, если Я использую 'np.fft.rfft', если это не возвращает ожидаемую зависимость 1/n? – jojonas

+0

Если у вас есть симметричная прямоугольная волна, тогда FFT будет полностью реальным (для точности машины): вот пример этого в Matlab: http://blogs.mathworks.com/steve/2010/07/16/ complex-surpriseises-from-fft/ –

+0

@AhmedFasih OP преобразует не фактическую квадратную волну 1 Гц, а набор образцов, полученных с частотой дискретизации 5 Гц. Это вводит мнимую часть. – Vovanrock2002

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