220 lines
4.0 KiB
Plaintext
220 lines
4.0 KiB
Plaintext
'Graphic fast Fourier transform demo,
|
|
'press any key for the next image.
|
|
'131072 samples: the FFT is fast indeed.
|
|
|
|
'screen resolution
|
|
const dW = 800, dH = 600
|
|
'--------------------------------------
|
|
type samples
|
|
declare constructor (byval p as integer)
|
|
|
|
'sw = 0 forward transform
|
|
'sw = 1 reverse transform
|
|
declare sub FFT (byval sw as integer)
|
|
|
|
'draw mythical birds
|
|
declare sub oiseau ()
|
|
|
|
'plot frequency and amplitude
|
|
declare sub famp ()
|
|
|
|
'plot transformed samples
|
|
declare sub bird ()
|
|
|
|
as double x(any), y(any)
|
|
as integer fl, m, n, n2
|
|
end type
|
|
|
|
constructor samples (byval p as integer)
|
|
m = p
|
|
'number of points
|
|
n = 1 shl p
|
|
n2 = n shr 1
|
|
'real and complex values
|
|
redim x(n - 1), y(n - 1)
|
|
end constructor
|
|
|
|
|
|
'--------------------------------------
|
|
'in-place complex-to-complex FFT adapted from
|
|
'[ http://paulbourke.net/miscellaneous/dft/ ]
|
|
|
|
sub samples.FFT (byval sw as integer)
|
|
dim as double c1, c2, t1, t2, u1, u2, v
|
|
dim as integer i, j = 0, k, L, l1, l2
|
|
|
|
'bit reversal sorting
|
|
for i = 0 to n - 2
|
|
if i < j then
|
|
swap x(i), x(j)
|
|
swap y(i), y(j)
|
|
end if
|
|
|
|
k = n2
|
|
while k <= j
|
|
j -= k: k shr= 1
|
|
wend
|
|
j += k
|
|
next i
|
|
|
|
'initial cosine & sine
|
|
c1 = -1.0
|
|
c2 = 0.0
|
|
'loop for each stage
|
|
l2 = 1
|
|
for L = 1 to m
|
|
l1 = l2: l2 shl= 1
|
|
|
|
'initial vertex
|
|
u1 = 1.0
|
|
u2 = 0.0
|
|
'loop for each sub DFT
|
|
for k = 1 to l1
|
|
'butterfly dance
|
|
for i = k - 1 to n - 1 step l2
|
|
j = i + l1
|
|
t1 = u1 * x(j) - u2 * y(j)
|
|
t2 = u1 * y(j) + u2 * x(j)
|
|
x(j) = x(i) - t1
|
|
y(j) = y(i) - t2
|
|
x(i) += t1
|
|
y(i) += t2
|
|
next i
|
|
|
|
'next polygon vertex
|
|
v = u1 * c1 - u2 * c2
|
|
u2 = u1 * c2 + u2 * c1
|
|
u1 = v
|
|
next k
|
|
|
|
'half-angle sine
|
|
c2 = sqr((1.0 - c1) * .5)
|
|
if sw = 0 then c2 = -c2
|
|
'half-angle cosine
|
|
c1 = sqr((1.0 + c1) * .5)
|
|
next L
|
|
|
|
'scaling for reverse transform
|
|
if sw then
|
|
for i = 0 to n - 1
|
|
x(i) /= n
|
|
y(i) /= n
|
|
next i
|
|
end if
|
|
end sub
|
|
|
|
'--------------------------------------
|
|
'Gumowski-Mira attractors "Oiseaux mythiques"
|
|
'[ http://www.atomosyd.net/spip.php?article98 ]
|
|
|
|
sub samples.oiseau
|
|
dim as double a, b, c, t, u, v, w
|
|
dim as integer dx, y0, dy, i, k
|
|
|
|
'bounded non-linearity
|
|
if fl then
|
|
a = -0.801
|
|
dx = 20: y0 =-1: dy = 12
|
|
else
|
|
a = -0.492
|
|
dx = 17: y0 =-3: dy = 14
|
|
end if
|
|
window (-dx, y0-dy)-(dx, y0+dy)
|
|
|
|
'dissipative coefficient
|
|
b = 0.967
|
|
c = 2 - 2 * a
|
|
|
|
u = 1: v = 0.517: w = 1
|
|
|
|
for i = 0 to n - 1
|
|
t = u
|
|
u = b * v + w
|
|
w = a * u + c * u * u / (1 + u * u)
|
|
v = w - t
|
|
|
|
'remove bias
|
|
t = u - 1.830
|
|
x(i) = t
|
|
y(i) = v
|
|
k = 5 + point(t, v)
|
|
pset (t, v), 1 + k mod 14
|
|
next i
|
|
sleep
|
|
end sub
|
|
|
|
'--------------------------------------
|
|
sub samples.famp
|
|
dim as double a, s, f = n / dW
|
|
dim as integer i, k
|
|
window
|
|
|
|
k = iif(fl, dW / 5, dW / 3)
|
|
for i = k to dW step k
|
|
line (i, 0)-(i, dH), 1
|
|
next i
|
|
|
|
a = 0
|
|
k = 0: s = f - 1
|
|
for i = 0 to n - 1
|
|
a += x(i) * x(i) + y(i) * y(i)
|
|
|
|
if i > s then
|
|
a = log(1 + a / f) * 0.045
|
|
if k then
|
|
line -(k, (1 - a) * dH), 15
|
|
else
|
|
pset(0, (1 - a) * dH), 15
|
|
end if
|
|
|
|
a = 0
|
|
k += 1: s += f
|
|
end if
|
|
next i
|
|
sleep
|
|
end sub
|
|
|
|
sub samples.bird
|
|
dim as integer dx, y0, dy, i, k
|
|
|
|
if fl then
|
|
dx = 20: y0 =-1: dy = 12
|
|
else
|
|
dx = 17: y0 =-3: dy = 14
|
|
end if
|
|
window (-dx, y0-dy)-(dx, y0+dy)
|
|
|
|
for i = 0 to n - 1
|
|
k = 2 + point(x(i), y(i))
|
|
pset (x(i), y(i)), 1 + k mod 14
|
|
next i
|
|
sleep
|
|
end sub
|
|
|
|
'main
|
|
'--------------------------------------
|
|
dim as integer i, p = 17
|
|
'n = 2 ^ p
|
|
dim as samples z = p
|
|
|
|
screenres dW, dH, 4, 1
|
|
|
|
for i = 0 to 1
|
|
z.fl = i
|
|
z.oiseau
|
|
|
|
'forward
|
|
z.FFT(0)
|
|
|
|
'amplitude plot with peaks at the
|
|
'± winding numbers of the orbits.
|
|
z.famp
|
|
|
|
'reverse
|
|
z.FFT(1)
|
|
|
|
z.bird
|
|
cls
|
|
next i
|
|
end
|