Fourier transform with python

I have a set of data. It is obviously have some periodic nature. I want to find out what frequency it has by using the fourier transformation and plot it out.

Here is a shot of mine, but it seems not so good.enter image description here

This is the corresponding code, I don't konw why it fails:

import numpy
from pylab import *
from scipy.fftpack import fft,fftfreq
import matplotlib.pyplot as plt
dataset = numpy.genfromtxt(fname='data.txt',skip_header=1)
t = dataset[:,0]
signal = dataset[:,1]
npts=len(t)

FFT = abs(fft(signal))
freqs = fftfreq(npts, t[1]-t[0])
subplot(211)
plot(t[:npts], signal[:npts])
subplot(212)
plot(freqs,20*log10(FFT),',')
xlim(-10,10)
show()

My question is:Since the original data is very periodic looking, and I expect to see that in the frequency domain the peak is very sharp; how can I make the peak nicer looking?

Upvotes: 1

Views: 6383

Answers (1)

B. M.
B. M.

Reputation: 18668

It's a problem of data analysis.

  • FFT works with complex number so the spectrum is symmetric on real data input : restrict on xlim(0,max(freqs)) .
  • The sampling period is not good : increasing period while keeping the same total number of input points will lead to a best quality spectrum on this exemple.

EDIT. with :

 dataset = numpy.genfromtxt(fname='data.txt',skip_header=1)[::30];
 t,signal = dataset.T
 (...)
 plot(freqs,FFT)
 xlim(0,1)
 ylim(0,30)    

the spectrum is

spectum

For best quality spectrum , just reacquire the signal for a long long time (for beautiful peaks), with sampling frequency of 1 Hz, which will give you a [0, 0.5 Hz] frequency scale (See Nyquist criterium).

Upvotes: 5

Related Questions