DSP 01 · 離散時間信号とサンプリング

Chapter 01

離散時間信号とサンプリング

1. 離散時間信号とは

直感

マイクで音を録るとき、空気の振動(連続的な波)を一定間隔でパシャパシャと「スナップ写真」に撮って数値の列にする。 この数値の列が離散時間信号である。

\[ x[n] = x_a(nT), \quad n = \dots, -2, -1, 0, 1, 2, \dots \]

離散時間信号は「\(T\)秒ごとの値だけを覚えた数列」であり、サンプル同士の間の時刻には値が存在しない

連続信号とそのサンプル列
図: 連続波形(青)から周期\(T\)ごとに値を抜き出したものがサンプル列(赤)。以後の全議論はこの「数列」の上で行われる。

重要な基本信号

単位インパルス(デルタ)信号 — 離散信号処理で最も重要な信号:

\[ \delta[n] = \begin{cases} 1 & (n = 0)\\ 0 & (n \neq 0) \end{cases} \]

直感: 「時刻 0 に一発だけ叩く」信号。太鼓を一回だけポンと叩くイメージ。 連続時間のディラックのデルタ関数と違い、離散版は単なる「高さ 1 の 1 サンプル」なので数学的に何も難しくない。

単位ステップ信号:

\[ u[n] = \begin{cases} 1 & (n \geq 0)\\ 0 & (n < 0) \end{cases} \]

直感: 「時刻 0 でスイッチを入れてそのまま」。

両者の関係の導出:

\(\delta[n]\)を時刻 0 まで足し合わせるとステップになる:

\[ u[n] = \sum_{k=-\infty}^{n} \delta[k] \]

確認:\(n < 0\)のとき、和の範囲に\(k=0\)が含まれないのですべての項が 0、よって\(u[n]=0\)。 \(n \geq 0\)のとき、\(k=0\)の項だけが 1 で他は 0、よって\(u[n]=1\)。定義と一致する。∎

逆に、ステップの「差分」がインパルスになる:

\[ \delta[n] = u[n] - u[n-1] \]

確認:\(n=0\)で\(u[0]-u[-1] = 1-0 = 1\)。\(n\geq 1\)で\(1-1=0\)。\(n\leq -1\)で\(0-0=0\)。∎

インパルスとステップの関係
図: 左は\(u[n]=\sum_{k\leq n}\delta[k]\)— インパルス(赤)を 0 番目まで積み上げると 1 になり、以降ずっと 1。右は\(\delta[n]=u[n]-u[n-1]\)—\(u[n]\)と 1 サンプルずらした\(u[n-1]\)の差は段差の 1 点だけが残りインパルスに戻る。積分と微分の離散版という表裏一体の関係。

なぜこの 2 つが「基本信号」なのか(存在意義)。

任意の信号のインパルスによる分解(後の畳み込みの導出で使う超重要式):

\[ x[n] = \sum_{k=-\infty}^{\infty} x[k]\delta[n-k] \]

導出:\(\delta[n-k]\)は\(n=k\)のときだけ 1、それ以外は 0。 したがって右辺の無限和のうち生き残るのは\(k=n\)の項だけで、その値は\(x[n] \cdot 1 = x[n]\)。左辺と一致する。∎

直感: どんな信号も「各時刻に置かれた、高さの違うインパルスの列」として見なせる、ということ。 レゴブロックを 1 個ずつ並べて任意の形を作るのと同じで、\(\delta\)が「ブロック 1 個」に相当する。

任意の信号のインパルス分解
図: 左の信号\(x[n]\)を、右のように「各時刻\(k\)に高さ\(x[k]\)で置いた 1 個のインパルス\(x[k]\delta[n-k]\)」へ分解する。これらを全部足し戻すと元の信号になる(\(x[n]=\sum_k x[k]\delta[n-k]\))。この「積み木」の見方が畳み込み(03章)の出発点になる。

この分解は何のためにやるのか(存在意義)。 ねらいはただ 1 つ、「たった 1 回の測定 \(h[n]\) から、あらゆる入力への出力を計算できるようにする」こと。次の 4 ステップでつながる:

  1. どんな入力も \(\sum_k x[k]\delta[n-k]\) と「インパルスの寄せ集め」に分解できる(=この式)
  2. 1 発 \(\delta[n]\) の応答は指紋 \(h[n]\)(インパルス応答の定義)
  3. 時不変性より、\(k\) だけ遅れた \(\delta[n-k]\) の応答は \(h[n-k]\)
  4. 線形性より全部足し合わせて、出力 \(= \sum_k x[k]h[n-k]\) = 畳み込み

つまりこの分解は「指紋 \(h[n]\) を全入力に使い回すための橋渡し」である。これが無ければ \(h[n]\) を測っても宝の持ち腐れ、逆にこれがあるおかげで 03 章以降のフィルタ理論すべてが 1 本の \(h[n]\) の上に乗る。鐘を一度叩いた "ゴーン"(\(h[n]\))さえ録っておけば、どんな連打の音も「遅らせて音量を変えた "ゴーン" の足し算」で予測できる——その「叩きの寄せ集め」という見方が、まさにこの式である。(4 ステップの数式化が 03 章の畳み込み。)

2. 正規化周波数

離散信号の世界では、時間の単位が「秒」ではなく「サンプル」になる。そこで周波数も正規化する。

アナログの正弦波\(\cos(\Omega t) = \cos(2\pi f t)\)を周期\(T\)でサンプリングすると:

\[ x[n] = \cos(\Omega n T) = \cos\left(2\pi \frac{f}{f_s} n\right) = \cos(\omega n) \]

ここで

\[ \omega = \Omega T = 2\pi \frac{f}{f_s} \quad [\text{rad/sample}] \]

正規化角周波数と呼ぶ。

直感:\(\omega\)は「1 サンプル進むごとに位相が何ラジアン回るか」。

最後の点が本質的で、離散信号の周波数は\(2\pi\)周期でしか意味を持たない。実際、任意の整数\(m\)に対して

\[ \cos((\omega + 2\pi m) n) = \cos(\omega n + 2\pi m n) = \cos(\omega n) \]

(\(mn\)は整数なので\(2\pi m n\)は位相として一周の整数倍、よって消える)。∎

正規化周波数
図: 左は\(\omega\)が「1 サンプルあたりの位相回転量」であること —\(\omega=0\)は回らず(直流)、\(\omega=\pi\)で 1 サンプルごとに半回転(±1 の交互)となりこれが表現できる最速。右は\(\omega\)と\(\omega+2\pi\)が全く同じサンプル列(黒)を生む様子で、離散信号の周波数が\(2\pi\)周期でしか意味を持たない(見るべきは\(0\)〜\(\pi\))ことを示す。

3. サンプリング定理とエイリアシング

直感

回転するタイヤをビデオで撮ると、逆回転して見えることがある(ワゴンホイール効果)。 これは「撮影のコマ間隔に対してタイヤが速く回りすぎて、遅い回転と区別がつかなくなる」現象で、 サンプリングにおけるエイリアシング(折り返し歪み)そのものである。

インパルス列によるサンプリングのモデル化

サンプリングを数式で扱うため、連続信号\(x_a(t)\)に周期\(T\)のインパルス列

\[ s(t) = \sum_{n=-\infty}^{\infty} \delta(t - nT) \]

を掛けたもの(\(\delta(\cdot)\)はディラックのデルタ関数)をサンプリング済み信号とみなす:

\[ x_s(t) = x_a(t) s(t) = \sum_{n=-\infty}^{\infty} x_a(nT) \delta(t - nT) \]

(デルタ関数の性質\(x_a(t)\delta(t-nT) = x_a(nT)\delta(t-nT)\)を使った。デルタは\(t=nT\)でしか「生きて」いないので、掛ける関数はその点の値だけが効く。)

インパルス列によるサンプリングのモデル化
図: サンプリングを「掛け算」でモデル化する 3 段。①連続信号\(x_a(t)\)に、②高さ 1・周期\(T\)のインパルス列(櫛)\(s(t)\)を掛けると、③各インパルスの高さがその時刻の標本値\(x_a(nT)\)になった信号\(x_s(t)\)が得られる。この積の形が、次のフーリエ級数展開でスペクトルの複製を導く鍵になる。

インパルス列のフーリエ級数展開(導出)

この節の作戦. 知りたいのは標本化後の信号\(x_s(t) = x_a(t)s(t)\)のスペクトル。ここで困りごとが 1 つある。

① フーリエ変換が素直に扱えるのは「足し算」だけ。 信号の和のスペクトルは各スペクトルの和になる(線形性)が、 \(x_s = x_a \times s\)のような掛け算のスペクトルを直接計算する道具は、まだ手元に無い。

② ただし例外が 1 つある。 掛ける相手が回転成分 1 個だけ——\(x_a(t) e^{jk\Omega_s t}\)の形——なら答えが分かっていて、 スペクトルは元の\(X_a\)の形を全く変えずに\(k\Omega_s\)だけ横にずらしただけのものになる(周波数シフト。次節の計算の中で 1 行で確認する)。

③ そこで作戦。 トゲの列\(s(t)\)を「回転成分の足し算」に書き直してしまえば、分配法則で

\[ \begin{aligned} x_s &= x_a \times \left(1 + e^{j\Omega_s t} + e^{-j\Omega_s t} + e^{j2\Omega_s t} + \cdots\right)\\ &= x_a + x_a e^{j\Omega_s t} + x_a e^{-j\Omega_s t} + x_a e^{j2\Omega_s t} + \cdots \end{aligned} \]

とバラバラにでき、すべての項が②の「扱える形」になる(各項に付く重みは次段で求める——結論を先に言うと全部同じ\(\frac{1}{T}\)になる)。 第 1 項はそのままの\(X_a\)(原品)、以降の項は\(X_a\)を\(\pm\Omega_s, \pm 2\Omega_s, \dots\)へずらしたコピー。 つまり「扱えない掛け算 1 個」が「原品とコピーがずらりと並ぶ絵」に化ける——これが次節で導くスペクトル複製の正体である。

この節のゴールはその準備、「\(s(t)\)を回転成分の足し算で表すこと」だけ。それを可能にする道具がフーリエ級数である。

フーリエ級数とは(最小限の導入). いまの\(s(t)\)は、トゲが\(T\)秒おきに立っているから周期\(T\)の周期関数である。 この\(T\)は §1 からずっと使っているサンプリング周期そのもの——トゲの間隔 = 標本を取る間隔だから、新しい記号ではない。 そして周期\(T\)で繰り返す関数は、「周期\(T\)の中にちょうど整数回収まる回転成分」—— 基本波\(e^{j\Omega_s t}\)(1 周期でちょうど 1 回転。その角周波数\(\Omega_s = \frac{2\pi}{T} = 2\pi f_s\)はサンプリング角周波数)と その高調波\(e^{jk\Omega_s t}\)(1 周期で\(k\)回転)——の重ね合わせで書ける。これがフーリエ級数の主張:

\[ s(t) = \sum_{k=-\infty}^{\infty} c_k e^{j k \Omega_s t} \]

部品がこの形に限られる理由は素直で、周期\(T\)の関数を作れるのは周期\(T\)を割り切る回転成分だけだから (半端な回転数の成分を混ぜると 1 周期後に同じ形に戻れない)。 未知なのは各成分の重み\(c_k\)——「どの速さの回転を、どれだけ混ぜるか」——である。

よくある疑問: 「表せる周波数は\(f_s/2\)までのはずでは?」 §2 で見た上限「意味のある周波数は\(0\)〜\(\pi\)(実周波数で\(f_s/2\))まで」は、数列\(x[n]\)(離散時間信号)の話。 いま展開している\(s(t)\)は連続時間の関数で、連続時間の世界に周波数の上限はない。 しかも\(f_s\)は\(s(t)\)の最大周波数ではなく最小(0 を除く)の周波数——周期\(T\)の関数の基本波が\(1/T = f_s\)で、高調波\(2f_s, 3f_s, \dots\)は上へ無限に続く。 むしろ「幅ゼロのトゲ」という無限に鋭い形を作るには無限に高い周波数が必要で、だから級数は無限に続く (後述の部分和のデモで、有限本数だとトゲが鈍いのはこのため。鋭さは高い高調波の担当)。 そしてこの「\(f_s\)の整数倍に立つ高調波」こそが、次節でスペクトルのコピーを\(f_s\)おきに複製する張本人。 もし\(s(t)\)の成分が\(f_s/2\)止まりなら、そもそもエイリアシングは起きない。

係数公式の導出(直交性で釣り上げる). 重み\(c_k\)は次の事実で取り出せる。整数\(l\)に対して回転成分を 1 周期分積分すると:

\[ \int_{-T/2}^{T/2} e^{j l \Omega_s t} dt = \left[\frac{e^{j l \Omega_s t}}{j l \Omega_s}\right]_{-T/2}^{T/2} = \frac{e^{j l \pi} - e^{-j l \pi}}{j l \Omega_s} = 0 \qquad (l \neq 0) \]

(\(e^{\pm j l \pi} = (-1)^l\)で分子が消える。\(l = 0\)なら被積分関数は 1 で積分は\(T\)。) つまり回転成分は 1 周期でちょうど整数周して打ち消し合い、回らない成分(\(l=0\))だけが生き残る。 この性質を使い、上の級数の両辺に\(e^{-j m \Omega_s t}\)を掛けて 1 周期積分すると:

\[ \int_{-T/2}^{T/2} s(t) e^{-j m \Omega_s t} dt = \sum_{k} c_k \int_{-T/2}^{T/2} e^{j (k-m) \Omega_s t} dt = c_m T \]

(右辺の積分は\(k = m\)の項だけが\(T\)、他はすべて 0。狙った周波数の成分だけを逆回転で「静止」させて釣り上げる操作で、04 章の DTFT と全く同じ発想。)よって:

\[ c_k = \frac{1}{T} \int_{-T/2}^{T/2} s(t) e^{-j k \Omega_s t} dt \]

これが教科書で「フーリエ係数の公式」と呼ばれるものの正体である。

インパルス列に適用する. 積分区間\([-T/2, T/2]\)の中にあるインパルスは\(t=0\)の\(\delta(t)\)一本だけ。デルタ関数の抜き出し性質 \(\int \delta(t) g(t) dt = g(0)\)より:

\[ c_k = \frac{1}{T} e^{-j k \Omega_s \cdot 0} = \frac{1}{T} \]

すなわちすべての係数が等しく\(1/T\):

\[ s(t) = \frac{1}{T} \sum_{k=-\infty}^{\infty} e^{j k \Omega_s t} \]

「滑らかな波を足してトゲ?」の確認. にわかには信じがたい式だが、途中まで実際に足してみると納得できる:

インパルス列に収束する部分和
図: 部分和\(\frac{1}{T}\sum_{k=-K}^{K} e^{jk\Omega_s t}\)を\(K\)を増やしながら描いたもの。\(t = nT\)(赤点線)ではすべての高調波が\(e^{jk\Omega_s nT} = e^{j2\pi kn} = 1\)と位相がぴったり揃って強め合い、高さ\(\frac{2K+1}{T}\)まで積み上がる。それ以外の時刻では各成分がばらばらの向きを向いて打ち消し合う。足す本数を増やすほど「揃う場所」だけが尖っていき、極限がインパルス列になる。

直感: 時間軸で「等間隔のトゲの列」は、周波数軸では「等間隔(\(\Omega_s\)おき)の成分がすべて同じ強さ\(\frac{1}{T}\)で並んだもの」。 この「等強度の高調波の和」という表現を\(x_s = x_a s\)に代入するのが次節である。

サンプリングされた信号のスペクトル(導出)

\(x_a(t)\)のフーリエ変換を\(X_a(j\Omega) = \int_{-\infty}^{\infty} x_a(t) e^{-j\Omega t} dt\)とする。 \(x_s(t)\)のフーリエ変換を計算する:

\[ X_s(j\Omega) = \int_{-\infty}^{\infty} x_s(t) e^{-j\Omega t} dt = \int_{-\infty}^{\infty} x_a(t) \left[\frac{1}{T}\sum_{k=-\infty}^{\infty} e^{jk\Omega_s t}\right] e^{-j\Omega t} dt \]

和と積分を入れ替えて:

\[ X_s(j\Omega) = \frac{1}{T} \sum_{k=-\infty}^{\infty} \int_{-\infty}^{\infty} x_a(t) e^{-j(\Omega - k\Omega_s) t} dt = \frac{1}{T} \sum_{k=-\infty}^{\infty} X_a\big(j(\Omega - k\Omega_s)\big) \]

(積分の中身は「周波数を\(\Omega - k\Omega_s\)に置き換えたフーリエ変換の定義式」そのものである。)

\[ \boxed{X_s(j\Omega) = \frac{1}{T} \sum_{k=-\infty}^{\infty} X_a\big(j(\Omega - k\Omega_s)\big)} \]

この式の意味(最重要の直感)

サンプリングすると、元のスペクトル\(X_a\)のコピーが\(\Omega_s = 2\pi f_s\)おきに無限に並ぶ

スペクトルの複製とエイリアシング
図: 左は\(f_s > 2B\)でコピー同士に隙間があり復元可能。右は\(f_s < 2B\)でコピーの裾が重なり(赤)、混入した成分は元の成分と区別できない。

エイリアシングの周波数を具体的に導出

周波数\(f_0\)(ただし\(f_s/2 < f_0 < f_s\))の正弦波\(\cos(2\pi f_0 t)\)をサンプリングする:

\[ x[n] = \cos\left(2\pi \frac{f_0}{f_s} n\right) \]

ここで\(f_1 = f_s - f_0\)(これは\(0 < f_1 < f_s/2\)を満たす)とおくと\(f_0 = f_s - f_1\)なので:

\[ x[n] = \cos\left(2\pi \frac{f_s - f_1}{f_s} n\right) = \cos\left(2\pi n - 2\pi \frac{f_1}{f_s} n\right) \]

\(2\pi n\)は一周の整数倍だから位相として消え、さらに\(\cos(-\theta)=\cos\theta\)より:

\[ x[n] = \cos\left(2\pi \frac{f_1}{f_s} n\right) \]

つまり \(f_0\)の正弦波のサンプル列は、\(f_s - f_0\)の正弦波のサンプル列と完全に同一。∎

例:\(f_s = 48\)kHz で 30 kHz の音をサンプリングすると、\(48-30 = 18\)kHz の音と区別がつかない。 だから A/D 変換の前には必ずアナログのローパスフィルタ(アンチエイリアシングフィルタ)を入れる。

エイリアシングの時間波形
図: 上の例そのもの。30 kHz(橙)と 18 kHz(青)は連続波形としては全く別物だが、48 kHz のサンプル点(黒丸)の上では 1 点残らず一致してしまう。

4. まとめ — IIR とのつながり