今回からいよいよデジタル信号処理らしい「手習ひ」に入れます。その最初はFIRフィルタです。まずは素直な「直接形」の実装でその威力をシミジミ味わえ、という感じでありましょう。アイキャッチ画像に振幅特性を示しましたが、いい感じじゃないでしょうか。こちらは書いてあるとおりにやっただけなのですが、ちょっと感動。
※「手習ひデジタル信号処理」投稿順 Indexはこちら
ネタバレにならぬようソース等の引用等は行いません。まずは、勝手に手習ひさせていただいとります「教科書」へのリンクを掲げます。
三上直樹先生著、工学社『「Armマイコン」プログラムで学ぶデジタル信号処理』
掲載されているものを含む三上先生の御ソース(かなり大量)はArm社のMbed環境上で公開されています。動かしてみるだけなら誰でもできると思います。
ただし、PC上で動作するFIRフィルタの係数設計ツールは三上先生の御本を買った人しか知ることのできないパスワードがないとダウンロードできない仕組みです。パスワードがあればバイナリだけでなくC#で書かれたソースも一緒にダウンロードできます。
FIRフィルタの係数設計ツールはネット上を探せば無料のものを含め幾つも見つかるんじゃないかと思います。が、もしライセンスがある(ライセンスを買うお金があるか、工科系の学生さんで学生さん専用の無料ライセンスが使える)のであれば MATLABの信号処理用のツールボックスに入っている設計ツールを使うのがいいんじゃないかと思います。MATLABのHELPを読んでいるだけで、自分が立派な人になった気になります(錯覚でしょうが。)
今回のブロックダイアグラムと目標とするフィルタの特性
今回は直接形のFIRフィルタを、ほぼほぼブロックダイアグラム通りに実装する回です。
ブロックダイアグラムは簡単だけれど、そのマジックは係数にありと。
ザックリ言うとフィルタは100次で、0.9kHzまで利得1、1.1kHzを超えたら利得0という感じです。詳しい設定はご本を見てね。
プログラムをビルド
例によってArm MBEDのWeb環境で、三上先生のサンプルプログラムをビルドして行きます。前回までは、元は三上先生の御ソースでも、しみじみコードを味わうために、なるべく自力で打ち込んでいたのです。しかし、今回は、係数テーブルが存在します。100次なので101個存在する係数テーブルを手で打ち込んでも何も良いことが無いので、そこはサンプルプログラムをそのまま利用させていただきました。本当は、係数生成ツールでいろいろ特性を変更して、味わうべきなのでしょうが。例によって気力が無いので、パス。ビルド結果は、いつもの通りで、STM32F446REにしたらメモリのごくごく一部しか使いませぬ。
実行結果
まずは時間領域での波形を見てみました。黄色が入力C1、青が出力C2です。実験にはDigilent AnalogDiscovery2を使用し、三上先生ツールは使用してません。すみません。
最初は250Hz、前回の移動平均でもやった周波数です。ここはゲイン1に設定しているので、ほぼ同じ振幅が出ていてほしい。出てますな。よかった。
念のため、阻止されて平な波形になっている筈の1.3kHzも見てみました。期待通りにピタっと阻止されている感じ。阻止されすぎて出力信号の周波数の測定は出来ていないようです。
さて、肝心の振幅特性はどうか。AnalogDiscovery2のタブをボーデ線図の測定用に切り替えて、10Hzから5kHzの範囲で実測してみたものがこちら。
ご本にある係数設計用ツールが計算した特性と、ほぼほぼ一緒でないかと思います。フィルタしてますね。(上記はC1を基準にしてC2の振幅をみているので、0dBで始まっており、計算ツールの表示する特性と同じスタイルです。三上先生本の実測の振幅特性は同じ形だけれども0dBの基準が違うみたい。。。ま、いいか、意味は一緒みたいだし。)