MathGroup Archive 2012

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Fourier DFT scaling problem

  • To: mathgroup at smc.vnet.net
  • Subject: [mg126603] Re: Fourier DFT scaling problem
  • From: "Kevin J. McCann" <kjm at KevinMcCann.com>
  • Date: Wed, 23 May 2012 03:30:14 -0400 (EDT)
  • Delivered-to: l-mathgroup@mail-archive0.wolfram.com
  • References: <jpflom$ktd$1@smc.vnet.net>

Fourier will do the job, but I do not understand why you are doing the 
rotates.

Here is a slightly different take on your problem with a Parseval check 
at the end. (Just copy and drop it into an empty notebook.)

Cheers,

Kevin


Psi[x_] := \[Pi]^(-1/4) E^(-(x^2/2))

\[ScriptCapitalN] = 2^8;
L = 32.0;
\[CapitalDelta]x = L/\[ScriptCapitalN];
x = -16 + Table[i, {i, 0, \[ScriptCapitalN] - 1}]*\[CapitalDelta]x;
\[CapitalDelta]k = 1/L;

f = Psi[x];
k = Table[n \[CapitalDelta]k, {n, 0, \[ScriptCapitalN] - 1}];

F = \[CapitalDelta]x Fourier[f, FourierParameters -> {1, -1}];
ListPlot[Transpose[{k, Abs[F]^2}], PlotRange -> All, Joined -> True]
(* This part rotates the k-spectrum so it "looks right" *)
krot = Table[
    n \[CapitalDelta]k, {n, -(\[ScriptCapitalN]/2), \[ScriptCapitalN]/
      2 - 1}];
Frot = RotateRight[F, \[ScriptCapitalN]/2];
ListPlot[Transpose[{krot, Abs[Frot]^2}], PlotRange -> All,
  Joined -> True]
(* Check that Parseval is right *)
{Total[Abs[f]^2] \[CapitalDelta]x, Total[Abs[F]^2] \[CapitalDelta]k}

On 5/22/2012 5:20 AM, Arthur wrote:
> Hi all.
>
> I hope someone can help me with what seems to be a fairly elementary problem, nevertheless I have spent a good deal of time trying to come to a solution without any success. I am fairly new to the Fourier transform.
>
> My problem is that the output of the Fourier[] command has a scaling dependency on my sampling parameters which I cannot figure out how to remove.
>
> In general I have a numerical function Psi[x] (a wavefunction) and I would like to compute an approximation to the Fourier transform F[Psi[x]] ~~ Psihat[k].
>
> I am assuming the best way to achieve this is using the built in Fourier[] function.
>
> Now although I expect to have a numerical function Psi[x] my problem is apparent even when I define Psi[x] analytically.
>
> If I have
>
>
>
> Psi[x_] := (Pi^(-1/4)) (E^(-x^2/2))
>
> and take the continuous FT
>
> FourierTransform[Psi[x], x, k]
>
> OUT: (Pi^(-1/4)) (E^(-k^2/2))
>
> The output is as expected an identical function of k (since Psi[x] was a normalized eigenfunction of the FT).
>
> If I try to take the DFT of Psi[x] however:
>
> /******CODE******/
>
> n1 = 2^8.; (* sampling points *)
> L = 32.; (* domain [-L/2,L/2] *)
> dx = L/n1; (*step size*)
>
> X = Table[-dx n1/2 + (n - 1) dx, {n, n1}]; (* lattice *)
>
> rot[X_] := RotateLeft[X, n1/2]; (* rotate input/output of fourier *)
> F[X_] := rot@Fourier@rot@X; (* DFT *)
>
> SetOptions[ListLinePlot, PlotRange ->  {{-L/2, L/2}, {0, 1}},
>   DataRange ->  {-L/2, L/2}, Filling ->  Axis];
>
> ListLinePlot[Abs[Psi[X]]^2]
> ListLinePlot[Abs[F@Psi[X]]^2]
>
>
> /******END******/
> The second graph of the squared modulus of F@Psi[X] is evidently incorrectly scaled. Moreover this scaling error is not improved by increasing the sampling frequency, and is in fact exacerbated by it.
>
> It seems reasonable that the scaling be dependent on the value dx, though I have done a lot of experimentation with the FourierParameters command to remove this dependence though I can't get it to work in a way that is independent of the choice of Psi[x].
>
> Any help would be *greatly* appreciated!
>
> Thanks and best regards,
>
> Arthur
>



  • Prev by Date: Re: export to .m using a cell command
  • Next by Date: bubblechart axis scaling
  • Previous by thread: Fourier DFT scaling problem
  • Next by thread: Re: Fourier DFT scaling problem