#!/bin/lua require 'utils' require 'mathlib' function comp(vars, ...) local s = 'return function (x) return %s end' local fn = assert(loadstring(s:format(...))) setfenv(fn, vars) return fn() end function abs2(P, w) local re, im = 0, 0 local s = 1 for n = 1, #P, 2 do re = re + s*w^(n-1)*P[n] s = -s end local s = 1 for n = 2, #P, 2 do im = im + s*w^(n-1)*P[n] s = -s end return re^2 + im^2 end local vars = {} local N = {} local D = {} local i = 1 local num = true for k, v in pairs(math) do vars[k] = v end while arg[i] do local a = arg[i] if a:sub(1,1) == '-' then vars[a:sub(2)] = comp(vars, arg[i+1])() i = i + 1 elseif a == '/' then num = false else local n = comp(vars, arg[i])() push(num and N or D, n) end i = i + 1 end local n = 1024 local w1, w2 = 0, 4 local dw = (w2 - w1) / n for w = w1, w2, dw do local g = abs2(N, w) / abs2(D, w) if g > 0 then db = 10*log(g)/log(10) print(w, db) end end printf("p\n")