[R] FFT Normalization Documentation

Martin Maechler maechler at lynne.stat.math.ethz.ch
Thu Feb 5 09:05:43 CET 2015


Dear Jeff, Franklin, Eike and other interested parties,

I agree that the help page for fft() deserves a bit more detail;
its source is
  https://svn.r-project.org/R/trunk/src/library/stats/man/fft.Rd

For instance, it has the comment
  %%
  %% Here, we should really have a nice  \deqn{}{} giving the definition
  %% of the DFT !
  %%

and indeed, the example is minimal, depicting in which sense the
fft(*, inverse=TRUE) is the inverse of fft().

Both a definition of the DFT (in LaTeX or directly as \deqn{}{}) which
matches *our* fft(), and an extended commented example (ca 20 lines,
rather than ca 100 lines!) would be welcome additions.
If you are willing to donate a bit of time to the R project,
we (the R users world!) will be happy for extended versions of
the file fft.Rd  either in public, here, or as 'wishlist' bug
report with an attachment if you want -- or by e-mail to me.
You may also chose to discuss an "optimal example" by e-mail
between you, as you've already started to do so, implicitly.

Martin Maechler, ETH Zurich


>>>>> Jeff Newmiller <jdnewmil at dcn.davis.ca.us>
>>>>>     on Tue, 3 Feb 2015 19:43:25 -0800 writes:

    > I see now the trick... the square wave clarified it for
    > me. It is indeed faster than re-arranging the data if
    > putting the zero frequency in the middle of the data is
    > your goal.

    > Since I only do that for the purposes of teaching I
    > probably won't be using it, but it may well be an
    > interesting "trick" to put in the examples.

    > On Tue, 3 Feb 2015, Franklin Bretschneider wrote:

    >> Dear Elke; Jeff,
    >> 
    >> 
    >> Re:
    >> 
    >>> Eike: Understanding Discrete Fourier Transform theory is
    >>> not trivial... while a vignette added to the stat
    >>> package has the potential help a lot of users, it is a
    >>> bit ambitious to try to supplant the extensive published
    >>> material on using and interpreting the DFT (particularly
    >>> as there is "more than one way to do it" and the R fft()
    >>> function is very typical of fft
    >>> implementations). (Similar arguments could be applied to
    >>> most of the stat package... note the absence of
    >>> vignettes there.) It might be more practical to propose
    >>> to R-devel some patches to the fft() help file
    >>> references and examples sections. Alternatively, you
    >>> could write YAB (Yet Another Blog) for people to search
    >>> for.
    >>> 
    >>> Frank: While folding is an important concept to know
    >>> about when interpreting DFT results, I think something
    >>> went rather wrong in your example with your "mask"
    >>> variable since folding applies to f (for forward fft) or
    >>> t (for inverse fft), not to the corresponding
    >>> magnitudes. In addition to that, it is simply not
    >>> necessary to pre-fold your data before applying the
    >>> fft... the folding is assumed by the math to exist in
    >>> the input outside the input window, and there is nothing
    >>> you can do to the data to affect that
    >>> assumption. Folding in the output is more visibly
    >>> evident, but presenting it as a symmetric plot is
    >>> entirely optional and is not done in most cases.
    >> 
    >> 
    >> 
    >> Maybe I didn't use the proper terminology, but what I
    >> called 'folding' is a modification of the input signal
    >> used only to present the amplitude spectrum in a
    >> convenient way. The FFT ("butterfly algorithm") yields a
    >> complex array where the highest frequencies (pos and neg)
    >> are in the middle, the lowest (and DC and fNyq) are at
    >> the ends. To display this same array with the DC value in
    >> the middle, the neg frequencies increasing to the left
    >> and the pos frequencies to the right, the trick with the
    >> +1/-1 mask is performed. This mask function is in fact a
    >> "square wave" at the Nyquist frequency.  In Matlab, it is
    >> in a routine called "fftshift", see here:
    >> 
    >>> 
    >>> Y = fftshift(X) rearranges the outputs of fft, fft2, and
    >>> fftn by moving the zero-frequency component to the
    >>> center of the array. It is useful for visualizing a
    >>> Fourier transform with the zero-frequency component in
    >>> the middle of the spectrum.
    >>> 
    >> 
    >> This is from the MathWorks web site:
    >> http://nl.mathworks.com/help/matlab/ref/fftshift.html.
    >> 
    >> In addition, in my example I forgot to scale the
    >> amplitude. This must indeed be divided by n (the number
    >> of data points).  So, change my line YY <- fft(yy) into
    >> YY <- fft(yy)/n. Now the amplitudes of the spectral line
    >> are numerically the same as given in the composition of
    >> y.  These values must indeed be regarded with caution,
    >> since with real-world signals the energy will most often
    >> be spread among several spectral "lines".  Windowing
    >> (Hann, Hanning, Blackman etc.) then improves the
    >> spectrum, but that's a different story.
    >> 
    >> Best wishes,
    >> 
    >> 
    >> Frank
    >> ---
    >> 
    >> 
    >> 
    >> 
    >> Franklin Bretschneider Dept of Biology Utrecht University
    >> bretschr at xs4all.nl
    >> 
    >> 
    >> 

    > ---------------------------------------------------------------------------
    > Jeff Newmiller The .....  .....  Go Live...
    > DCN:<jdnewmil at dcn.davis.ca.us> Basics: ##.#.  ##.#.  Live
    > Go...  Live: OO#.. Dead: OO#..  Playing Research Engineer
    > (Solar/Batteries O.O#.  #.O#.  with /Software/Embedded
    > Controllers) .OO#.  .OO#.  rocks...1k

    > ______________________________________________
    > R-help at r-project.org mailing list -- To UNSUBSCRIBE and
    > more, see https://stat.ethz.ch/mailman/listinfo/r-help
    > PLEASE do read the posting guide
    > http://www.R-project.org/posting-guide.html and provide
    > commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list