第4章

離散時間信号

この章のねらい

  • サンプリングの考え方と x[n] = x(nT) の記法に慣れる
  • 正規化角周波数を「1サンプルあたりに進む位相」として説明できるようになる
  • 離散時間の周波数は 2π 周期で、実質 ω ∈ [-π, π] の範囲しかないことを理解する

4.1 離散時間信号の表し方

やる夫

フーリエ級数にフーリエ変換、道具はだいぶ揃ってきたお。でも気づいてしまったんだお。この教材、「ディジタル信号処理」のはずなのに、まだコンピュータのコの字も出てきてないお。

やらない夫

いいタイミングだ。この章からがその本番だ。で、いきなりだが困った事実から始める。コンピュータは連続信号をそのまま持てない

やる夫

ん? 録音した音声、普通にパソコンに入ってるお。あれは何なんだお。

やらない夫

あれは連続信号「そのもの」じゃない。考えてみろ。連続信号 x(t)x(t) は、どんなに短い時間にも無限個の時刻があって、そのすべてに値を持っている。0秒と0.001秒の間だけでも無限個だ。メモリが有限のコンピュータに無限個の数は入らないだろ、常識的に考えて。

やる夫

むむ…。確かに全部の瞬間は無理だお。でも、全部じゃなくて、ところどころの値なら覚えられるお。

やらない夫

それが答えだ。一定の時間間隔 TT ごとに信号の値を拾って、数の列として記録する。この操作をサンプリング(標本化)と呼び、TTサンプリング周期と呼ぶ。拾った数の列はこう書く。

x[n]=x(nT)(n=,2,1,0,1,2,)(4.1)x[n] = x(nT) \qquad (n = \dots, -2, -1, 0, 1, 2, \dots) \tag{4.1}

時刻 0,T,2T,3T,0, T, 2T, 3T, \dots における値を順番に並べただけだ。この x[n]x[n]離散時間信号と呼ぶ。

やる夫

カッコが丸から角に変わってるお。誤植かお?

やらない夫

わざとだ。むしろこの教材で一番守る記法かもしれない。丸括弧 x(t)x(t) は連続時間tt は実数で単位は秒。角括弧 x[n]x[n] は離散時間nn はただの整数で、単位を持たない通し番号だ。「何秒の値か」ではなく「何番目の値か」。プログラムの配列 x[n] と同じ気持ちで読んでいい。

やる夫

配列って言われると急に親近感が湧くお。

やらない夫

実際、コンピュータの中の信号は本当にただの配列だ。あと、1秒あたりに何個サンプルを取るかをサンプリング周波数と呼ぶ。

fs=1T[Hz](4.2)f_s = \frac{1}{T} \quad [\text{Hz}] \tag{4.2}

例えば音楽CDは fs=44100f_s = 44100 Hz。T22.7T \approx 22.7 マイクロ秒ごとに1個、1秒あたり44100個の数で音楽を表している。

やる夫

…ちょっと待つお。サンプルとサンプルのの信号はどこに行ったんだお。TT の間に信号が暴れてたら、まるごと見逃すお。捨てちゃっていいのかお?

やらない夫

良すぎる質問だ。結論だけ先に言うと、条件さえ満たせば、捨てたように見えた間の情報は完全に復元できる。その驚くべき定理(サンプリング定理)は第10章でやる。そこに至る伏線が、実はこの章の後半にもう現れる。

4.2 正規化角周波数

やらない夫

さて、信号処理の主役は今までずっとサイン波だった。なら次にやることは決まってる。サイン波をサンプリングしたら何になるかだ。その前に記号の約束をひとつ。ここからは連続時間の角周波数を大文字の Ω\Omega、離散時間用の角周波数を小文字の ω\omega と書き分ける。

やる夫

今まで ω\omega って書いてたやつが Ω\Omega に昇格したのかお。ややこしいお。

やらない夫

すぐ慣れる。書き分ける理由はこの直後にわかる。連続時間のサイン波 x(t)=cosΩtx(t) = \cos \Omega t を周期 TT でサンプリングすると

x[n]=cos(ΩnT)=cos((ΩT)n)(4.3)x[n] = \cos(\Omega \, n T) = \cos\bigl( (\Omega T)\, n \bigr) \tag{4.3}

Ω\OmegaTT が必ず ΩT\Omega T という積の形でセットになる。そこでこの積に名前を付ける。

ω=ΩT[rad/サンプル](4.4)\omega = \Omega T \quad [\text{rad/サンプル}] \tag{4.4}

これが正規化角周波数だ。離散時間のサイン波は x[n]=cosωnx[n] = \cos \omega n と書ける。

やる夫

単位が「rad/サンプル」…。rad/秒じゃないのかお。

やらない夫

そこが急所だ。Ω\Omega は「1あたりに進む位相」だった。TT は「1サンプルにかかる秒数」。掛け算すると秒が消えて、ω\omega「1サンプルあたりに進む位相」になる。離散時間の世界には「秒」が無い。あるのは nn という通し番号だけだから、周波数も「1個進むごとに位相がどれだけ回るか」で測るしかないわけだ。

やる夫

ふむ…。具体例が欲しいお。

やらない夫

1 kHz のサイン波を fs=8f_s = 8 kHz でサンプリングしてみろ。ω=ΩT=2π1000/8000=π/4\omega = \Omega T = 2\pi \cdot 1000 / 8000 = \pi/4。1サンプルごとに位相が π/4\pi/4、つまり45度ずつ進む。8サンプルでちょうど1周だな。下のデモで fffsf_s を別々に動かして、ω\omega がどう変わるか見てみろ。

SAMPLING BASICS INTERACTIVE
f を固定したまま fs だけ上げる(操作)→ サンプル点が密になり、1サンプルあたりに進む位相 ω = 2πf/fs が小さくなる(観察)→ ω は信号単体ではなく信号とサンプリングの組み合わせで決まる「正規化」周波数だと分かる(意味)。
やる夫

おー。fsf_s を上げると点がぎっしり並んで、ω\omega は小さくなるお。逆に ff を上げると、点と点の間で波がガバッと進むようになって ω\omega が大きくなるお。

やらない夫

そこで気づいてほしいことがある。同じ 1 kHz の波でも、fsf_s が変われば ω\omega は変わるω\omega は信号そのものの性質ではなく、「信号とサンプリングの組み合わせ」で決まる量だ。だから「正規化」角周波数という。サンプリング周期を基準(=1)に取り直した周波数、ということだな。

やる夫

離散時間の世界に入った瞬間、「本当の周波数が何Hzだったか」は番号 nn の列からは見えなくなるってことかお。ω\omega だけが残る、と。

やらない夫

いい要約だ。コンピュータの中の信号処理は、すべてこの ω\omega の世界で行われる。Hz に戻したくなったら f=ωfs/2πf = \omega f_s / 2\pi で換算すればいい。

4.3 離散時間信号の不思議な性質

やらない夫

ここからが離散時間の本当に面白いところだ。cosωn\cos \omega nω\omega をどんどん大きくしていったら、何が起きると思う?

やる夫

そりゃ、どんどん細かく振動するんじゃないかお。連続のときはそうだったお。

やらない夫

ではこれを見てもらおう。ω\omega2π2\pi を足してみる。

cos((ω+2π)n)=cos(ωn+2πn)=cosωn(4.5)\cos\bigl( (\omega + 2\pi) n \bigr) = \cos( \omega n + 2\pi n ) = \cos \omega n \tag{4.5}
やる夫

…は!? 消えたお! 2πn2\pi n がまるごと消えたお!

やらない夫

消える理由を言ってみろ。

やる夫

えーと、nn整数だから、2πn2\pi n2π2\pi の整数倍…つまり「ちょうど何周か」のズレだお。cos は1周回ったら元通りだから、影響ゼロ…。あ、そうか、nn が整数じゃなかったらこうはいかないお! 連続時間の tt は実数だから、cos((Ω+2π)t)\cos((\Omega + 2\pi)t)cosΩt\cos \Omega t は途中の tt でズレるけど、離散時間は整数の瞬間しか見ないから、ズレる場面を見られないんだお!

やらない夫

完璧だ。つまり離散時間の世界では、周波数 ω\omega のサイン波と周波数 ω+2π\omega + 2\pi のサイン波は、完全に同一の信号になる。ω+4π\omega + 4\pi でも ω2π\omega - 2\pi でも同じだ。区別がつかないんじゃなくて、サンプル列として本当に同じものだ。デモで確かめてみろ。

OMEGA PERIODICITY — ω vs ω+2π INTERACTIVE
ω=1.0 から 2π 増やして 7.28 にする(操作)→ 緑のサンプル点が1個も動かず、破線(等価周波数の連続波)も同じ形に戻る(観察)→ n が整数だから cos((ω+2π)n)=cos(ωn) で、意味のある周波数は ω∈[-π,π] だけと分かる(意味)。
やる夫

ほんとだお…。ω=1.0\omega = 1.0ω=7.28\omega = 7.28=1.0+2π=1.0+2\pi)で、緑の点が1個も動かないお。しかも ω\omega を上げていくと、途中から破線の波がだんだん遅くなってくのが不気味だお。細かくなるはずじゃないのかお。

やらない夫

それが2つ目の驚きだ。ω\omegaπ\pi を超えると、サンプル列は 2πω2\pi - \omega というより低い周波数の波と同じに見え始める。cos は偶関数で cos(ωn)=cosωn\cos(-\omega n) = \cos \omega n でもあるから、結局、離散時間の周波数として意味のある範囲は

πωπ-\pi \le \omega \le \pi

しかない。この範囲の外の ω\omega は、2π2\pi の整数倍を足し引きして必ずこの中のどれかに折り返される

やる夫

じゃあ離散時間の世界で「一番速い振動」は ω=π\omega = \pi ってことかお。

やらない夫

そうだ。ω=π\omega = \pi のとき x[n]=cosπn=(1)nx[n] = \cos \pi n = (-1)^n、つまり +1,1,+1,1,+1, -1, +1, -1, \dots の交互パターン。サンプル列としてこれより速く暴れる方法は存在しない。1点ごとに符号を反転する以上の変化は表しようがないからな。

やる夫

…嫌な予感がするんだお。fs/2f_s/2 より速い波を、知らずにサンプリングしちゃったらどうなるんだお。

やらない夫

式 (4.5) の通りのことが起きる。π\pi を超えた周波数は折り返されて、まったく別の低い周波数の信号に化けて記録される。これをエイリアシング(折り返しひずみ)と呼ぶ。車のタイヤが映像で逆回転して見えるアレが実例だ。

やる夫

化けるのかお…。録ったデータからは化けたかどうか分からないんだお? 怖すぎるお。

やらない夫

だから「サンプリングする前に fs/2f_s/2 以上の成分を取り除いておく」という掟がある。この話を厳密にやるのが第10章のサンプリング定理だ。今日のところは、離散時間の周波数の地図は π-\pi から π\pi までしかない、ここまで持ち帰れば十分だ。

この章のまとめ
  • コンピュータは連続信号を持てない。一定間隔 TT で値を拾うサンプリングにより x[n]=x(nT)x[n] = x(nT) という数列(離散時間信号)にする
  • 丸括弧 x(t)x(t) は連続時間、角括弧 x[n]x[n] は離散時間。nn は単位の無いただの整数
  • サンプリング周波数は fs=1/Tf_s = 1/T正規化角周波数 ω=ΩT\omega = \Omega T は「1サンプルあたりに進む位相」[rad/サンプル]
  • 同じ信号でも fsf_s が変われば ω\omega は変わる
  • nn が整数なので cos((ω+2π)n)=cosωn\cos((\omega + 2\pi)n) = \cos \omega nω\omegaω+2π\omega + 2\pi は完全に同じ信号で、意味のある周波数は ω[π,π]\omega \in [-\pi, \pi] のみ
  • 最高周波数は ω=π\omega = \pi=fs/2= f_s/2)。これを超える成分は折り返される(エイリアシング、第10章へ続く)