最も簡単なのは、データの移動平均を行うことです。つまり、センサー データの読み取り値の配列を保持し、それらを平均化します。このようなもの(疑似コード):
data_X = [0,0,0,0,0];
function read_X () {
data_X.delete_first_element();
data_X.push(get_sensor_data_X());
return average(data_X);
}
これを行う場合、トレードオフがあります。使用する配列が大きいほど、結果は滑らかになりますが、結果と実際の読み取り値の間のラグが大きくなります。例えば:
/\_/\
/\/ \_/\
Sensor reading: __/\/ \/\
\/\ _/\___________
\/
_
__/ \_
___/ \__
Small array: ___/ \_/\_ _
\ __/ \________
\_/
____
__/ \__
__/ \__
Large array: _______/ \__ __
\_ / \__
\_/
(forgive my ASCII-ART but I'm hoping it's good enough for illustration).
とにかく高速な応答が必要であるが、良好な平滑化が必要な場合は、配列の加重平均を使用します。これは基本的にデジタル信号処理 (大文字の DSP を使用) であり、その名前に反してアナログ設計により密接に関連しています。これについてのウィキペディアの短い記事を次に示します (このパスをたどりたい場合は、適切な外部リンクを参照してください): http://en.wikipedia.org/wiki/Digital_filter
あなたのニーズに合ったローパスフィルターに関するSOのコードを次に示します。ローパスフィルターソフトウェア?. その回答のコードでは、サイズ 4 (信号処理用語では 4 次) の配列を使用していることに注意してください。このようなフィルターは 4 次フィルターと呼ばれるため、実際には 4 次多項式 ax^4 + bx でモデル化できます。 ^3 + cx^2 + dx) .