Code
Flash
// a very simple moving average filter
// 非常にシンプルな移動平均フィルタ
class MovingAverageFilter {
private var _taps:Number;
private var _values:Array;
function MovingAverageFilter(taps:Number) {
_taps = taps;
_values = new Array(_taps);
}
function processSample(sample:Number):Number {
var acc:Number = 0;
var i:Number = 0;
// put the new value to the top of the array
// 配列の先頭に新しい値を代入
_values[0] = sample;
// sum up all values in the array to do averaging
// 全ての値を加算平均する
for (i = 0; i < _taps; i++) {
acc = acc + _values[i];
}
acc = acc / _taps;
// shift values one by one
// 1つずつ配列の中の値をシフトする
// 0 1 2 3 4 ...
// before: [A][B][C][D][E] ...
// after : [A][A][B][C][D] ...
for (i = _taps - 1; i > 0; i--) {
_values[i] = _values[i - 1];
}
return acc;
}
}
import gainer.*;
var ioModule:Gainer = new Gainer("localhost", 2000, Gainer.MODE1, true);
var maFilter:MovingAverageFilter = new MovingAverageFilter(8);
var filteredInput:Number = 0;
ioModule.onReady = function() {
_root.onEnterFrame = mx.utils.Delegate.create(this, loop);
this.onFinished = function () {
ioModule.peekAnalogInput();
filteredInput = maFilter.processSample(ioModule.analogInput[0]);
}
}
function loop():Void {
...
}
Max/MSP
var values = new Array(0, 0, 0, 0, 0, 0, 0, 0);
var i = 0;
var acc = 0;
function msg_int(newValue)
{
// put the new value to the top of the array
// 配列の先頭に新しい値を代入
values[0] = newValue;
// sum up all values in the array to do averaging
// 全ての値を加算平均する
acc = 0;
for (i = 0; i < 8; i++) {
acc = acc + values[i];
}
acc = acc / 8;
// shift values one by one
// 1つずつ配列の中の値をシフトする
// 0 1 2 3 4 ...
// before: [A][B][C][D][E] ...
// after : [A][A][B][C][D] ...
for (i = (8 - 1); i > 0; i--) {
values[i] = values[i - 1];
}
outlet(0, acc);
}
js moving_average.js
Processing
public class MovingAverageFilter
{
int taps;
float values[];
MovingAverageFilter(int requestedTaps)
{
taps = requestedTaps;
values = new float[taps];
}
int processSample(int in)
{
float acc = 0;
values[0] = in;
for (int i = 0; i < taps; i++) {
acc += values[i];
}
acc /= taps;
for (int i = taps - 1; i > 0; i--) {
values[i] = values[i - 1];
}
return (int)acc;
}
}
import processing.gainer.*;
Gainer gainer;
MovingAverageFilter maFilter;
void setup()
{
...
gainer = new Gainer(this);
maFilter = new MovingAverageFilter(16);
...
}
void draw()
{
int averaged = 0;
...
gainer.peekAnalogInput();
averaged = maFilter.processSample(gainer.analogInput[0]);
...
}
Handling MaxMSP Processing Flash