fourierTemp.frink

View or download 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]


View or download 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 17590 days, 6 hours, 59 minutes ago.