前回、前々回とSin関数を使って正弦波を発生する方法を学びました。今回からはIIRフィルタを使った正弦波の発生です。三上先生の教科書はさらっと通り過ぎているので、今回は久しぶりにScilabのXCOSツールを使ってブロックダイアグラムからシミュレーションして動作確認してみたいと思います。
※「手習ひデジタル信号処理」投稿順 Indexはこちら
※参照させていただいております三上直樹先生著の教科書は以下です。
工学社『「Armマイコン」プログラムで学ぶデジタル信号処理』
なお、今回は実機(Arm Cortex-M4F)上で動かしておりませんが、三上先生の御ソースはArm社のMbed環境(要登録、無料)で公開されており、「呂」で検索すれば発見できます。
ブロックダイアグラムからその動作をシミュレーション
IIRフィルタで正弦波を作るということで教科書にはブロックダイアグラムが掲載されています。ただフィルタ?というとちょっと解せぬ感じもいたします。しかし、ハードウエアに例えていえば、オペアンプを使った発振回路にもフィードバックあり、また、LSIの中で使われることがあるリングオシレータももろフィードバックループありです。ループのあるIIRフィルタでも係数を選べば所望の周波数で発振できるのだと思います。
ブロックダイアグラムをそのままシミュレーションするために久しぶりにScilabに登場願いました。内蔵ツールXCOSを使うためであります。偉大な商用ツールMatlabにおけるSimulinkみたいなものです(機能的、ドキュメンテーション的にいろいろ制限ありますが、無料です。文句は言いますまい。)
冒頭に掲げたブロックダイアグラムを以下に再掲いたします。
このブロックダイアグラムの中心部がIIRフィルタです。フィルタの係数 a1, a2, b1 が所望の周波数を得るために必要な「ミソ」です。直接即値で書くとなんだか分からなくなるので、XCOSのコンテキスト設定ウインドウを開き、その値を定義してみます。こんな感じ。
Tはサンプリング周期(1000分の1秒)、F0は1計算ステップあたりの周波数ですが、Tに対しての1なので1kHzということで良いですかね。それを使って値を設定してますな。知らんけど。
入力は三上先生教科書では単位インパルス関数です。1発入れたら後は黙ると。XCOSでそのような関数をちょっと探したのですが見当たりません。そこで通常のPulse生成器で「とても細い」信号をシミュレーション時間より長い周期で発生させてインパルスに替えさせていただきました。周期9999秒の0.01%の幅ということなので0.9999s幅のパルスであります。
一方、観察するオシロスコープ画面は1000単位時間の表示としました。三角関数なので-1から1の範囲が観察できれば良い筈。
シミュレーション結果
ほぼ1周期分のシミュレーション結果が以下に。こうしてみると正弦波している気が非常にいたします。
しかしね、上記は不味いところを隠しておるのであります。何周期も計算させていくと、正弦波に見えた波形が崩れて妙な波形が見えることがあるのです。なにかカオス的な挙動?別シリーズで扱っている?混沌がここまで染み出してきているのか?分かりませぬ。調べて行けばそれなりに何かあるかとも思うのですが、今回はGWだし(それと何か関係があるのか?自分)ここまでといたしとうございます。