[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
## Re: [Help-gsl] FFT

**From**: |
Francesco |

**Subject**: |
Re: [Help-gsl] FFT |

**Date**: |
Mon, 06 Jan 2014 20:57:58 +0100 |

**User-agent**: |
Mozilla/5.0 (X11; Linux i686; rv:24.0) Gecko/20100101 Thunderbird/24.2.0 |

Hi Klaus,
On 06/01/2014 15:30, Klaus Huthmacher wrote:

Dear fellows,

`I have another question concerning the FFT of the GSL. I wanted to
``start low and tried to transform a sine signal.
`

`Since I assume a data set I take into account real values and a length
``of any magnitude. Thus I end up with Section 16.7: Mixed - radix FFT
``routines for real data, am I right?
`

Right.

`But to be honest I do not fully grasp between the two methods
``real_transform and halfcomplex_transform. The first leads to an
``expected \delta - peak while the second method leads to 'oscillating
``boundaries'.
`

`I recognize that the documentation is not very clear. Actually the
``real_transform does a direct FFT transform in place by storing the
``result in half-complex form. The half_complex transform perform the
``*inverse* FFT transform by accepting data in half-complex format and
``returning real data.
`

`The GSL documentation show a clear example where some real temporal data
``are transformed using real_transform, them the half-complex vector is
``modified to remove some higher frequencies and the the inverse transform
``is done with halfcomplex_transform. The net result is the removal of
``high frequencies from the time resolved signal.
`

`Furthermore I am highly confused that the FFT functions only need the
``data in the sense of the 'values' of a function and not the
``corresponding x values.
`

`Well, in the FFT transform the data are implicitly supposed to be taken
``with uniform sampling. These is a consequence of its mathematic
``definition given in the GSL FFT chapter. For the direct (forward) transform:
`
x_j = \sum_{k=0}^{n-1} z_k \exp(-2\pi i j k / n)

`The fact that the exponential is proportional to "k" means that the
``temporal data is given with a uniform sampling. You should compare that
``to the definition of the fourier transform:
`
x_j = \int_{t = 0}^{1} z(t) \exp(- 2 \pi i j t / n) dt

`I thought to be quiete familier with the fouriertransform by solving
``equations with paper and pencil but this GSL implementation is curious.
`

`The FFT is the Fourier Transform but of a signal taken with a finite,
``fixed, sampling step. The Fourier Transform from book assume the signal
``is defined in an interval of real numbers so the time variable is
``actually continuous. In the FFT the time is "discrete".
`

`Another source of confusion is the packing convention with the
``halfcomplex format. The FFT routine are conceived to be efficient and
``this lead to some strange packing forms.
`

`Another important difference is that the FFT does need a finite set of
``frequencies and the negative frequencies aliases the higher frequencies.
``These are consequences of the finite sampling and does not happens in
``the fourier transform over a continuous variable.
`Can someone give me a little more insight?

Your example is quite right. If you modify it in this way:
std::vector<double> data;
unsigned N = 512;
unsigned order = 4;
for (unsigned i = 0; i < N; i++)
{
double x = double(order * i) * 2 * M_PI / double(N);
data.push_back( sin( x ) );
}
The output will be a pure "pulse" (dirac's delta). Here what I obtain:
5.04177e-15
-2.7399e-15
7.42739e-15
-3.21873e-16
7.66043e-15
5.63479e-15
3.9062e-14
-1.17761e-13
-256
-3.24479e-15
-4.43331e-14
4.93448e-16
-2.25068e-14
-4.25877e-15
-1.8501e-14
Essentially everything is zero except the term corresponding to "order".
Francesco

**[Help-gsl] FFT**, *Klaus Huthmacher*, `2014/01/06`
**Re: [Help-gsl] FFT**,
*Francesco* **<=**