サンプリングレート変換 その3

本題のサンプリングレート変換の話に入りましょう.

1/n のサンプリング周波数にダウンコンバート

例として,サンプリング周波数 16 kHz の信号をサンプリング周波数 8 kHz,つまり 1/2 のサンプリング周波数に変換することを考えてみましょう.

16 kHz のサンプリング値を

( 1, 2, 3, 4, 5, 6, ... )

とします. これを 8 kHz のサンプリング周波数に変換するために,単純にサンプルを間引いてみましょう.

( 1,    3,    5,    ... )

この操作を周波数領域で見てみましょう.

downsample_wrong.png

サンプリング周波数 16 kHz の信号には,最大で 8 kHz までの信号が入っている可能性があります. この信号を単純に間引きして 8 kHz の信号に変換した場合,4 kHz 〜 8 kHz の成分が折り返し歪みとして現れることになります.

折り返し歪みが現れないようにするには,どうすればいいのでしょうか. サンプリングの時同様に間引き前に 4 kHz 〜 8 kHz の成分を除去すればいいのです. その後でサンプリング値を間引けば折り返し歪みは現れません.

downsample_ok.png

m 倍のサンプリング周波数にアップコンバート

今度は m 倍のサンプリング周波数に変換する場合について. 例として,8 kHz サンプリングの信号を 16 kHz サンプリングに変換する場合を考えてみます.

まず,サンプル値を水増しします. その1で見たようにサンプリングとは「インパルス(ヒゲのように鋭い波形)列への変換」です. 8 kHz サンプリングの波形をそのまま 16 kHz サンプリングに持っていくには,間に 0 を挿入すればいいことになります.

( 1,    2,    3,    4, ... )
        ↓
( 1, 0, 2, 0, 3, 0, 4, 0, ... )

で,このままでは 8 kHz サンプリング時に現れた 4 kHz 〜 8 kHz の鏡像も実在する信号として扱われてしまうので,これを除去します.

これで終了です.

upsample_ok.png

m/n 倍のサンプリング周波数に変換

今度は m/n 倍のサンプリング周波数に変換する場合を考えてみます. 例えば,44.1 kHz サンプリングの信号を 48 kHz に変換する場合はこれに当たります. 48000 / 44100 = 160 / 147 倍の変換です.

これは,上記の「m 倍に変換」と「1/n に変換」を組み合わせれば実現できます. 単純に処理をつなぎ合わせてみると

  1. m 倍にサンプリング列を水増し
  2. 鏡像をカット
  3. 高い周波数をカット
  4. n サンプルごとに間引き

となります. が,「鏡像をカット」「高い周波数をカット」という2つの処理は1回の処理にまとめることができます. まとめてしまうと

  1. m 倍にサンプリング列を水増し
  2. 変換前・変換後のサンプリング周波数で低いほうの周波数の 1/2 の周波数以上の成分をカット
  3. n サンプルごとに間引き

となります.

サンプリングレート変換 その2

まずは,「サンプリング」するということについて考えてみましょう.

フーリエ変換

ここらへんの議論の元になっている理論です.

要するに,

  • 「時間と振幅」で表される波形を「周波数と振幅」という表現に変換
  • 「周波数と振幅」という表現から「時間と振幅」という表現に変換すると元の波形に戻る

というところをベースにした話です.

理工系の学生なら,名前とその効能ぐらいは知っているはず. 特に電気・電子系の場合はこれ無しでは話が始まりません. 「細かい議論はともかく,感覚的に理解したい」と言う向きには「フーリエの冒険」という本があるので,これを読むといいでしょう.

サンプリング

というわけで,サンプリングについて. 理屈は抜きにして図で見てみましょう.

cont.png

例えばこういう波形をサンプリングすると

sample.png

こうなります.

元の波形が連続した時間で連続した値を持っているのに対し,サンプリング後の波形は,飛び飛びの時刻以外での振幅は 0 となっています.

で,サンプリング後の波形だが,ヒゲの先頭をなだらかな線で結んでやれば元の波形を復元できそうに見えます. が,それにはある条件が必要です. その「ある条件」を満たさない例を見てみましょう.

エイリアジング

図で説明します.

7500.png

7500 Hz の正弦波を 8000 Hz でサンプリングしてみると…

500.png

まるで 500 Hz の正弦波のようになってしまいます.

サンプリングした後は,赤線の波形になってしまうので,元の波形が 7500 Hz なのか 500 Hz なのか区別が付かなくなってしまいます. この現象は「エイリアジング」または「折り返し歪み」と呼ばれています.

周波数軸で見ると

まず,元の波形をフーリエ変換してスペクトルを見ると,下図のようになるとします.

spectrum_cont.png

この場合,元波形をサンプリングした波形のスペクトルは下図のようになります. 図中で fs とあるのはサンプリング周波数です.

spectrum_sample.png

元波形のスペクトルと同じスペクトルが fs, 2fs, 3fs …の上下に対称に現れます.

下図のように高い周波数が含まれている波形の場合は

spectrum_cont_alias.png

サンプリングすると,fs の下側に生じるスペクトルが元のスペクトルと重なってしまいます.

spectrum_sample_alias.png

で,fs の下側に生じるスペクトルは元波形のスペクトルと対称なので,1/2 fs を中心に元スペクトルが折り返して現れているようにも見ることができます. 「折り返し歪み」と呼ばれるのはこのためです.

先ほどのエイリアジングも,このために生じている現象です.

エイリアジングを防ぐためには

1/2 fs 以上の周波数成分がエイリアジングの原因であることがわかりました. ならば,エイリアジングを防ぐ方法もわかりますね.

元波形の 1/2 fs 以上の周波数成分を除去してからサンプリングすれば良い

のです. 元波形のほうを中心に考えると

元波形に含まれる最高の周波数の 2 倍以上の周波数でサンプリングすれば良い

とも言えます.

いずれにしても 1/2 fs という,「サンプリング周波数の半分」の周波数が大事ですね. というわけで,これには「ナイキスト周波数」という名前が付いています.


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-08-14 (木) 22:34:01 (5595d)