手習ひデジタル信号処理(12) STM32F446、IIRフィルタその1、Float型

Joseph Halfmoon

今回から、IIRフィルタに入ります。前回までのFIRフィルタに比べると、計算負荷(あるいは回路規模)は小さくなるけれども、「いろいろ」あって難しい、と。ちょっと上級生になった感じで嬉しいです。まずは、基本形を出発点に、さっそく計算精度の問題の一端を垣間見ることになるみたいです。浮動小数点処理でもグラグラするのね。

※「手習ひデジタル信号処理」投稿順 Indexはこちら

勝手に手習ひさせていただいております教科書へのリンクは以下です。

三上直樹先生著、工学社『「Armマイコン」プログラムで学ぶデジタル信号処理

ご本に掲載されているプログラム・ソースの引用等は避けますが、Arm社のMbed環境上で公開されています。ただし、IIRフィルタの係数を計算するプログラムについては、ご本を買ってパスワードを手に入れないとダウンロードできませぬ。まあ、広大なネットの海にはIIRフィルタの設計プログラムが結構あるように思われるので、このご本のプログラムでなくても作成できるような気もしないでもないです(個人の感想です。)

IIRフィルタ、単精度と倍精度の比較ぞなもし

IIRフィルタの構成の基本を実際に演習する初回は遅延器を共有化した直接形です。これが中々クセ者でした。Float型(単精度浮動小数)で計算したときとDouble型(倍精度浮動小数)で計算したときの挙動の違いを見るというのが、最初の課題。今回は、まずBuildFloat型での計算。

次回、同じ構成のDouble型計算の版をやってみて、その違いを比較してみよう、ということであります。

ぶっちゃけ、三上先生の御本によればFloat型のフィルタに遮断周波数ギリギリの周波数の信号を入れると、「波形が大きく揺らぐ」だけでなく、「出力信号が入力信号より大きくなる」ような事態が発生する筈、と。

今回は、三上先生のサンプルプログラムをそのまま、Mbed環境でビルドし、Nucleo-F446REボードに書き込みました。ビルドしたオブジェクトファイルのコード量は左のようです。FIRフィルタともあまり違いはないようです。まあプログラム小さいし。

動作結果の観察

まずは、時間波形で観察してみます。黄色がオシロのCH1で、入力正弦波です。オフセット0V、振幅1V、周波数365Hzです。IIRフィルタの設計は、遮断周波数355Hzの低域通過フィルタです。なので「そろそろ遮断されちゃう」ような周波数の筈。青色がオシロのCH2で出力です。

IIRdirFloatTIM上の青色波形を見ると波形が揺れてます。また、振幅、遮断されるどころかデカクなっているんでないかい。ぐだぐだだな。

青色の出力波形のグダグダな様子、三上先生の御本ではもう一台のNucleo-F446RE上のオシロツールで波形を5つ重ねて観察してます。しかし当方にF446REは1台しかないので同じ方法はできません。手元のDigilent Analog Discovery2の機能で適当なものを使うしかありません。まずは、何時もオシロの波形の右側にでている「ヒストグラム」を大きい画面で表示させてみました。こんな感じ。

IIRdirFloatHist上のヒストグラム見ると、黄色の入力波形の「スパッ」とした分布に比べると、青の出力波形がグダグダな感じは歴然。しかし、もっといい見方はないものか?ありました。

Persistence

という機能です。時間波形は時間波形なのですが、複数回(以下例は2000回以上重ねてます)の測定値を重ねて波形の分布を描いてくれる機能です。これなら三上先生のお手製オシロプログラムに匹敵する(多分、個人の感想です。)こんな感じ。

IIRdirFloatPersistenceView下の出力波形、かなり太い幅(500mVくらい?)まで広がっておることが分かります。分布の具合は右のグラデーションで分かるし。。。Digilentありがとう。

さて、お楽しみの振幅の周波数特性をとらないではいられません。サンプリングは10kHzということで、ナイキスト周波数5kHzまでの周波数特性がこちら。

IIRdirFloatBode阻止域の減衰量は40dBという設計パラメータです。この「遠くからみた」実機特性だと、ちょっと三上先生設計ツールの波形とは違う気もするも、雰囲気はあってる気がします。ちょうど遮断周波数あたりにピコっとピークがあり、その上、Out of range on channels: 2 などと警告まででてます。

まあ飛んで火にいる夏の虫、注文どおりだあ。

上限を1kHzまでにして拡大してみると、400Hzあたりの小山も見えてきて、より設計ツールの波形により近づきました。こんな感じ。

IIRdirFloatBode1kやっぱり Out of rangeが気になります。

Analog Discovery2の制御ソフトを見てみると、波形の測定レンジが2Vに設定されているようでした(私は設定していないので、デフォルト、それとも自動設定?)本来ならば2Vに収まるべき波形ではあるのです。しかし、先ほどみたとおり、入力より出力が大きくなってしまうピークがあるのです。そこで測定レンジを広げてみました。5VではまだOut of rangeが出ます。10Vとすると消えました。ムムむ。一瞬、そんなにデカイ値が見えているってこと??

Out of rangeが消えたときの周波数特性がこちら。グラフで見る分にはなんも変わりはありませぬ。ちょっと「目を粗くした」ので凸凹してる?

IIRdirFloatBode1k10Vこの状態で、下のようにカーソルを出してピークのあたりを探ってみると、363Hz付近で、3dBくらいの値が読み取れました。以下の設定だと約2Hz刻みくらいで測定しているので、こんなもんかね。なお、設計ツール上のピークは4dBくらい。

IIRdirFloatBode1k10Vmeasure小さく見えるピークだけれど、結構ヤバイ感じであることは納得できましたです。さて、次回、Double型では改善するんだよね。ホントか。

手習ひデジタル信号処理(11) STM32F446、FIRフィルタその3、直接形Class へ戻る

手習ひデジタル信号処理(13) STM32F446、IIRフィルタその2、Double型