1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
  
     | 
    
      <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 The GSL Team.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with no
Invariant Sections and no cover texts.  A copy of the license is
included in the section entitled "GNU Free Documentation License". -->
<!-- Created by GNU Texinfo 5.1, http://www.gnu.org/software/texinfo/ -->
<head>
<title>GNU Scientific Library – Reference Manual: Radix-2 FFT routines for complex data</title>
<meta name="description" content="GNU Scientific Library – Reference Manual: Radix-2 FFT routines for complex data">
<meta name="keywords" content="GNU Scientific Library – Reference Manual: Radix-2 FFT routines for complex data">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="index.html#Top" rel="start" title="Top">
<link href="Function-Index.html#Function-Index" rel="index" title="Function Index">
<link href="Fast-Fourier-Transforms.html#Fast-Fourier-Transforms" rel="up" title="Fast Fourier Transforms">
<link href="Mixed_002dradix-FFT-routines-for-complex-data.html#Mixed_002dradix-FFT-routines-for-complex-data" rel="next" title="Mixed-radix FFT routines for complex data">
<link href="Overview-of-complex-data-FFTs.html#Overview-of-complex-data-FFTs" rel="previous" title="Overview of complex data FFTs">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.indentedblock {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
div.smalllisp {margin-left: 3.2em}
kbd {font-style:oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nocodebreak {white-space:nowrap}
span.nolinebreak {white-space:nowrap}
span.roman {font-family:serif; font-weight:normal}
span.sansserif {font-family:sans-serif; font-weight:normal}
ul.no-bullet {list-style: none}
-->
</style>
</head>
<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
<a name="Radix_002d2-FFT-routines-for-complex-data"></a>
<div class="header">
<p>
Next: <a href="Mixed_002dradix-FFT-routines-for-complex-data.html#Mixed_002dradix-FFT-routines-for-complex-data" accesskey="n" rel="next">Mixed-radix FFT routines for complex data</a>, Previous: <a href="Overview-of-complex-data-FFTs.html#Overview-of-complex-data-FFTs" accesskey="p" rel="previous">Overview of complex data FFTs</a>, Up: <a href="Fast-Fourier-Transforms.html#Fast-Fourier-Transforms" accesskey="u" rel="up">Fast Fourier Transforms</a>   [<a href="Function-Index.html#Function-Index" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="Radix_002d2-FFT-routines-for-complex-data-1"></a>
<h3 class="section">16.3 Radix-2 FFT routines for complex data</h3>
<a name="index-FFT-of-complex-data_002c-radix_002d2-algorithm"></a>
<a name="index-Radix_002d2-FFT_002c-complex-data"></a>
<p>The radix-2 algorithms described in this section are simple and compact,
although not necessarily the most efficient.  They use the Cooley-Tukey
algorithm to compute in-place complex FFTs for lengths which are a power
of 2—no additional storage is required.  The corresponding
self-sorting mixed-radix routines offer better performance at the
expense of requiring additional working space.
</p>
<p>All the functions described in this section are declared in the header file <samp>gsl_fft_complex.h</samp>.
</p>
<dl>
<dt><a name="index-gsl_005ffft_005fcomplex_005fradix2_005fforward"></a>Function: <em>int</em> <strong>gsl_fft_complex_radix2_forward</strong> <em>(gsl_complex_packed_array <var>data</var>, size_t <var>stride</var>, size_t <var>n</var>)</em></dt>
<dt><a name="index-gsl_005ffft_005fcomplex_005fradix2_005ftransform"></a>Function: <em>int</em> <strong>gsl_fft_complex_radix2_transform</strong> <em>(gsl_complex_packed_array <var>data</var>, size_t <var>stride</var>, size_t <var>n</var>, gsl_fft_direction <var>sign</var>)</em></dt>
<dt><a name="index-gsl_005ffft_005fcomplex_005fradix2_005fbackward"></a>Function: <em>int</em> <strong>gsl_fft_complex_radix2_backward</strong> <em>(gsl_complex_packed_array <var>data</var>, size_t <var>stride</var>, size_t <var>n</var>)</em></dt>
<dt><a name="index-gsl_005ffft_005fcomplex_005fradix2_005finverse"></a>Function: <em>int</em> <strong>gsl_fft_complex_radix2_inverse</strong> <em>(gsl_complex_packed_array <var>data</var>, size_t <var>stride</var>, size_t <var>n</var>)</em></dt>
<dd>
<p>These functions compute forward, backward and inverse FFTs of length
<var>n</var> with stride <var>stride</var>, on the packed complex array <var>data</var>
using an in-place radix-2 decimation-in-time algorithm.  The length of
the transform <var>n</var> is restricted to powers of two.  For the
<code>transform</code> version of the function the <var>sign</var> argument can be
either <code>forward</code> (<em>-1</em>) or <code>backward</code> (<em>+1</em>).
</p>
<p>The functions return a value of <code>GSL_SUCCESS</code> if no errors were
detected, or <code>GSL_EDOM</code> if the length of the data <var>n</var> is not a
power of two.
</p></dd></dl>
<dl>
<dt><a name="index-gsl_005ffft_005fcomplex_005fradix2_005fdif_005fforward"></a>Function: <em>int</em> <strong>gsl_fft_complex_radix2_dif_forward</strong> <em>(gsl_complex_packed_array <var>data</var>, size_t <var>stride</var>, size_t <var>n</var>)</em></dt>
<dt><a name="index-gsl_005ffft_005fcomplex_005fradix2_005fdif_005ftransform"></a>Function: <em>int</em> <strong>gsl_fft_complex_radix2_dif_transform</strong> <em>(gsl_complex_packed_array <var>data</var>, size_t <var>stride</var>, size_t <var>n</var>, gsl_fft_direction <var>sign</var>)</em></dt>
<dt><a name="index-gsl_005ffft_005fcomplex_005fradix2_005fdif_005fbackward"></a>Function: <em>int</em> <strong>gsl_fft_complex_radix2_dif_backward</strong> <em>(gsl_complex_packed_array <var>data</var>, size_t <var>stride</var>, size_t <var>n</var>)</em></dt>
<dt><a name="index-gsl_005ffft_005fcomplex_005fradix2_005fdif_005finverse"></a>Function: <em>int</em> <strong>gsl_fft_complex_radix2_dif_inverse</strong> <em>(gsl_complex_packed_array <var>data</var>, size_t <var>stride</var>, size_t <var>n</var>)</em></dt>
<dd>
<p>These are decimation-in-frequency versions of the radix-2 FFT functions.
</p>
</dd></dl>
<p>Here is an example program which computes the FFT of a short pulse in a
sample of length 128.  To make the resulting Fourier transform real the
pulse is defined for equal positive and negative times (<em>-10</em>
… <em>10</em>), where the negative times wrap around the end of the
array.
</p>
<div class="example">
<pre class="verbatim">#include <stdio.h>
#include <math.h>
#include <gsl/gsl_errno.h>
#include <gsl/gsl_fft_complex.h>
#define REAL(z,i) ((z)[2*(i)])
#define IMAG(z,i) ((z)[2*(i)+1])
int
main (void)
{
  int i; double data[2*128];
  for (i = 0; i < 128; i++)
    {
       REAL(data,i) = 0.0; IMAG(data,i) = 0.0;
    }
  REAL(data,0) = 1.0;
  for (i = 1; i <= 10; i++)
    {
       REAL(data,i) = REAL(data,128-i) = 1.0;
    }
  for (i = 0; i < 128; i++)
    {
      printf ("%d %e %e\n", i, 
              REAL(data,i), IMAG(data,i));
    }
  printf ("\n");
  gsl_fft_complex_radix2_forward (data, 1, 128);
  for (i = 0; i < 128; i++)
    {
      printf ("%d %e %e\n", i, 
              REAL(data,i)/sqrt(128), 
              IMAG(data,i)/sqrt(128));
    }
  return 0;
}
</pre></div>
<p>Note that we have assumed that the program is using the default error
handler (which calls <code>abort</code> for any errors).  If you are not using
a safe error handler you would need to check the return status of
<code>gsl_fft_complex_radix2_forward</code>.
</p>
<p>The transformed data is rescaled by <em>1/\sqrt n</em> so that it fits on
the same plot as the input.  Only the real part is shown, by the choice
of the input data the imaginary part is zero.  Allowing for the
wrap-around of negative times at <em>t=128</em>, and working in units of
<em>k/n</em>, the DFT approximates the continuum Fourier transform, giving
a modulated sine function.
</p>
<hr>
<div class="header">
<p>
Next: <a href="Mixed_002dradix-FFT-routines-for-complex-data.html#Mixed_002dradix-FFT-routines-for-complex-data" accesskey="n" rel="next">Mixed-radix FFT routines for complex data</a>, Previous: <a href="Overview-of-complex-data-FFTs.html#Overview-of-complex-data-FFTs" accesskey="p" rel="previous">Overview of complex data FFTs</a>, Up: <a href="Fast-Fourier-Transforms.html#Fast-Fourier-Transforms" accesskey="u" rel="up">Fast Fourier Transforms</a>   [<a href="Function-Index.html#Function-Index" title="Index" rel="index">Index</a>]</p>
</div>
</body>
</html>
 
     |