きっかけ
いや、これがですね。Arduinoでセンサーの値を読み取るとき、「なんか数値がブレるな…」ってなること、ありませんか?
自分もずっとそれに悩んでて、移動平均とかフィルタリングとか調べてたんですけど、最近独学で整数論やってる中で「あ、これ繋がるやん」ってなった話です。
信号の”離散”と整数の世界
Arduinoの analogRead() が返す値って、0〜1023の整数なんですよね。つまりアナログ信号をデジタルに変換した時点で、自分たちは整数の世界で勝負してるわけです。
ここで整数論的な視点が効いてくるポイントをまとめると:
- 剰余(mod)の感覚 → センサー値を一定周期でまとめたり、リングバッファを回すとき
index % Nを使う。Nの選び方で効率が変わる - 最大公約数(GCD) → サンプリング周期と信号の周期のGCDを意識すると、エイリアシング(偽の波形が見える現象)の原因が整理できる
- 整数の丸め誤差 → 割り算の切り捨てが積み重なるとズレる。これ、マジで地味にハマるポイント
実際にやってみた例
温度センサー(LM35)の値を10回読んで平均を取る、よくあるやつ。
`cpp
int sum = 0;
for(int i = 0; i < 10; i++){
sum += analogRead(A0);
}
int avg = sum / 10;
`
これ、sum / 10 の時点で小数点以下が消えるんですよね。10回じゃなくて8回(2のべき乗)にすればビットシフトで割れるし、精度の扱いも見通しが良くなる。整数論やってると「なぜ2のべき乗が便利なのか」が感覚でわかるようになります。
わからないから面白い
正直、整数論と信号処理の関係って自分もまだ全然わかってないです。フーリエ変換の離散版(DFT)にも剰余の構造が関わってるらしいんですけど、そこはまだ手が届いてない。
でも「わからんけど繋がってそう」って感覚がある瞬間が、一番ワクワクするんですよね。
答えを先に見るより、自分の手で回路組んでコード書いて「あー、なるほど、そういうことか」ってなる方が絶対楽しいと思うんで、気になった人はぜひ試してみてください。
失敗するほど学べるんで、そこは保証します。

コメント