[Tutor] fourier transform

Jeff Peery jeffpeery at yahoo.com
Wed Aug 3 18:27:19 CEST 2005


Hi again, is there a good reason why the output is dependant upon the sampling rate. in the example if you increase from say 64 to 128 samples the output increases by a factor of 2.
 

Christian Meesters <meesters at uni-mainz.de> wrote:
Hi Jeff,

On 3 Aug 2005, at 02:03, Jeff Peery wrote:
> hope this is more clear. from the output I would expect that two 
> spikes appear with amplitude = 1. 
[snip]
> I don't understand the output amplitudes. they should all be zero 
> except for at one herz it should be one. not sure about the frequency 
> for that matter either. I gotta dig up my math book and figure this 
> out. in the meantime any suggestions for what this is outputing would 
> be greatly appreciated! thanks.
>  

Yes, well, the math book idea might be a good one ;-). No, but 
seriously: You are just making a little mistake. First of all you are 
NOT exactly calculating a Fourier transform but a numerical estimation 
of it (you are dealing with an array of discrete data points, which is 
unavoidable when dealing with computers ;-)). Look on your sine wave. 
Is it a perfect one? Then, what do you see when you plot your data? 
Some 'noise' and one little peak. The noise is due to errors which have 
to do with floating point arithmetics (see 
http://docs.python.org/tut/node16.html). It's really small and in most 
cases I'm sure it's neglectable as well.
But when looking on your idea of what you would expect, I'm wondering 
whether you actually want a power spectrum estimation (see 
http://mathworld.wolfram.com/PowerSpectrum.html)? Try

myFFT = abs(fft.fft(inp))

instead of

myFFT = fft.real_fft(inp)

This a least might come close to what I think you want to see, right?

You might have a look on

myFFt = fft.fft(inp).real

as well, because it might make things to appear a little clearer.

One more remark: Try to avoid overwriting python key words like 'input'.

Hope this helped.

Cheers
Christian

PS Here is the code I used. It looks a bit different from yours - I 
hope the comments help a bit:

from numarray import *
import numarray.fft as fft

#at least one of the numbers should be floating point here
period = 1.0
#use numarray's / Numpy's pi instead of 3.14...
inp = sin(arange(0,64)*pi*2/64.0)

myFFT = abs(fft.fft(inp))
#or
#myFFt = fft.fft(inp).real
#or
#myFFT = fft.real_fft(inp)
#depending on what you really want
dtime = period/64.0

dfreq = 1.0/dtime

for i in range(len(myFFT)):
print myFFT[i], dfreq*i


-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.python.org/pipermail/tutor/attachments/20050803/823cf143/attachment-0001.htm


More information about the Tutor mailing list