Vous êtes sur la page 1sur 6

# Introduction

This document describes several 'Fast Fourier Transform' (FFT) algorithms, which may be used to efficiently evaluate the Discrete Fourier Transform (DFT). It does not describe the properties of the Discrete Fourier Transform in detail, nor does it attempt to explain why you should want to evaluate a DFT in the first place. It does contain a little detail on FFT based convolution, largely because this needed to understand some of the FFT algorithms. If you'd like to read this document off line you can download the zipped version (go to http://www.pkware.com/ if you don't know how to unzip). Please direct any comments about this document to theWeb Master. Of course, FFT algorithms cannot be properly understood without some understanding of the properties of the DFT. So, where necessary, the some of the relevant properties are presented in this document. The only thing you really need to understand before reading this document are the use of complex numbers in signal processing. Here's a very brief refresher on complex numbers: Imaginary Numbers Define:

## So the square root of any negative real number -x (x is positive!) is:

Complex Numbers A complex number A is the sum of real (ar) and imaginary (j.ai) part:

## Note both ar and ai are assumed to be real. Complex Addition:

Complex Multiplication:

Modulus:

## (The modulus is real.) Complex Conjugate:

Complex Division:

## Complex Exponentials (x is real):

(The arctan function above must work over 4 quadrants, by taking account of the signs ar and ai separately.)

## Definition of DFT and Inverse DFT (IDFT).

Given a sequence of N samples f(n), indexed by n = 0..N-1, the Discrete Fourier Transform (DFT) is defined as F(k), where k=0..N-1:

F(k) are often called the 'Fourier Coefficients' or 'Harmonics'. The sequence f(n) can be calculated from F(k) using the Inverse Discrete Fourier Transform (IDFT):

In general, both f(n) and F(k) are complex. Annex A shows that the IDFT defined above really is an inverse DFT. Conventionally, the sequences f(n) and F(k) is referred to as 'time domain' data and 'frequency domain' data respectively. Of course there is no reason why the samples in f(n) need be samples of a time dependant signal. For example, they could be spatial image samples (though in such cases a 2 dimensional set would be more common). Although we have stated that both n and k range over 0..N-1, the definitions above have a periodicity of N:

So both f(n) and F(k) are defined for all (integral) n and k respectively, but we only need to calculate values in the range 0..N-1. Any other points can be obtained using the above periodicity property. For the sake of simplicity, when considering various Fast Fourier Transform (FFT) algorithms, we shall ignore the scaling factors and simply define the FFT and Inverse FFT (IFFT) like this:

In fact, we shall only consider the FFT algorithms in detail. The inverse FFT (IFFT) is easily obtained from the FFT.

## Some Simple Transforms.

Here are some simple DFT's expressed as matrix multiplications. 1 point DFT:

2 point DFT:

4 point DFT:

3 point DFT:

Note that each of the matrix multipliers can be inverted by conjugating the elements. This what we would expect, given that the only difference between the DFT and IDFT is the sign of the complex exponential argument.

## Here's another couple of useful transforms: If..

This is the 'Delta Function'. The usual implied periodicity has been made explicit by using MOD N. The DFT is therefore:

This gives us the DFT of a unit impulse at n=n0. Less obvious is this DFT: If..

## Annex A - IDFT really is the Inverse DFT.

This can easily be verified by substituting the definition of the DFT into the IDFT definition, changing the summation index of the DFT from n to m to avoid name capture problems (n is a dummy variable, so can be changed freely without altering the value of the expression):

The inner summation above is zero for all m<>n, and equal to N for m=n, (m,n = 0..N1). (The proof of this is presented in Annex B.) In other words, using 'Kroneker Delta' notation: