Download or view fourierTemp.frink in plain text format
//use englewoodarray.frink
a = new array
for line = lines["file:hourly.txt"]
a.push[eval[line]]
println[length[a]]
// Transform time-domain data into frequency-domain data
f = DFT[a]
g = new graphics
// fprime will contain just selected frequency components.
fprime = new array[]
len = length[f]
zeroUnit = 0 f@0
threshold = .1
vscale = 20
c = 0
str = ""
for y = f
{
x = (c + len/2) mod len // Draw low-freq components together in middle
// Draw phases
g.color[0,1,0]
phase = arctan[Im[y],Re[y]]
g.fillRectSides[x,0,x+1,-5 phase]
// Draw magnitudes
g.color[0,0,0,.7]
mag = abs[y]
if (c != 0) // Don't draw DC component because it's huge.
g.fillRectSides[x,0,x+1,-vscale mag]
if (mag > threshold) // Decide which components to keep.
{
daysphase = (phase/(2 pi) * len)
mag2 = 2 mag
println["Used component $c, mag is $mag, phase is $daysphase days"]
if c == 0
str = format[mag2/2, 1, 6]
if c > 0 && c < len/2
str = str + " +\n " + format[mag2,1,6] + " cos[2 pi $c/$len d - " + format[phase,1,6] + "]"
fprime.push[y]
} else
fprime.push[zeroUnit]
c = c + 1
}
// Draw threshold
g.color[0,0,1,.5]
g.line[0,-vscale threshold,len,-vscale threshold]
println[str]
g.show[]
g.write["fourierEnglewood.svg",800,600]
// Turn the frequency-domain data back into a time-domain waveform
t = InverseDFT[fprime]
// Plot the time-domain data that was generated from the truncated
// frequency domain.
g2 = new graphics
c = 0
scale = 3
for y = t
{
g2.fillRectCenter[c, -scale Re[y], 1, scale]
c = c+1
}
// Plot original data
g2.color[0,0,1,.7]
c = 0
for y = a
{
g2.fillRectCenter[c, -scale Re[y], 1, scale]
c = c+1
}
// Test that sin approximation gives the same values
g2.color[1,0,0,.5]
for d = 0 to len-1
g2.fillRectCenter[d, -scale eval[str], 1, scale]
g2.show[]
g2.write["recreatedEnglewood.svg", 800, 600]
Download or view fourierTemp.frink in plain text format
This is a program written in the programming language Frink.
For more information, view the Frink
Documentation or see More Sample Frink Programs.
Alan Eliasen was born 20236 days, 0 hours, 44 minutes ago.