The FFT computation

This is shown here for the FFT of 8 values, but is easily
generalised for larger problems.

Using xi and wi to denote x^i and w^i,
but ai is just the ith element of data.

f(x) = a0 + a1*x1 + a2*x2 + a3*x3 + a4*x4 + a5*x5 + a6*x6 + a7*x7
     = f0246(x2) + x * f1357(x2)
where  f0246(x) = a0 + a2*x1 + a4*x2 + a6*x3
and    f1357(x) = a1 + a3*x1 + a5*x2 + a7*x3

Similar rules apply to the functions f04, f26, f15 and f37

w is the principal 8th root of unity so w8 = 1 and w4=-1.
Note that other results hold, such as w4=-w0, w5=-w1, w6=-w2,
w18=w0, w12=w4, and w14=w6.

We wish to calculate f(wi) for i = 0 .. 7.

f(w0) = f0246(w0)  + w0 * f1357(w0)  = f0246(w0) + w0 * f1357(w0)
f(w1) = f0246(w2)  + w1 * f1357(w2)  = f0246(w2) + w1 * f1357(w2)
f(w2) = f0246(w4)  + w2 * f1357(w4)  = f0246(w4) + w2 * f1357(w4)
f(w3) = f0246(w6)  + w3 * f1357(w6)  = f0246(w6) + w3 * f1357(w6)
f(w4) = f0246(w8)  + w4 * f1357(w8)  = f0246(w0) - w0 * f1357(w0)
f(w5) = f0246(w10) + w5 * f1357(w10) = f0246(w2) - w1 * f1357(w2)
f(w6) = f0246(w12) + w6 * f1357(w12) = f0246(w4) - w2 * f1357(w4)
f(w7) = f0246(w14) + w7 * f1357(w14) = f0246(w6) - w3 * f1357(w6)

f0246(w0) = f04(w0)  + w0 * f26(w0)  = f04(w0) + w0 * f26(w0)
f0246(w2) = f04(w4)  + w2 * f26(w4)  = f04(w4) + w2 * f26(w4)
f0246(w4) = f04(w8)  + w4 * f26(w8)  = f04(w0) - w0 * f26(w0)
f0246(w6) = f04(w12) + w6 * f26(w12) = f04(w4) - w2 * f26(w4)
f1357(w0) = f15(w0)  + w0 * f37(w0)  = f15(w0) + w0 * f37(w0)
f1357(w2) = f15(w4)  + w2 * f37(w4)  = f15(w4) + w2 * f37(w4)
f1357(w4) = f15(w8)  + w4 * f37(w8)  = f15(w0) - w0 * f37(w0)
f1357(w6) = f15(w12) + w6 * f37(w12) = f15(w4) - w2 * f37(w4)

f04(w0) = a0 + w0 * a4 = a0 + a4
f04(w4) = a0 + w4 * a4 = a0 - a4
f26(w0) = a2 + w0 * a6 = a2 + a6
f26(w4) = a2 + w4 * a6 = a2 - a6
f15(w0) = a1 + w0 * a5 = a1 + a5
f15(w4) = a1 + w4 * a5 = a1 - a5
f37(w0) = a3 + w0 * a7 = a3 + a7
f37(w4) = a3 + w4 * a7 = a3 - a7

 a0      a1      a2      a3      a4      a5      a6      a7   Level 0
 |       |       |       |       |       |       |       |
 .       .       .       .       *w0     *w0     *w0     *w0
 |\      |\      |\      |\     /|      /|      /|      /|
 | \     | \     | \     | \   / |     / |     / |     / |  Butterfly sep = 4   
 |  \    |  \    |  \    |  \ /  |    /  |    /  |    /  |  eg (0 4) (1 5) etc
 |   \   |   \   |   \   |   .   |   /   |   /   |   /   |     
 |    \  |    \  |    \  |  / \  |  /    |  /    |  /    |     
 |     \ |     \ |     \ | /   \ | /     | /     | /     |     
 |      \|      \|      \|/     \|/      |/      |/      |     
 |       .       .       .       .       .       .       |
 |       |\      |\     /|\     /|\     /|      /|       |     
 |       | \     | \   / | \   / | \   / |     / |       |
 |       |  \    |  \ /  |  \ /  |  \ /  |    /  |       |
 |       |   \   |   .   |   .   |   .   |   /   |       |
 |       |    \  |  / \  |  / \  |  / \  |  /    |       |
 |       |     \ | /   \ | /   \ | /   \ | /     |       |
 |       |      \|/     \|/     \|/     \|/      |       |
 |       |       .       .       .       .       |       |
 |       |      /|\     /|\     /|\     /|\      |       |     
 |       |     / | \   / | \   / | \   / | \     |       |
 |       |    /  |  \ /  |  \ /  |  \ /  |  \    |       |
 |       |   /   |   .   |   .   |   .   |   \   |       |
 |       |  /    |  / \  |  / \  |  / \  |    \  |       |
 |       | /     | /   \ | /   \ | /   \ |     \ |       |
 |       |/      |/     \|/     \|/     \|      \|       |
 |       .       .       .       .       .       .       |
 |      /|      /|      /|\     /|\      |\      |\      |
 |     / |     / |     / | \   / | \     | \     | \     |
 |    /  |    /  |    /  |  \ /  |  \    |  \    |  \    |
 |   /   |   /   |   /   |   .   |   \   |   \   |   \   |
 |  /    |  /    |  /    |  / \  |    \  |    \  |    \  |
 | /     | /     | /     | /   \ |     \ |     \ |     \ |
 |/      |/      |/      |/     \|      \|      \|      \|
 +       +       +       +       -       -       -       -
f04     f15     f26     f37     f04     f15     f26     f37   Level 1
(w0)    (w0)    (w0)    (w0)    (w4)    (w4)    (w4)    (w4)   
 |       |       |       |       |       |       |       |
 .       .       *w0     *w0    .       .        *w2     *w2
 |\      |\     /|      /|       |\      |\     /|      /|
 | \     | \   / |     / |       | \     | \   / |     / |     Butterfly sep = 2
 |  \    |  \ /  |    /  |       |  \    |  \ /  |    /  |     eg (0 2) (1 3) etc
 |   \   |   .   |   /   |       |   \   |   .   |   /   |
 |    \  |  / \  |  /    |       |    \  |  / \  |  /    |
 |     \ | /   \ | /     |       |     \ | /   \ | /     |
 |      \|/     \|/      |       |      \|/     \|/      |
 |       .       .       |       |       .       .       |
 |      /|\     /|\      |       |      /|\     /|\      |
 |     / | \   / | \     |       |     / | \   / | \     |
 |    /  |  \ /  |  \    |       |    /  |  \ /  |  \    |
 |   /   |   .   |   \   |       |   /   |   .   |   \   |
 |  /    |  / \  |    \  |       |  /    |  / \  |    \  |
 | /     | /   \ |     \ |       | /     | /   \ |     \ |
 |/      |/     \|      \|       |/      |/     \|      \|
 +       +       -       -       +       +       -       -
 |       |       |       |       |       |       |       |
f0246   f1357   f0246   f1357   f0246   f1357   f0246   f1357  Level 2
(w0)    (w0)    (w4)    (w4)    (w2)    (w2)    (w6)    (w6)   
 |       |       |       |       |       |       |       |
 .       *w0     .       *w2     .       *w1     .       *w3
 |\     /|       |\     /|       |\     /|       |\     /|
 | \   / |       | \   / |       | \   / |       | \   / |    Butterfly sep = 1
 |  \ /  |       |  \ /  |       |  \ /  |       |  \ /  |    eg (0 1) (2 3) etc
 |   .   |       |   .   |       |   .   |       |   .   |
 |  / \  |       |  / \  |       |  / \  |       |  / \  |       
 | /   \ |       | /   \ |       | /   \ |       | /   \ |
 |/     \|       |/     \|       |/     \|       |/     \|       
 +       -       +       -       +       -       +       -
 |       |       |       |       |       |       |       |
f(w0)   f(w4)   f(w2)   f(w6)   f(w1)   f(w5)   f(w3)   f(w7)  Level 3
 .       .       .       .       .       .       .       .
 |        \      |        \     /        |      /        |
 |         \     |         \   /         |     /         |
 |          \    |          \ /          |    /          |
 |           \   |           .           |   /           |
 |            \  |          / \          |  /            |
 |             \ |         /   \         | /             |  Perfect shuffle
 |              \|        /     \        |/              |
 |               .       /       \       .               |  ie swap position i and j
 |               |\     /         \     /|               |
 |               | \   /           \   / |               |  where the binary digits
 |               |  \ /             \ /  |               |
 |               |   .               .   |               |  of j are those of i in
 |               |  / \             / \  |               |
 |               | /   \           /   \ |               |  reverse order.
 |               |/     \         /     \|               |
 |               .       \       /       .               |  eg i=110  j=011
 |              /|        \     /        |\              |
 |             / |         \   /         | \             |
 |            /  |          \ /          |  \            |
 |           /   |           .           |   \           |
 |          /    |          / \          |    \          |
 |         /     |         /   \         |     \         |
 |        /      |        /     \        |      \        |
 .       .       .       .       .       .       .       .
 |       |       |       |       |       |       |       |
f(w0)   f(w1)   f(w2)   f(w3)   f(w4)   f(w5)   f(w6)   f(w7)

The inverse FFT is exactly the same computation but using w^-1 instead
of w, and dividing the resulting values by 8 at the end.

FFT normally works on complex numbers but bigfft.b demonstration a
Galois field consisting of integers modulo 2^16+1. The arithmetic
operators are provided by the function add, sub, mul, div, inv, pow
and neg.


