Re: Attach frequency list to a list of fourier tranformed numbers
- To: mathgroup at smc.vnet.net
- Subject: [mg14696] Re: Attach frequency list to a list of fourier tranformed numbers
- From: "Peltio" <peltioNOS at PAMyahoo.com>
- Date: Sun, 8 Nov 1998 21:15:53 -0500
- Organization: Peltio Inc.
- References: <720rsl$1sn@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Hi, Raymond
Your question:
How do I attach the actual frequency values to a list of numbers
transformed using the Fourier[list] command?
My answer:
Here's what I do.
Actually the answer depends on what the initial data mean. Let's suppose
we're in time domain, and that you have sampled a waveform over an
interval T with sampling time Ts, that is you have the values at t=
0,Ts,2Ts,...,kTs,..(n-1)Ts. (henceTs=T/n) The frequencies associated
are f=1/T and fmax=1/Ts. Your Fourier transformed data will span an
interval fmax wide with step f. But, beware!, your spectrum is folded,
so you will go with the "real" values from frequency 0 to frequency
fnyq=fmax/2 and from then on (fnyq to fmax) you'll have a folded copy
of the first part.
To associate the frequencies to the spectrum we need to know either the
sampling time Ts or the interval duration T, but let's start with the
continuous signal of frquency 2 Hz
f[t_]:=Sin[ 2Pi 2t ]
data=Table[ { t , f[t]+0.Random[Real,{-.5,.5}]}, {t,0,5,5/255} ];
Length[data]
Out[1]=256
(incidentally, powers of two are what Fourier crunching motors do
expect)
Let's scorporate time values from signal values
trange=#[[1]]&/@data; signal=#[[2]]&/@data;
the interval duration and the sampling interval are
T=(Max[trange]-Min[trange])// N ; Ts=T/Length[trange//N ;
frequency will vary from 0 to 1/Ts in 256 steps 1/T wide
frange=Range[0,1/Ts-1/T,1/T];
Length[frange]
Out[48]=256
Now we calculate the Fourier transform of the 256 point data
transform=Fourier[signal]/Sqrt[Length[signal]]//Chop;
Length[transform]
Out[49]=256
and finally we put the frequency data together
modulo=Transpose[{frange,Abs[transform]}];
Try this to see that indeed your spectrum shows two peaks at 2Hz and at
49.2 (that is 51.2-2) Hx.
The value at 51.2 is 1/Ts, while 2 is the frequency of the sinusoid we
used to build our data set
ListPlot[modulo,PlotRange->All,PlotJoined->True]
Show[%,PlotRange->{{0,10},All}]
In case you prefer it you can even unfold your spectrum so to show the
components at negative frequencies, spanning from -fnyq to +fnyq. But
at this point it's quite straightforward.
What worries me is that to do this in general, *I think*, you'll have to
discern between the case with an even number of points and an odd
number, and worst still you need to know wether frequency 0 is
comprised in the data set or not (-1,0,1,... or -1.5,-0.5,0.5,1.5,..).
So I, too, have a question for the newsgroup: is there a simple and
straigthforward method to unfold the spectrum regardless of this
matter?
Hope that helps.
Regards,
Peltio