FourierSeries.mw

Supplementary Notes on Fourier Series, DFT and FFT 

Continuous functions defined in terms of cos and sin 

Consider a function of the form Typesetting:-mrow(Typesetting:-mi( where Typesetting:-mrow(Typesetting:-mi( and Typesetting:-mrow(Typesetting:-mi( are constants. The value Typesetting:-mrow(Typesetting:-mi( is the period of the function. 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

`+`(a, `*`(b, `*`(sin(`+`(`/`(`*`(2, `*`(Pi, `*`(t))), `*`(T))))))) (1)
 

 

Set Typesetting:-mrow(Typesetting:-mi( to the following values. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

 

 

12
2
1 (2)
 

> Typesetting:-mrow(Typesetting:-mi(
 

Plot_2d
 

>
 

Remarks 

 

 

 

 

 

Next consider a function of the following form which has two Typesetting:-mrow(Typesetting:-mi( terms. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

`+`(a[0], `*`(b[2], `*`(sin(`+`(`*`(2, `*`(q, `*`(t))))))), `*`(b[20], `*`(sin(`+`(`*`(20, `*`(q, `*`(t)))))))) (3)
 

where Typesetting:-mrow(Typesetting:-mi( and where the period is Typesetting:-mrow(Typesetting:-mi(. 

> Typesetting:-mrow(Typesetting:-mi(
 

`+`(`/`(`*`(2, `*`(Pi)), `*`(T))) (4)
 

> Typesetting:-mrow(Typesetting:-mi(
 

240 (5)
 

> Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(
 

 

 

2
.5
.5 (6)
 

> Typesetting:-mrow(Typesetting:-mi(
 

Plot_2d
 

>
 

 

Let us look at the terms making up the sum. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

`+`(2, `*`(.5, `*`(sin(`+`(`*`(`/`(1, 60), `*`(Pi, `*`(t))))))), `*`(.5, `*`(sin(`+`(`*`(`/`(1, 6), `*`(Pi, `*`(t)))))))) (7)
 

> Typesetting:-mrow(Typesetting:-mi(
 

`+`(`*`(.5, `*`(sin(`+`(`*`(`/`(1, 60), `*`(Pi, `*`(t)))))))) (8)
 

> Typesetting:-mrow(Typesetting:-mi(
 

`+`(`*`(.5, `*`(sin(`+`(`*`(`/`(1, 6), `*`(Pi, `*`(t)))))))) (9)
 

> Typesetting:-mrow(Typesetting:-mi(
 

Plot_2d
 

>
 

Remarks 

 

 

 

 

 

>
 

> Typesetting:-mrow(Typesetting:-mi(
 

Plot_2d
 

>
 

Remarks 

 

 

 

 

 

>
 

 

Below is a table of the individual plots and the combined plot. 

 

>
 

Plot_2d 

Plot_2d 

Three plots 

 

  • Above left: The LowFreq term Typesetting:-mrow(Typesetting:-mi(
 

  • Above right: The HighFreq term  Typesetting:-mrow(Typesetting:-mi(
 

  • Lower right: The Combined function
       Typesetting:-mrow(Typesetting:-mi(
    Typesetting:-mrow(Typesetting:-mi(
    Typesetting:-mrow(Typesetting:-mi(
    Typesetting:-mrow(Typesetting:-mi(
 

Plot_2d 

Orthogonality Properties of cos and sin 

> Typesetting:-mrow(Typesetting:-mi(
 

 

We are interested in representing Typesetting:-mrow(Typesetting:-mi( in terms of a sum of trig functions as follows: 

 

Typesetting:-mrow(Typesetting:-mi( 

 

where the coefficients Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( and Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( are to be determined from the function Typesetting:-mrow(Typesetting:-mi(. 

 

For simplicity, suppose that the function is defined for Typesetting:-mrow(Typesetting:-mi(, with period Typesetting:-mrow(Typesetting:-mi(  so Typesetting:-mrow(Typesetting:-mi( will be represented in the following form. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

f(t) = `+`(a[0], Sum(`*`(a[k], `*`(cos(`*`(k, `*`(t))))), k = 1 .. infinity), Sum(`*`(b[k], `*`(sin(kt))), k = 1 .. infinity)) (10)
 

>
 

 

The following orthogonality properties allow us to determine formulas for Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( and Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( in terms of integrals involving  Typesetting:-mrow(Typesetting:-mi(. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

 

> Typesetting:-mrow(Typesetting:-mi(
 

 

> Typesetting:-mrow(Typesetting:-msubsup(Typesetting:-mo(
 

0 (11)
 

> Typesetting:-mrow(Typesetting:-msubsup(Typesetting:-mo(
 

0 (12)
 

> Typesetting:-mrow(Typesetting:-msubsup(Typesetting:-mo(
 

0 (13)
 

> Typesetting:-mrow(Typesetting:-msubsup(Typesetting:-mo(
 

0 (14)
 

> Typesetting:-mrow(Typesetting:-msubsup(Typesetting:-mo(
 

0 (15)
 

> Typesetting:-mrow(Typesetting:-msubsup(Typesetting:-mo(
 

0 (16)
 

 

We will also need the values 

 

> Typesetting:-mrow(Typesetting:-msubsup(Typesetting:-mo(
 

Pi (17)
 

> Typesetting:-mrow(Typesetting:-msubsup(Typesetting:-mo(
 

Pi (18)
 

 

By exploiting these orthogonality properties, we can derive a formula for each Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( and Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( . 

 

>
 

The formula for a0 

 

Recall equation (10). 

 

> Typesetting:-mrow(Typesetting:-mi(
 

f(t) = `+`(a[0], Sum(`*`(a[k], `*`(cos(`*`(k, `*`(t))))), k = 1 .. infinity), Sum(`*`(b[k], `*`(sin(kt))), k = 1 .. infinity)) (19)
 

 

On both sides of this equation, integrate over Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mn( . 

 

> Typesetting:-mrow(Typesetting:-msubsup(Typesetting:-mo(
 

int(f(t), t = 0 .. `+`(`*`(2, `*`(Pi)))) = `+`(`*`(2, `*`(a[0], `*`(Pi))), `*`(2, `*`(Sum(0, k = 1 .. infinity)))) (20)
 

> Typesetting:-mrow(Typesetting:-mi(
 

int(f(t), t = 0 .. `+`(`*`(2, `*`(Pi)))) = `+`(`*`(2, `*`(a[0], `*`(Pi)))) (21)
 

 

From this equation we immediately get the formula for Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( 

 

 

> Typesetting:-mrow(Typesetting:-mi(
 

a[0] = `+`(`/`(`*`(`/`(1, 2), `*`(int(f(t), t = 0 .. `+`(`*`(2, `*`(Pi)))))), `*`(Pi))) (22)
 

>
 

The formula for aK  (K > 0) 

 

Recall equation (10). 

 

> Typesetting:-mrow(Typesetting:-mi(
 

f(t) = `+`(a[0], Sum(`*`(a[k], `*`(cos(`*`(k, `*`(t))))), k = 1 .. infinity), Sum(`*`(b[k], `*`(sin(kt))), k = 1 .. infinity)) (23)
 

>
 

 

On both sides of this equation, multiply by Typesetting:-mrow(Typesetting:-mi( and then integrate over Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mn( . All of the terms on the right hand side integrate to zero except for one term, namely the term from the first summation when Typesetting:-mrow(Typesetting:-mi( yielding: 

 

> Typesetting:-mrow(Typesetting:-msubsup(Typesetting:-mo(
 

int(`*`(f(t), `*`(cos(`*`(K, `*`(t))))), t = 0 .. `+`(`*`(2, `*`(Pi)))) = `*`(a[K], `*`(Pi)) (24)
 

 

From this equation we immediately get the formula for Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( . 

 

> Typesetting:-mrow(Typesetting:-mi(
 

a[K] = `/`(`*`(int(`*`(f(t), `*`(cos(`*`(K, `*`(t))))), t = 0 .. `+`(`*`(2, `*`(Pi))))), `*`(Pi)) (25)
 

>
 

The formula for bK  (K > 0) 

 

Recall equation (10). 

 

> Typesetting:-mrow(Typesetting:-mi(
 

f(t) = `+`(a[0], Sum(`*`(a[k], `*`(cos(`*`(k, `*`(t))))), k = 1 .. infinity), Sum(`*`(b[k], `*`(sin(kt))), k = 1 .. infinity)) (26)
 

 

On both sides of this equation, multiply by Typesetting:-mrow(Typesetting:-mi( and then integrate over Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mn( . All of the terms on the right hand side integrate to zero except for one term, namely the term from the second summation when Typesetting:-mrow(Typesetting:-mi( yielding: 

 

> Typesetting:-mrow(Typesetting:-msubsup(Typesetting:-mo(
 

int(`*`(f(t), `*`(sin(`*`(K, `*`(t))))), t = 0 .. `+`(`*`(2, `*`(Pi)))) = `*`(b[K], `*`(Pi)) (27)
 

 

From this equation we immediately get the formula for Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( . 

 

> Typesetting:-mrow(Typesetting:-mi(
 

b[K] = `/`(`*`(int(`*`(f(t), `*`(sin(`*`(K, `*`(t))))), t = 0 .. `+`(`*`(2, `*`(Pi))))), `*`(Pi)) (28)
 

>
 

Example: Computing Fourier Series Coefficients 

 

Consider the following continuous function. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

proc (t) options operator, arrow; `+`(`*`(exp(`+`(`-`(`*`(2, `*`(t))))), `*`(cos(`+`(`*`(`^`(t, 2)), `*`(10, `*`(t)), 25)))), `*`(exp(`+`(`*`(2, `*`(t)), `-`(`*`(4, `*`(Pi))))), `*`(cos(`+`(`*`(4, `*`... (29)
 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

Plot_2d
 

 

Compute some of the Fourier coefficients of  Typesetting:-mrow(Typesetting:-mi(. 

 

Note: In the following, we use Maple's inert Typesetting:-mrow(Typesetting:-mi( operator and then we invoke numerical integration by applying Typesetting:-mrow(Typesetting:-mi( . 

 

> Typesetting:-mrow(Typesetting:-mi(
 

0.1053672272e-1 (30)
 

> Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
 

 

 

 

 

 

 

 

 

 

0.2149747532e-1
0.3654762655e-14
0.2283152111e-1
0.3892361272e-13
0.2527687576e-1
-0.2480610679e-14
0.2922382011e-1
-0.4873256505e-13
0.3534285151e-1
-0.5442543723e-14 (31)
 

 

Compute and store the Fourier coefficients up to Typesetting:-mrow(Typesetting:-mi( . 

 

> Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
 

 

Compute and store the partial sums of the Fourier series for Typesetting:-mrow(Typesetting:-mi( . 

 

> Typesetting:-mrow(Typesetting:-mo(
 

 

Display plots of Typesetting:-mrow(Typesetting:-mi( (in blue) superimposed on the plot of the original function Typesetting:-mrow(Typesetting:-mi( (in red). 

 

> Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
 

 

 

 

 

 

 

 

 

 

N = 5
Plot_2d
N = 10
Plot_2d
N = 15
Plot_2d
N = 20
Plot_2d
N = 25
Plot_2d
 

>
 

 

When Typesetting:-mrow(Typesetting:-mi( we see that the Fourier series approximation matches the original function very well. 

 

 

We can use the Maple command Typesetting:-mrow(Typesetting:-mi( to do "floating point normalization", meaning to round the numbers to a specified number of digits and to set to zero any values that are small relative to the number of digits specified. 

 

For example, suppose that we are interested in 4 digits of accuracy. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

4 (32)
 

> Typesetting:-mrow(Typesetting:-mi(
 

`+`(0.1053672272e-1, `*`(0.2149747532e-1, `*`(cos(t))), `*`(0.3654762655e-14, `*`(sin(t))), `*`(0.2283152111e-1, `*`(cos(`+`(`*`(2, `*`(t)))))), `*`(0.3892361272e-13, `*`(sin(`+`(`*`(2, `*`(t)))))), `...
`+`(0.1053672272e-1, `*`(0.2149747532e-1, `*`(cos(t))), `*`(0.3654762655e-14, `*`(sin(t))), `*`(0.2283152111e-1, `*`(cos(`+`(`*`(2, `*`(t)))))), `*`(0.3892361272e-13, `*`(sin(`+`(`*`(2, `*`(t)))))), `...
`+`(0.1053672272e-1, `*`(0.2149747532e-1, `*`(cos(t))), `*`(0.3654762655e-14, `*`(sin(t))), `*`(0.2283152111e-1, `*`(cos(`+`(`*`(2, `*`(t)))))), `*`(0.3892361272e-13, `*`(sin(`+`(`*`(2, `*`(t)))))), `...
`+`(0.1053672272e-1, `*`(0.2149747532e-1, `*`(cos(t))), `*`(0.3654762655e-14, `*`(sin(t))), `*`(0.2283152111e-1, `*`(cos(`+`(`*`(2, `*`(t)))))), `*`(0.3892361272e-13, `*`(sin(`+`(`*`(2, `*`(t)))))), `...
(33)
 

> Typesetting:-mrow(Typesetting:-mi(
 

`+`(0.1054e-1, `*`(0.2150e-1, `*`(cos(t))), `*`(0.2283e-1, `*`(cos(`+`(`*`(2, `*`(t)))))), `*`(0.2528e-1, `*`(cos(`+`(`*`(3, `*`(t)))))), `*`(0.2922e-1, `*`(cos(`+`(`*`(4, `*`(t)))))), `*`(0.3534e-1, ... (34)
 

 

Apply Typesetting:-mrow(Typesetting:-mi( to decrease the number of terms in Typesetting:-mrow(Typesetting:-mi( . 

 

> Typesetting:-mrow(Typesetting:-mi(
 

51 (35)
 

> Typesetting:-mrow(Typesetting:-mi(
 

`+`(`*`(0.5890e-1, `*`(cos(`+`(`*`(7, `*`(t)))))), `*`(0.4471e-1, `*`(cos(`+`(`*`(6, `*`(t)))))), `*`(.1211, `*`(cos(`+`(`*`(12, `*`(t)))))), `*`(.1363, `*`(cos(`+`(`*`(10, `*`(t)))))), `*`(0.7968e-1,...
`+`(`*`(0.5890e-1, `*`(cos(`+`(`*`(7, `*`(t)))))), `*`(0.4471e-1, `*`(cos(`+`(`*`(6, `*`(t)))))), `*`(.1211, `*`(cos(`+`(`*`(12, `*`(t)))))), `*`(.1363, `*`(cos(`+`(`*`(10, `*`(t)))))), `*`(0.7968e-1,...
`+`(`*`(0.5890e-1, `*`(cos(`+`(`*`(7, `*`(t)))))), `*`(0.4471e-1, `*`(cos(`+`(`*`(6, `*`(t)))))), `*`(.1211, `*`(cos(`+`(`*`(12, `*`(t)))))), `*`(.1363, `*`(cos(`+`(`*`(10, `*`(t)))))), `*`(0.7968e-1,...
`+`(`*`(0.5890e-1, `*`(cos(`+`(`*`(7, `*`(t)))))), `*`(0.4471e-1, `*`(cos(`+`(`*`(6, `*`(t)))))), `*`(.1211, `*`(cos(`+`(`*`(12, `*`(t)))))), `*`(.1363, `*`(cos(`+`(`*`(10, `*`(t)))))), `*`(0.7968e-1,...
(36)
 

> Typesetting:-mrow(Typesetting:-mi(
 

17 (37)
 

 

We have decreased the number of terms in Typesetting:-mrow(Typesetting:-mi( from Typesetting:-mrow(Typesetting:-mn( to Typesetting:-mrow(Typesetting:-mn( while retaining 4 digits of accuracy. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

Plot_2d
 

>
 

Complex exponential form 

 

As a more compact representation for Fourier series, we choose to use complex exponential form, based on the well-known relationships: 

 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-msup(Typesetting:-mo(
 

exp(`*`(i, `*`(theta))) = `+`(cos(theta), `*`(i, `*`(sin(theta)))) (38)
 

> Typesetting:-mrow(Typesetting:-msup(Typesetting:-mo(
 

exp(`+`(`-`(`*`(i, `*`(theta))))) = `+`(cos(theta), `-`(`*`(i, `*`(sin(theta))))) (39)
 

 

or 

 

> Typesetting:-mrow(Typesetting:-mi(
 

cos(theta) = `+`(`*`(`/`(1, 2), `*`(exp(`*`(i, `*`(theta))))), `*`(`/`(1, 2), `*`(exp(`+`(`-`(`*`(i, `*`(theta)))))))) (40)
 

> Typesetting:-mrow(Typesetting:-mi(
 

sin(theta) = `+`(`/`(`*`(`/`(1, 2), `*`(`+`(exp(`*`(i, `*`(theta))), `-`(exp(`+`(`-`(`*`(i, `*`(theta))))))))), `*`(i))) (41)
 

 

The complex exponential form for the Fourier series is 

 

> Typesetting:-mrow(Typesetting:-mi(
 

f(t) = Sum(`*`(c[k], `*`(exp(`*`(i, `*`(k, `*`(t)))))), k = `+`(`-`(infinity)) .. infinity) (42)
 

 

and by using orthogonality properties for complex exponentials similar to the case of Typesetting:-mrow(Typesetting:-mi( and Typesetting:-mrow(Typesetting:-mi(, one can show that 

 

> Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(
 

c[k] = `+`(`/`(`*`(`/`(1, 2), `*`(int(`*`(f(t), `*`(exp(`+`(`-`(`*`(i, `*`(k, `*`(t)))))))), t = 0 .. `+`(`*`(2, `*`(Pi)))))), `*`(Pi))) (43)
 

>
 

 

The correspondence between the coefficients Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( and the coefficients Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( , Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( in the Typesetting:-mrow(Typesetting:-mi(-Typesetting:-mrow(Typesetting:-mi( representation is as follows: 

 

Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(for Typesetting:-mrow(Typesetting:-mi(", mathvariant = "normal", fence = "false", separator = "false", stretchy = "false", symmetric = "fal..." align="center" border="0"> . 

 

We will see that in applications, we are most interested in the relative magnitudes of the coefficients corresponding to various frequencies Typesetting:-mrow(Typesetting:-mi( . Note that 

 

Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(   and   Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( . 

 

In typical applications, there is a small amount of information in the high-frequency terms. In other words, the coefficients Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( will be very small in magnitude for large Typesetting:-mrow(Typesetting:-mi(. Therefore, it is reasonable to truncate to a finite summation: 

 

> Typesetting:-mrow(Typesetting:-mi(
 

`≈`(f(t), Sum(`*`(c[k], `*`(exp(`*`(i, `*`(k, `*`(t)))))), k = `+`(`-`(M)) .. M)) (44)
 

 

for some integer Typesetting:-mrow(Typesetting:-mi( . 

 

>
 

Discrete Fourier Transform (DFT) 

Analogous to the continuous Fourier series discussed above, we define the Discrete Fourier Transform (DFT) as follows. 

 

 

 

 

 

 

 

 

 

 

 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

8 (45)
 

> Typesetting:-mrow(Typesetting:-mi(
 

Matrix(%id = 164475716) (46)
 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

 

The Vandermonde system is 

 

> Typesetting:-mrow(Typesetting:-mo(
 

`.`(M, Vector[column](%id = 165074972)) = Vector[column](%id = 165449888) (47)
 

>
 

 

 

 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

`+`(`*`(`/`(1, 2), `*`(`^`(2, `/`(1, 2)))), `*`(`*`(`/`(1, 2), `*`(I)), `*`(`^`(2, `/`(1, 2))))) (48)
 

> Typesetting:-mrow(Typesetting:-mi(
 

Matrix(%id = 153584640)
Matrix(%id = 153584640)
(49)
 

> Typesetting:-mrow(Typesetting:-mi(
 

Matrix(%id = 166957524)
Matrix(%id = 166957524)
Matrix(%id = 166957524)
Matrix(%id = 166957524)
Matrix(%id = 166957524)
Matrix(%id = 166957524)
Matrix(%id = 166957524)
Matrix(%id = 166957524)
Matrix(%id = 166957524)
Matrix(%id = 166957524)
Matrix(%id = 166957524)
Matrix(%id = 166957524)
(50)
 

> Typesetting:-mrow(Typesetting:-mi(
 

Matrix(%id = 167895484) (51)
 

>
 

 

 

 

>
 

Fast Fourier Transform (FFT) 

 

 

 

 

 

 

 

 

 

 

 

> Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
 

>
 

 

Forward FFT: 

Define Typesetting:-mrow(Typesetting:-mi( . 

 

Then  Typesetting:-mrow(Typesetting:-mi( 

 

Inverse FFT:
 

With Typesetting:-mrow(Typesetting:-mi( defined as above,
 

Typesetting:-mrow(Typesetting:-mi( . 

 

 

Example: 

 

> Typesetting:-mrow(Typesetting:-mi(
 

15 (52)
 

> Typesetting:-mrow(Typesetting:-mi(
 

8 (53)
 

> Typesetting:-mrow(Typesetting:-mi(
 

`+`(.707106781186550, `*`(.707106781186550, `*`(I))) (54)
 

> Typesetting:-mrow(Typesetting:-mi(
 

Vector[column](%id = 152621292) (55)
 

 

Forward FFT: 

 

> Typesetting:-mrow(Typesetting:-mi(
 

Vector[column](%id = 167614608) (56)
 

 

Check that the Inverse FFT recovers the original data values: 

 

> Typesetting:-mrow(Typesetting:-mi(
 

Vector[column](%id = 166378712) (57)
 

> Typesetting:-mrow(Typesetting:-mi(
 

Vector[column](%id = 168479684) (58)
 

> Typesetting:-mrow(Typesetting:-mi(
 

Vector[column](%id = 167685264) (59)
 

> Typesetting:-mrow(Typesetting:-mi(
 

Vector[column](%id = 168433400) (60)
 

>
 

Cost Analysis of FFT 

 

Note that the cost function Typesetting:-mrow(Typesetting:-mi( counting the number of arithmetic operations for procedure FFTeval satisfies the following recurrence equation. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

RunTime(N) = `+`(`*`(2, `*`(RunTime(`+`(`*`(`/`(1, 2), `*`(N)))))), `*`(const, `*`(N))) (61)
 

 

Here, Typesetting:-mrow(Typesetting:-mi( is left as an arbitrary constant. The term Typesetting:-mrow(Typesetting:-mi( represents the fact that in addition to the two recursive calls, there are Typesetting:-mrow(Typesetting:-mi( additional arithmetic operations. 

 

Maple can solve this recurrence equation: 

 

> Typesetting:-mrow(Typesetting:-mi(
 

`/`(`*`(N, `*`(ln(N), `*`(const))), `*`(ln(2))) (62)
 

 

This shows that procedure FFTeval costs Typesetting:-mrow(Typesetting:-mi( to evaluate a polynomial of length Typesetting:-mrow(Typesetting:-mi( at the Typesetting:-mrow(Typesetting:-msup(Typesetting:-mi( roots of unity. Note that Typesetting:-mrow(Typesetting:-mi( is simply Typesetting:-mrow(Typesetting:-mi( to the base Typesetting:-mrow(Typesetting:-mi(, and two such logarithms are equivalent up to a constant factor. In fact, the logarithmic term showing up here is precisely Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( : 

 

> Typesetting:-mrow(Typesetting:-mi(
 

`/`(`*`(ln(N)), `*`(ln(2))) (63)
 

 

It follows that both the Forward FFT and the Inverse FFT cost Typesetting:-mrow(Typesetting:-mi( . 

 

>