前回、オーディオデータにおける量子化ノイズについて書きました。実はこの問題オーディオでは音質という形で何かと論議を呼ぶのですが、通常の信号処理でも余裕で問題を起こします。
整数しか扱えない電卓があったとします。
1 / 3 + 1 / 3 + 1 / 3 ( / は割り算操作を表します)を計算すると、本来なら 1 、一昔前なら 0.9999・・・ ですが、整数しか扱えない電卓は 0 という答えです。

ちょっと先走った話ですが、デジタルフィルタなどを作ると、scilab などで 10進数できちっと計算すると目的の特性が得られるのですが、実際にハードウェアを組んでみると桁落ちが発生して思ったような特性が出ないことも十分あり得ます。

デジタル信号処理のカラクリの基本は、数列と思ってもらって良いでしょう。いわゆる漸化式っていうやつを作ります。差分方程式とどう違うのかイマイチ理解していません。あまり気にしないことにします。アナログ屋なので。(ちょっと心配になって Wiki をこそっと調べる自分がいる)
で、昔は漸化式を一生懸命解いたのですが今は計算機がやってくれます。片っ端から値を入れていけばいいので簡単ですね。エクセルでやってみることにします。

たとえば、ある時刻の出力値をその前の出力値の 0.9 倍、その時刻の入力値の 0.1 倍を加算したものとします。ちょっと結果を想像してみて下さい。入力の影響は 10 %、その前の出力の影響は 90 % ということですから、なかなか値が変化しづらいもののようです。そうです、一種のローパスフィルタと思ってもらっていいと思います。
で、その関係式は入力値の数列を I(n)出力値の数列を O(n) とすると、O(n+1) = 0.1 x O(n) + 0.9 x I(n+1) となります。
ここで、ステップ応答を考える、ということで、時刻 0 の時の値をそれぞれ I(0) = 0、O(0) = 0、とし、時刻 1 以降の I(n) を 1 としてエクセルで表計算してみます。
デジタルフィルタっぽくブロックで書くとこんな感じです。

イメージ 1
エクセルの表はこんな感じです。

イメージ 4
C1 は入力に対する係数で 0.1、D1 は出力に対する係数で 0.9、E1 は計算桁数です。この場合は 100 で小数点以下 2 桁まで計算し以下は切り捨てになっています。1000 にすると 3 桁まで計算します。
時刻 1 以降の出力の計算式は以下のようです。

フル桁計算→ Output1 列:=(D3*$D$1+C4*$C$1)
桁制限計算→ Output2 列:=(INT(C4*$C$1*$E$1)+INT(E3*$D$1*$E$1))/$E$1
差分→ Deviation 列:=D3-E3

グラフにしてみました。

イメージ 2
当たり前ですが、桁を制限すると誤差が増えます。差分はそれを表しています。
桁が足りないため目標値に近づくことが出来ません。
制限桁数を 2 から 3 に緩めてみました。

イメージ 3
当然のようにぐっと誤差が減りました。

何がいいたいかというと、この誤差が信号へのノイズとなるわけです。従ってこの量が信号に対する欲しい S/N を確保できるまで減らすべく桁を増やす必要があると云うことです。
通常のデジタル信号処理は二値で行われるので、数量的な問題は色々なところで計算式が紹介されているので、そちらを参考にして下さい。

システム検討を行う際は、そういった数値的な把握をした上で、AD コンバータのビット数を決めたり内部演算の桁数を決めたりしなくてはいけませんが、ここでは「ちょっとだけ」がテーマなので頭に留めておくぐらいの説明にします。

LTspice:「この領域では出番はないな。でも画蔵も本当はよく分かっていないんだろう。」
画蔵:「グサッ。いやブログで時々書いているように、アナログ回路が減ってデジタル信号処理が主流になっているのだから、勉強するのは、今で・・・」
LTspice:「手遅れ(笑)!」
画蔵:「うっ...。」orz