#!/bin/lua function note(...) io.stderr:write(string.format(...)) end require 'utils' require 'mathlib' function testsum(T, f, H) local s = 0 for t = 0, T-1 do for h = 1, H do local w = 2*pi*t*f/T s = s + cos(w*h) end end return s/H end function intsum(T, f, H) local s = 0 local intu = 0 local intt = 0 local du = 1/T local dt = 1/T for t = 0, 1, du do local s = 0 local w = 2*pi*t*f for h = 1, H do s = s + cos(w*h) end print(t, s) intu = intu + s * du intt = intt + intu * du end note("%f %f\n", intu, intt) end function testdfs(T, f, H, off) local s = 0 off = off or 0 for t = 0, T-1 do local w = f*(t/T + off) if fmod(w, 1) < 0.000001 or fmod(w, 1) > 0.999999 then s = s + (2*H+1)*cos((2*H+1)*pi*w)/cos(pi*w) - 1 else s = s + sin((2*H+1)*pi*w)/sin(pi*w) - 1 end end return s/2/H end function intdfs(T, f, H) local s = 0 local intu = 0 local intt = 0 local du = 1/T local dt = 1/T for t = 0, 1, du do local s = 0 local w = t*f if fmod(w, 1) < 0.000001 or fmod(w, 1) > 0.999999 then s = s + (2*H+1)*cos((2*H+1)*pi*w)/cos(pi*w) else s = s + sin((2*H+1)*pi*w)/sin(pi*w) end s = (s - 1)/2 intu = intu + s * du intt = intt + intu * du print(t, intt) end note("%f %f\n", intu, intt) end local T = 44100 -- sampling interval local f = tonumber(arg[1]) -- base frequency local H = tonumber(arg[2]) or floor(T/2/f) -- number of harmonics --s2 = testdfs(T, f, H) --print(s2) --s1 = testsum(T, f, H) --print(s1, s2) intdfs(T, f, H) print('"dfs"') --intsum(T, f, H) --print('"sum"')