手習いデジタル信号処理(8) STM32F446、巡回型移動平均3/3

Joseph Halfmoon

前回から引き続きの「巡回型移動平均」今回の3回目で完了であります。目出度い、ようやく次回はFIRフィルタに進めます。しかし、3回目、見た目は前回とほとんど同じ画像ばかり。2回目と3回目、唯一の変化は、積分を浮動小数点で計算するか整数で計算するかの違いのみ。信号処理的には「大きな一歩」に思えますが、見た目は同じ。

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

ネタバレにならぬようソースの引用等は行いませんが、例によって、勝手に手習ひさせていただいとります「教科書」へのリンクをまず掲げます。

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

なお、ご本に掲載されているものを含む三上先生の御ソース(かなり大量)はArm社のMbed環境上で公開されているので誰でもMbedに登録(無料)すれば読めるはずです。勿論、ボードがあれば即使ってみれます。

今回のブロックダイアグラム

前回とほとんど同じですが、前回がちょっと変則であったのに比べ、今回は原理通りのシンプルさであります。

MovingAVG3_BlockDiagram前段が積分器、後段が櫛型フィルタですが、最終の「1/N」以外の部分が整数演算になっているところが前回との違いです。

今回整数型で作成したのは上位層のみです。実装としては、下回りの関数群は以前の浮動小数点型のままです。元々12ビット整数のAD入力値を下回り関数で一端 float 型に直しているので、それを今回の割り込みハンドラ内で整数型に戻して計算し、最後出力関数を呼び出すところで再び float にしている(当然DAのところで整数型に戻る)という変則型です。整数演算部は、入力が16ビット符号付き、積分以降が32ビット符号付きとなっています。

プログラムをビルド

例によってMbedのWeb環境でのビルド結果を以下に掲げます。前回とほとんど同じです。整数型にしたといっても「ほんのちょっと」だけだし、基本 単精度浮動小数と32ビット符号付きは同じ4バイトなので、メモリ的にはなんも変わらないみたいです。

実行結果

まずは時間波形から。前回同様 250Hz, 1V振幅のオフセット0Vの波形を入力(黄色のC1)として与えて、移動平均後の出力(出力LPF通過後、青色のC2)を観察しました。

TIM250Hz前回のC2波形のPeak2Peak値を計算すると1.28V弱であったので、ほぼほぼ同じように見えます。

ボーデ線図は以下に。

MovingAVG3_Bodeこれまた前回同様、と書くのも同様。代り映えがいたしませぬが、しょうがない。

前回とは違い、今回は「魔物」の登場する余地もなく、部分整数型演算で、そのまま完了。次回のFIRフィルタに期待かと。

手習ひデジタル信号処理(7) STM32F446、巡回型移動平均2/3 へ戻る

手習ひデジタル信号処理(9) STM32F446、FIRフィルタその1、直接形 へ進む