Skip to content
Permalink
master
Go to file
 
 
Cannot retrieve contributors at this time
64 lines (50 sloc) 1.31 KB
local Filters = require 'filters'
----------------------
--- @type Filters.rms
-- moving, windowed RMS/standard deviation filter
local rms = {}
rms.__index = rms
setmetatable(rms, { __index=Filters })
-- copying this is ugly; should figure out something different
-- helper to increment and wrap an index
local function wrap_inc(x, max)
local y = x + 1
while y > max do y = y - max end
return y
end
----------------------
--- @type constructor
--- @param bufsize: window size, cannot change after creation
function rms.new(bufsize)
local new = setmetatable({}, rms)
new.buf = {}
if bufsize==nil then bufsize=16 end
new.bufsize = bufsize
new.scale = 1/bufsize
new:clear()
new.pos = 1
new.sum = 0
new.value = 0
print('done allocating new rms filter')
return new
end
--- process a new input value and update rms
-- @param x: new input
-- @param m: mean value
-- @return rms
function rms:next(x, m)
local smp = (x-m)
smp = smp*smp
local a = smp*self.scale
--calc mean of squares; maybe should just extend means
self.sum = self.sum + a
self.sum = self.sum - self.buf[self.pos]
self.buf[self.pos] = a
self.pos = wrap_inc(self.pos, self.bufsize)
self.value = math.sqrt(self.sum)
return self.value
end
----------------------
--- return stuff
Filters.rms = rms
return Filters