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

Joseph Halfmoon

前回は、IIRフィルタを単精度浮動小数(Float型)で動かして、「予定通り」計算精度の問題を目にすることができました。今回は、同じIIRフィルタを倍精度浮動小数(Double型)での計算に変更するだけで、その問題が消える件をしみじみ味わってみたいと思います。予定通りとは言え、前回結果と比べると魔法のよう。

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

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

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

プログラム・ソースの引用等は避けますが、Arm社のMbed環境上で公開されています。

倍精度化した直接形IIRフィルタのプログラムのビルド

フィルタの係数については、倍精度用のものに入れ替えましたが、DoubleBuild本体プログラムは、前回のものを出発点に、float型で計算しているところをdouble型に書き換えていきました。三上先生の教科書のプログラムコードリストには、該当部分に網掛けがあるので、淡々と作業すれば数分で変更可能でした。積算をしている部分こそ倍精度ですが、関数が最終的に返す結果は単精度です。こんなんで劇的改善するとは頭では理解したつもりでも、ちょっと不思議。

例によって Arm社、MbedのWeb環境でのビルドの結果を左に掲げました。倍精度とてどのくらいの増加があるか?前回結果と比べてみると、Codeサイズこそわずかに増えてますが、後はほとんど変更なし。1Kバイトくらいのコード量の増加など、512KBフラッシュのF446REでは微々たるものかと。

どちらかというと、倍精度計算による計算負荷の増大の方が心配です。Cortex m4Fは単精度のFPUのみの筈なので。

動作結果の観察

前回とまったく同じ入力波形を与えて、まずは時間波形を観察してみます。黄色が入力波形、オシロのC1です。振幅1V、オフセット0V、周波数365Hzの正弦波です。そして青色がIIRフィルタを通って出てきた出力波形です。フィルタの遮断周波数の設計値が355Hzなので、「そろそろ遮断されちゃう」周波数のはずなのに、前回は入力波形よりも振幅が大きくなる現象が観察されたのでした。

今回は、明らかに黄色の入力よりも、青色の出力の波形の振幅が小さくなっており、遮断されそうになっている感があります。また、前回は、周期により波形の上下変動が大きく、結構揺れてました。しかし、今回は上下とも安定している感じです。

この様子は、前回も使用した Analog Discovery2のPersistenceウインドウを使うと明らかにできます。以下は上が入力、下が出力のトレースを894回重ねたものです。どちらも安定した赤の線で、分布が広がってはいません。

DoublePer前回結果を見ると、出力波形のバラツキの幅が広く、黄色から緑くらいの色合いの裾野が上下に広がっていました。それだけバラツキが改善されたということだと思います。

周波数特性

冒頭のアイキャッチ画像に10Hzから5kHz(ナイキスト周波数)までの周波数振幅特性を掲げました。以下は、前回問題だった通過から遮断の境界付近を拡大した振幅特性のグラフです。

DoubleBodeB
前回は、-40dBに向かって落ちる前に、4dB近くも跳ね上がるピークがあり、これが入力より振幅大になる原因でした。さらにその前には落ち込みもあって通過域はフラットといえるようなものではなく波打っていました。しかし、Double型にしただけで、通過域もフラットに近づき、問題のピークも消えました。

ご本に書かれているとおりの改善ですが、こうして現物確認するとちょっと嬉しい信号処理。

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

手習ひデジタル信号処理(14) STM32F446、IIRフィルタその3、継続型 へ進む