前回は非巡回型移動平均で単刀直入、分かり易かったです。今回「から」3回は巡回型移動平均です。3回分なのは、三上先生のご方針が、「巡回型」でも同じことができることを示したのち、「巡回型に潜む魔物」を垣間見、さらに整数処理の「黒魔術」の一端に触れるという流れなのかな、と忖度した次第。ホントか?
※「手習ひデジタル信号処理」投稿順 Indexはこちら
さて、勝手に手習ひさせていただいとりますご本へのリンクをまず掲げます。
三上直樹先生著、工学社『「Armマイコン」プログラムで学ぶデジタル信号処理』
例によってご本のネタバレにならぬようソースの引用等は行いませんが、三上先生の御ソースはArm社のMbed環境上で公開されています。
「巡回型」の移動平均のブロックダイアグラム
巡回型移動平均の1回目は、先に櫛型フィルタ、後に積分器のスタイルであります。なんでこれで移動平均になるのだか、凡人には直観しかねるものがあります。ご本には伝達関数の導き方など解説されていますが、前回と同じになるのはなんのマジック?かと感心するばかり。
確かに、前回の分かり易かったブロックダイアグラムに比べると、計算量は少ないです。丸に十の字の加算ブロックが前回のほぼ10分の1の分量かと。巡回型の威力ここにありですか。
プログラムを入力してビルド
さてArm社のMbed環境にログインいたし、今回のプログラムを入力させていただいてビルドいたしました。それにつけてもちょっと知りたいのは、三上先生の御ソースで多用されている識別子の後の “_” です。識別子の前に”_”(特に2個)はツールチェーンの「専権事項」なので使ってはイケないが染みついていますが、後ろにつけるのは誰がやっても良い筈。先生の御ソース拝見すると、グローバルな変数、定数には皆つけているみたい。ファイルをまたいでも検索するときなど便利だからかな~。ローカルなやつらにはアンダバー無いし。こういう書き方が定番のお作法なのかな~。まあ「手習ひ」なのでそのまま真似させていただいています。
そういいながらも我を通してしまったのは、”__IO”というCMSIS定義のvolatileの「別名」。CMSISというからにはArm社の規定なのでしょうが、アンダバー、アンダバーと2回書くのは、最低限にしたい方なので素の volatile にいたしました(__IOと書くと、直ぐに__IOの意味を忘却して後でビックリすると予想しました。)同じ volatileでもね、文脈により、意味で分けたいという感じなんだろうか?
ビルドした結果は左のようです。非巡回型より巡回型は演算量が小さい、といいつつ、コード量、RAM量的には前回とほぼほぼ一緒。F446REの充実したメモリ量からすると、吹けば飛ぶような分量であります。
何回浮動小数点演算を行っているのだか勘定したら、演算量自体は、軽くなったことが分かるのでしょうが、今回みたいな軽さでそれをやってもなんだかな~
とりあえずビルドしたオブジェクトをNucleo-F446REに書き込んで準備完了であります。
実行結果
例によって、F446REにとりつけたアナログフロントエンド?にDigilent社、AnalogDiscovery2を接続して実験であります。「前回と同じ」ということで、既に挙動は分かっています。まずは波形は減衰するものの出力されてくる250Hz, 振幅500mVの入力から。黄色が入力(C1)、青が出力(C2)です。右側の計測ウインドウをみるとAverageがでているので、C1はほぼ0Vオフセット、C1の後でオフセットを与えているのでC2はその分持ち上がっていることも分かります。
次は、ちょうど特性の「谷間」にすっぽりハマってしまう1kHzの場合。波形は消え去り、ただDCオフセットだけが虚しく?見えています。
アイキャッチ画像に、今回取得のボード線図(振幅)を掲げました。前回と同じになるのを確かめたいのが今回テーマなので、以下では前回のボード線図と並べてみました。微妙にスクショのサイズが異なりますのでご注意を。左が今回のボード線図、右で0dBに黄色い線が見えているのが前回のボード線図です。2分の1サンプリング周波数の5kHz付近がチョイと違いますが、後はほぼほぼ一緒。期待どおりだあ。
今回は、「同じ」を確かめる地味な回でしたが、次回はチラッとだけれど「魔物」が出てくるみたい。怖いもの見たさで期待が高まります。