Goal: give a moving average of a measurement like belt throughput, i.e. smooth or dampen the input signal so it doesn't fluctuate too much
Theory
theory
Overview:This can be implemented in 3 combinators only, but I use slightly more to make it more understandable:
This displays the throughput of the belt as items/minute, counter courtesy of DaveMcW (viewtopic.php?f=193&t=19825&start=60#p282391)
All red wires are control, green wires are content
Implementation:
The main work is done by the central combinator, which embodies the main formula explained above: V_new = V_old - V_old/S + Input = V_old - V_old*N + Input
The addition is implemented by putting all components together on the input side.
- V_old is its own output (of the previous tick)
- V_old * N is the output of the bottom combinator (memory decay)
- Input is the V output of the top combinator (input)
Thus, every tick calculates a new version of V to which input is added and a fraction of the previous output is removed. The resulting variable V can be seen as the exponential average times the smoothing factor.
The combinator settings itself are the simple 'memory cell' / counter, where the output is copied to the input unless the red reset signal is nonzero:
Input: The topmost combinator scales up the input value (everything) and outputs it as V (for value):
Memory decay
The bottom combinator divides the current value of V by N, which is the negative value of the smoothing factor (so -100 if the smoothing factor is 100):
N is calculated by multiplying the constant value S by -1 in the constant and arithmetic combinators on the left hand side:
(the red signal is the reset signal: set to 1 to reset the counter, set back to zero to resume counting)
The final combinator scales down the value by dividing by the smoothing constant S:
In this case it ouputs to A because the counter wants its input on A, but of course you can put it on whatever you want.
0eNrtXdtu2lgU/RdL8zKCmXO/oM5DfqAvleZlVCEHnMYSNxlTTVXx72NDk8AxOz6LQKdHQZUaBcL28dqXtfdZtvme3c82xaoqF3U2+p6Vk+VinY3++Z6tyy+LfNa+Vn9bFdkoK+ting2yRT5vf8ursn6cF3U5GU6W8/tykdfLKtsOsnIxLf7NRnw76LWxnuez2XCWz1cHHxTbz4OsWNRlXRb7lex++TZebOb3RdVYfv78Q76uh3WVL9arZVUP74tZ3RhfLdfNZ5eL9rCNvaEYZN+aH645xLSsisn+PdOuL7AsQMv8tOVB1oBYV8vZ+L54zL+WDS7NByZlNdmU9bhY5PezYjwt1+3PbPSQz9bF4Pntqsin48d8MR23RpoFNhjU1ebgL55e3//pfDltjLDtidOR2OmwaJwUZvhXgml30MV+Dev2eLz970tVFIvDWCun2ci92Gp/5dvP21MoawwM8WvHjMHORkbHjMUMq2jDrqckdeP8D703rqN88GK1RXFaPkfOQ1mt63GnxH0tq3rTvPJS5XZ/MSzyyWO2j791nbfVVhrW5NxyVVT5fgXZ782nlpt6tQHs/p21YXkyrKtiGgY1552oHpwOf9XE+yATZHpwFpcf/nnBT2f+qneeyrXcnnbHQzmri4qgKAqjFoidvU2LO+shKcrKpwMbnLFDxgIc0IFtcPy+wN4XBOztcX4sf1pMymlRxSWFPE4KcdoLP0y+LSOevfKUEC00y/kqr3ZrHGV/nZcOrZXVt/HOU+OHajkfl4vGxr4mArniQ+hlbO6EThaBJff62+GBBJyKg56k7z2x0zHF0VorsbC6VK3dBcG6aG2MsfQ+rMZ/nhF+d1A1drBfogPuOWJOHFboSH8L1N9D8eRw8VMd/um4kLSd+Vt59SPkSR9RpmmH9BV9TzlInt388J/a/JyVkB8vkZBgewRX0jMy8k3tFFdwTtqdx/kfQb+rruvyu+OU5OxnF1duuojSKagMBbiGATf/C+BPAwaaZndhmn34cIZv9kffIgN26KCwDRKmJ2eEo3xmYJ/pXzFJfrt+kqjXC57uHQNjewkLu0S+07rlkbq1c9BJwB3evN3qVlTd8q/XLcl7ckZKymce9hl/p3XLvl63TG+/Fbm9KxjqEv4+y5YQSNky1L6VgPcYblUrqmoJ0VO1+rotSXVbAt4mkO+zaIme6dKyvoaXRxYteF9Av9OipZGitfPPSbzhofw2IsYVLf160VJ9rZaiWi0Bj/X2nRYtiW2JhS6yrq+oqciiZkAl0e0cJi4pJLIDCXDImbVeGi7cmYIiP7ImneKCSXGgKyLGxJExzxjj3vIXaxKyJo+0Tiut4q511A9jCjKmjpbGrdPeqwNrGrKmj33gleVSqhdrBrJmDqwJrqRw/tCYhYzZo6VpzZ0Xyr0oxQ6y5o6sGcm1U0KbZ2sesuaPrInmn5buwBpnkLm7k6f6Yo2TovibtpGEPXX1GJX7ElmCstQxXdwx7eExyWt5ntngDDJgr+vlH7LtWzDvkCvZ8Ps4QMzVAeEXBURT/Z1kcSesE4sATU3hkoNcq25ce+PaG9emwbWRW59SxFU9hXOt1tQxZdwxZWpc23PJl6bkZ6niABGpcS3VXEgdd8I8sQgwZHMBzrXsRrU3qr1RbRJUG7thL+PGWoYzraE2QGXcVJtamRU925GGul5Cxg21qfGsoRoLFTfTptZoGaqvUOBIe5tobzR7o9lEaDZSQlJxE+0ZA60lDxk30Ka2cxgi3lH9qJ1FFTfPprZ1bKm2QsWNs6lpB5ZsK16m2XkxLTfzYTFrLFblZLhazgpSqlHnX7NMhhqkFWko/G0Y79QtOgoSj9QVA0BctgC4UC0iEfAIAvqKCOiLIqBCBBz5iACG6GXXjAF52RgI73rTJAIcQeCaMWAurRgGMUCN21ogEuI1Y0BdFAEZIqBJBCSCQDp1QHfu7qbEDa1QblQwN9qeW8tN5FNNNKL9QNwpO3hRF15og4hB6XCnlGHOkAhYBIGEcsaEMUB1D9oh+lc63ClVGAMkAh5BICHuDPsnTxUjwxBJMCHu1OHmNIkARxBIpw6YsHvwVPdgBMidDKVO0fPQllP3ZZ5cqQS0HIw5w6nTU52GUYC4kxBxhiXDkABoAICE8iVkDU91DsYAclZCtBmOnIYEwAIApMOaJuycPNU3GAcIfOmQpgopw5AAeACAhGpAWAQ5o6jIMpA04XlTyJ5neIg40rQcUGYg0lQdHmdUj2EFoNWkw5oqHDctCQAiVqWTMbYbAlTfYBF5Kh3aVGHfYEkANABAOrRpVScEqMbBGkCxS4g3w2HTkgBYAICEqoDphADVOVgH8iasYcY+gtF6RMM04P1uwR4cdYWyY8giLOQUygWOI6qhuWIU2sumYTjAOEq+dgJBwF4RAX9RBFx4B7mjrp1wElENTTJsrOMRUAgC14yBu8vGgOxmQfACdYGJ04iMeM2gcJcNChmNgEEQsMkQtNPRaWERddKAd6YFi6AuKHYOWQTEiqQi6jyiB6bDirqzs031Ip4hCCTEimFf4Km+wHNED0yIFeMREAgC6bCi590sCF6gKqKXiECYDisaHo2AQhBIhxW9jE4LDQiPBryJLFgD1Zt4A6wB4kRS6/QWkPrSoUQTNiKeakQ8cidfOozobWe/hmwKkHv30mFEE4/A7vuIoiFIiBJ9NwtCTOivQOKAAJgQJ3oAAgFAkA4ptpJnfGpIQFs04F1f4SrIx7EzBazCYmCQzxNnGhD00uFGKzu4k1/fwQwAQTrs2EqYIQbk12EwC4h66fCjRSBwAATp8GMrY3ZTIXxCK10aPSD1pcOQ1sZDwBkAQUoM6Ynk+DzYfw3z6OCbnwfZ16Ja778JTClhtGrqi9lu/wNjgFv0
Compact versionHere is a more compact version for 'copy paste' use. Input is anything on the green signal to the topleft; output is set on the bottom right, here A on the red signal:
(note that instead of a red reset signal this has a green control signal so you can reset by simply switching off the combinator; also, I manually calculate N=S*-1 to get rid of one combinator)
blueprint
As said above, none of this is original, but I hope the explanation and blueprint string might be of use. If there are any mistakes or inefficiencies please let me know!