デシメーションというのは古代ローマの恐ろしい刑罰にその名を発するようです。長い歴史の中でも実例はそれほど多くないみたいです。しかしデジタル信号処理業界?ソフトウエア無線などではすこぶる頻繁にお目にかかります。サンプリング周波数を低い方に変更するダウンサンプリングとそれに伴う低域通過フィルタ処理を行うもの。
※「手習ひデジタル信号処理」投稿順 Indexはこちら
※参照させていただいております三上直樹先生著の教科書は以下です。
工学社『「Armマイコン」プログラムで学ぶデジタル信号処理』
今回使用させていただいている三上先生の御ソースは、Arm社のMbedのWeb環境(要登録、無料)内で公開されており、「呂」で検索すれば発見できます。該当ソースを実機ST Microelectronics社製 Nucleo-F446REボード(Arm Cortex-M4Fコア)向けにMbed環境内でビルドして実行しています。
今回はいつもと逆に三上先生のプログラムを実際に動かしてその動作を観察するのを先にしたいと思います。手習させていただくプログラムの概要は以下です。
-
- 入力信号のサンプリング周波数10kHzに対して、遮断周波数200HzのLPF
- 3段のCIC(Cascaded Integrator-Comb)フィルタで1/5にダウンサンプリング
- ダウンサンプリングした信号を80次のFIRフィルタで遮断周波数200Hzのローパスして出力。
三上先生によるとCICフィルタを使わないでFIRフィルタのみで同程度の特性を得ようとすると400次が必要、と。
プログラムのビルド
Arm社、MbedのWebコンパイラでビルドした結果が以下に。なお、利用しているMbedOSのバージョンはOS2です。軽いやつ。OS6のベアメタル環境的なもの。
実機実験結果
最初にCICフィルタONで、5対1のデシメーションを行っているケースです。まずは入力信号100Hzの波形を入力した場合。黄色C1が入力波形、青色C2が出力波形です。
デジタル・フィルタを通過する分若干の遅れがあり、サンプリング周波数も遅くなっているのでカクカク感がありますが、ほぼほぼゲイン1で信号が通っているように見えます。
続いて200Hz。周波数が高くなったのでカクカク感がキツクなりましたが、まだゲイン1に近いようです。
500Hzではどうよ。ほぼほぼ完全に平らかになってしまいました。これはほぼほぼ80次のFIRフィルタのお陰。
CICフィルタが効いているところの確認
CICフィルタの「ご利益」がある部分は、周波数特性を見てみないと分かりませぬ。まずCICフィルタがONのときの振幅特性が以下に。200Hzでガクンと落ちた後は細かい凸凹があるものの、入力信号のサンプリング周波数である10kHzまで落ちたままです。
一方、CICフィルタをOFFとした場合の振幅特性が以下に。2kHz付近とか明らかに大きなピークが隠れています。
三上先生の教科書では、周波数2.2kHzの入力信号を入れてみよ、とご指示があります。まずはCICフィルタONのときです。500Hzのときと同様青色の出力信号は平らかです。
一方、同じ入力信号に対してCICフィルタをOFFったものが以下に。ほぼ200Hzのゆっくりした出力信号が生じてしまっております。これは2.2kHzをサンプリング周波数200Hzでサンプリングしていることで生じるエイリアスとな。
見事なエイリアスですな。ある意味感動。
サンプリング周波数にはデシメーションが必要だと。そしてそれをするならCICフィルタであると。身に染みましてございまする。