Cookbook / Smoothing by Moving-average Method

Code

Flash

  1. // a very simple moving average filter
  2. // 非常にシンプルな移動平均フィルタ
  3. class MovingAverageFilter {
  4.     private var _taps:Number;
  5.     private var _values:Array;
  6.  
  7.     function MovingAverageFilter(taps:Number) {
  8.         _taps = taps;
  9.         _values = new Array(_taps);
  10.     }
  11.  
  12.     function processSample(sample:Number):Number {
  13.         var acc:Number = 0;
  14.         var i:Number = 0;
  15.  
  16.         // put the new value to the top of the array
  17.         // 配列の先頭に新しい値を代入
  18.         _values[0] = sample;
  19.  
  20.         // sum up all values in the array to do averaging
  21.         // 全ての値を加算平均する
  22.         for (i = 0; i < _taps; i++) {
  23.             acc = acc + _values[i];
  24.         }
  25.         acc = acc / _taps;
  26.  
  27.         // shift values one by one
  28.         // 1つずつ配列の中の値をシフトする
  29.         //          0  1  2  3  4  ...
  30.         // before: [A][B][C][D][E] ...
  31.         // after : [A][A][B][C][D] ...
  32.         for (i = _taps - 1; i > 0; i--) {
  33.             _values[i] = _values[i - 1];
  34.         }
  35.  
  36.         return acc;
  37.     }
  38. }
  1. import gainer.*;
  2.  
  3. var ioModule:Gainer = new Gainer("localhost", 2000, Gainer.MODE1, true);
  4. var maFilter:MovingAverageFilter = new MovingAverageFilter(8);
  5.  
  6. var filteredInput:Number = 0;
  7.  
  8. ioModule.onReady = function() {
  9.     _root.onEnterFrame = mx.utils.Delegate.create(this, loop);
  10.  
  11.     this.onFinished = function () {
  12.         ioModule.peekAnalogInput();
  13.         filteredInput = maFilter.processSample(ioModule.analogInput[0]);
  14.     }
  15. }
  16.  
  17. function loop():Void {
  18.     ...
  19. }

Max/MSP

  1. var values = new Array(0, 0, 0, 0, 0, 0, 0, 0);
  2. var i = 0;
  3. var acc = 0;
  4.  
  5. function msg_int(newValue)
  6. {
  7.     // put the new value to the top of the array
  8.     // 配列の先頭に新しい値を代入
  9.     values[0] = newValue;
  10.  
  11.     // sum up all values in the array to do averaging
  12.     // 全ての値を加算平均する
  13.     acc = 0;
  14.  
  15.     for (i = 0; i < 8; i++) {
  16.         acc = acc + values[i];
  17.     }
  18.     acc = acc / 8;
  19.  
  20.     // shift values one by one
  21.     // 1つずつ配列の中の値をシフトする
  22.     //          0  1  2  3  4  ...
  23.     // before: [A][B][C][D][E] ...
  24.     // after : [A][A][B][C][D] ...
  25.     for (i = (8 - 1); i > 0; i--) {
  26.         values[i] = values[i - 1];
  27.     }
  28.  
  29.     outlet(0, acc);
  30. }
  js moving_average.js

Processing

  1. public class MovingAverageFilter
  2. {
  3.     int taps;
  4.     float values[];
  5.  
  6.     MovingAverageFilter(int requestedTaps)
  7.     {
  8.         taps = requestedTaps;
  9.         values = new float[taps];
  10.     }
  11.  
  12.     int processSample(int in)
  13.     {
  14.         float acc = 0;
  15.         values[0] = in;
  16.  
  17.         for (int i = 0; i < taps; i++) {
  18.             acc += values[i];
  19.         }
  20.         acc /= taps;
  21.  
  22.         for (int i = taps - 1; i > 0; i--) {
  23.             values[i]   = values[i - 1];
  24.         }
  25.  
  26.         return (int)acc;
  27.     }
  28. }
  1. import processing.gainer.*;
  2.  
  3. Gainer gainer;
  4.  
  5. MovingAverageFilter maFilter;
  6.  
  7. void setup()
  8. {
  9.     ...
  10.     gainer = new Gainer(this);
  11.  
  12.     maFilter = new MovingAverageFilter(16);
  13.     ...
  14. }
  15.  
  16. void draw()
  17. {
  18.     int averaged = 0;
  19.     ...
  20.     gainer.peekAnalogInput();
  21.     averaged = maFilter.processSample(gainer.analogInput[0]);
  22.     ...
  23. }

Handling MaxMSP Processing Flash

prev 1 - 2 - 3 - 4
Print