[SciPy-User] frequency components of a signal buried in a noisy time domain signal

Nils Wagner nwagner at iam.uni-stuttgart.de
Fri Feb 26 14:05:08 EST 2010


Hi all,

A common use of Fourier transforms is to find the 
frequency components of a signal buried in a noisy time 
domain signal.

I found a Matlab template at

http://www.mathworks.com/access/helpdesk/help/techdoc/ref/fft.shtml

Matlab has a function

nextpow2(L)

Is there a similar build-in function in numpy/scipy ?
  
I tried to convert the m-file into a pythonic form.
What is needed to obtain a similar figure of the 
single-sided amplitude spectrum using 
numpy/scipy/matplotlib ?


from numpy import sin, linspace, pi
from numpy.random import randn
from pylab import plot, show, title, xlabel, ylabel
from scipy.fft import fft

Fs = 1000. #                          Sampling frequency
T  = 1./Fs #                          Sample time
L  = 1000  #                          length of signal
t  = arange(0,L)*T
x  = 0.7*sin(2*pi*50*t)+sin(2*pi*120*t)
y  = x + 2*randn(len(t))
plot(Fs*t[:50],y[:50])
title('Signal corrupted with zero-mean random noise')
xlabel('Time (milliseconds)')
#
#
#
#NFFT = 2^nextpow2(L); # Next power of 2 from length of y

Y = fft(y,NFFT)/L
f = Fs/2*linspace(0,1,NFFT/2+1)
plot(f,2*abs(Y[:NFFT/2+1]))
title('Single-sided amplitude spectrum of y(t)')
xlabel('Frequency (Hz)')
ylabel('|Y(f)|')
show()


What can be done in case of nonequispaced data ?

http://dx.doi.org/10.1137/0914081

Thanks in advance

                     Nils



More information about the SciPy-User mailing list