Skip to main content

Comparing ordinates between FourierTransform and Fourier


I have a test function ff[t_] := Exp[-t^2 - t].


I have calculated the Fourier transform with FourierTransform:


f[ω_] = FourierTransform[Exp[-t^2 - t], t, ω, FourierParameters -> {1, 1}]

enter image description here


Then, I have calculated the Fourier transform with Fourier:


time = Range[1, 1000, 0.1];

Fa = Table[ff[time[[i]]], {i, 1, 1000}];
dF = Fourier[Fa, FourierParameters -> {1, 1}];
ListLinePlot[Abs[dF]]

enter image description here


I know how to get the DFT with the x-axis represented by the frequency.


(I'd need some examples representing the relationship between FT continues and DFT.)


Why do the values ​​on the ordinates between Fourier and FourierTransform not coincide? Is it a problem of the directive FourierParameters?



Answer



Several points are raised by this question. The key issue to understand is how FourierTransform and Fourier are scaled. A second issue is to decide if you want single or double sided Fourier transforms. Finally there is the issue of how to plot the results of Fourier so that the data runs from negative to positive frequencies.



If you use FourierTrasformyou will get a double sided Fourier Transform that performs an integration running from -∞ to ∞. From your attempt with Fourier it looks like you were trying to go from 0 to ∞.


The issues with scaling a Fourier transform prove to be difficult because there are many conventions and Mathematica allows you to choose your own by using FourierParameters. It is best to see what the individual scaling parameters do and use Parseval's Theorem to work out what is happening. Parseval's Theorem relates the integral of the squared values in the time domain to the integral of the squared values in the frequency domain.


First I define your function and take its FourierTransform. I have added a HeavisideTheta[t] because I am going to assume that you wish to go from 0 to ∞ (single sided transform).


ClearAll[ff, f];
ff[t_] := Exp[-t^2 - t];
f[ω_] :=
Evaluate@FourierTransform[HeavisideTheta[t] Exp[-t^2 - t],
t, ω, FourierParameters -> {0, -1}];

We can now plot the transformed function.



Plot[Abs@f[ω], {ω, -25, 25}, 
PlotRange -> {All, {0, 0.25}}]

Mathematica graphics


Now I calculate the integral square values in the time domain and the frequency domain to examine Parseval's Theorem.


int1 = NIntegrate[ff[t]^2, {t, 0, ∞}];
int2 = NIntegrate[
f[ω] Conjugate[
f[ω]], {ω, -∞, ∞},
Method -> "GaussKronrodRule"];

{int1, int2}

(* {0.32784, 0.32784} *)

The results are the same showing that with this set of FourierParameters Parseval's Theorem works directly. Other parameters would not give this result. Now we know how the Fourier transform is scaled we can look to see how the numerical transform is scaled.


First I look at the time history to judge how many points and what time increment to use.


Plot[ff[t], {t, 0, 5}, PlotRange -> All] 

Mathematica graphics


We need a small sample rate but the data is essentially zero by 5 so I choose



tinc = 0.001;  (* time increment *)
sr = 1/tinc; (* sample rate in Hz *)
nn = 5000; (* number of points, choose even number *)
time = Table[(n - 1) tinc, {n, nn}];

and have calculated my time abscissae. Note that the OP slipped and did not start at 0.


The data is easily calculated and the numerical Fourier transform determined using


Fa = ff[#] & /@ time;
dF = Fourier[Fa, FourierParameters -> {0, -1}];


We can see what Parseval's Theorem gives for the numerical results


{Fa.Fa, dF.Conjugate[dF]}
(* {328.34, 328.34 + 0. I} *)

Thus for these FourierParameters the theorem holds but gives different values to those found above. Thus we need to introduce terms to compensate. If you look at FourierParametersin the documentation for Details and Options then you can work out what is happening. To get the frequency axis for the numerical Fourier transform we need to generate the appropriate abscissae and then we can rescale the numerical Fourier transform to get


freq = Table[2 π (n - 1) sr/Length[dF], {n, nn}];
Show[
Plot[Abs@f[ω], {ω, 0, 25},
PlotRange -> {All, {0, 0.25}}],
ListPlot[

Transpose[{freq, tinc /Sqrt[2 π] Sqrt[nn] Abs@dF}][[1 ;; 21]]]
]

Mathematica graphics


There is now good agreement between FourierTransform and Fourier. Finally we would like to show the equivalence for positive and negative frequencies. This we can do by using the fact that the numerical Fourier transform is periodic and write


freq2 = Table[2 π (n - 1) sr/Length[dF], {n, -(nn/2) + 1, nn/2}];
dF2 = Join[dF[[nn/2 + 1 ;; -1]], dF[[1 ;; nn/2]]];
Show[
Plot[Abs@f[ω], {ω, -25, 25},
PlotRange -> {All, {0, 0.25}}],

ListPlot[
Transpose[{freq2, tinc /Sqrt[2 π] Sqrt[nn] Abs@dF2}][[


nn/2 - 26 ;; nn/2 + 25]]]
]

Mathematica graphics


Again there is good agreement. I have written some introductory notes for Fourier here


Hope that helps.



Comments

Popular posts from this blog

plotting - How to draw lines between specified dots on ListPlot?

I would like to create a plot where I have unconnected dots and some connected. So far, I have figured out how to draw the dots. My code is the following: ListPlot[{{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4,13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full] I have thought using ListLinePlot command, but I don't know how to specify to the command to draw only selected lines between the dots. Do have any suggestions/hints on how to do that? Thank you. Answer One possibility would be to use Epilog with Line : ListPlot[ {{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4, 13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full, Epilog -> { Line[ ...

dynamic - How can I make a clickable ArrayPlot that returns input?

I would like to create a dynamic ArrayPlot so that the rectangles, when clicked, provide the input. Can I use ArrayPlot for this? Or is there something else I should have to use? Answer ArrayPlot is much more than just a simple array like Grid : it represents a ranged 2D dataset, and its visualization can be finetuned by options like DataReversed and DataRange . These features make it quite complicated to reproduce the same layout and order with Grid . Here I offer AnnotatedArrayPlot which comes in handy when your dataset is more than just a flat 2D array. The dynamic interface allows highlighting individual cells and possibly interacting with them. AnnotatedArrayPlot works the same way as ArrayPlot and accepts the same options plus Enabled , HighlightCoordinates , HighlightStyle and HighlightElementFunction . data = {{Missing["HasSomeMoreData"], GrayLevel[ 1], {RGBColor[0, 1, 1], RGBColor[0, 0, 1], GrayLevel[1]}, RGBColor[0, 1, 0]}, {GrayLevel[0], GrayLevel...

Is there a way to do conditional matrix loop using 'continue'

I have the following: n = 3; m = 5; ww = RandomReal[{0, 0.1}, {n, n}]; uu = RandomReal[{0, 1}, {m, n}]; pp = RandomReal[{0, 1}, {n, n}]; ss = RandomInteger[{0, 5}, {m, n}]; Grid[{{"ww", "uu", "pp", "ss"}, {ww // TableForm, uu // TableForm, pp // TableForm, ss // TableForm}}, Spacings -> {5, 2}, Dividers -> All] where I would like to look at every element of matrix ss and produce a matrix tt , with zeroes at the locations in ss which have zeroes, and in all other positions do the following: tt = (-1/Subscript[ww, m]) Log[(1 - uu)/(Subscript[pp, m - 1])], where Subscript[ww, m] is the value at index of ww matrix and where Subscript[pp, m - 1] is the value at index-1 of pp matrix. So for example if the first value ever read from matrix ss happens to be 2, then value taken from matrix ww would be from the row 2, but from pp would be from row 1. Also how to tell difference between a 0 as a valid value from within the matrix elemen...