summaryrefslogtreecommitdiff
path: root/src/hal/components/ilowpass.comp
blob: 074af0e82afb3049ee1815a4d77aae7cf4e1474a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
component ilowpass "Low-pass filter with integer inputs and outputs";
description """While it may find other applications, this component was written
to create smoother motion while jogging with an MPG.

In a machine with high acceleration, a short jog can behave almost like a step
function.  By putting the \\fBilowpass\\fR component between the MPG
encoder \\fBcounts\\fR output and the axis \\fRjog-counts\\fR input,
this can be smoothed.

Choose \\fBscale\\fR conservatively so that during a single session
there will never be more than about 2e9/\\fBscale\\fR pulses seen
on the MPG.  Choose \\fBgain\\fR according to the smoothing level
desired.  Divide the \\fRaxis.\\fIN\\fR.jog-scale\\fR values by
\\fBscale\\fR.""";

pin in s32 in;

pin out s32 out """\\fBout\\fR tracks \\fBin\\fR*\\fBscale\\fR through a low-pass
filter of \\fBgain\\fR per period.""";

param rw float scale = 1024 """A scale factor applied to the output
value of the low-pass filter.""";

param rw float gain = .5 """Together with the period, sets the rate at
which the output changes.  Useful range is between 0 and 1, with higher
values causing the input value to be tracked more quickly.  For
instance, a setting of 0.9 causes the output value to go 90% of the way
towards the input value in each period""";

variable double value;

function _ "Update the output based on the input and parameters";

license "GPL";
author "Jeff Epler <jepler@unpythonic.net>";
;;
value += (in - value) * gain;
out = (int)(__s64)(value * scale);