前回、IIRフィルタ(簡単なやつ?)のブロックダイアグラムをシミュレーションして正弦波らしきものが生成されることを観察しました。今回は実機で三上先生のサンプルプログラムを動かしてみます。折角なので外付け回路の「想定外」の周波数まで生成周波数を上げてみました。IIR凄い?
※「手習ひデジタル信号処理」投稿順 Indexはこちら
※参照させていただいております三上直樹先生著の教科書は以下です。
工学社『「Armマイコン」プログラムで学ぶデジタル信号処理』
なお、今回の実験で使用した三上先生の御ソースはArm社のMbed環境(要登録、無料)で公開されており、「呂」で検索すれば発見できます。
※実機実験はST microelectronics社のNucelo F446RE(Arm Cortex-M4F)上で行っています。
サンプルプログラムのビルド
今回も三上先生の御ソースそのままでビルドいたしております。今回ソースの処理の中心部分は、掛け算2回に引き算1回です。浮動小数の演算が可能なM4Fにとっては超軽いデス。これで正弦波が紡ぎだされるのですからIIRフィルタ、不思議というしかありませぬ。ビルド結果が以下に。まあ、ほとんどF446のメモリ、余っているじゃあ~りませんか。
実験結果(1kHz)
まずはオリジナルのソースコード、設定は1kHzの正弦波の時間波形が以下に。ご覧のとおり、ほぼほぼ1kHzの正弦波が生成されとります。わたしゃこの波形を眺めていて恐れ多くも三上先生の御ソースにあった疑問が氷解しましたぜ(ホントか?)
三上先生の御ソースではDACで波形を描きだす直前に、生成された振幅に0.8fを掛けているのです。なんで0.8掛けているの?手元の御本には解説が書かれてないです。でもね、以下の波形をみると、0.8掛けないと振幅がアナログ的に振り切れちゃうんじゃないかと想像できます。この0.8はDACの結果が歪んでしまわないように配慮されているためでしょうかね。知らんけど。
折角なのでFFTもかけてスペクトルも観察してみました。1kHzにぴっと立っている先は、2k、3k、4kと期待通り?のところに高調波が観察できます。
勝手に生成周波数を上げてみる
実験に使っているNucelo F446REのDACの先には受動素子でLPFが取り付けられています。標本化周波数10kHzのときにちょうど良い塩梅の定数です。三上先生の教科書通りであればブレッドボードなので変更可能。しかし当方とっくの昔に半田付けした小ボードになっています。このフィルタのせいで振幅が小さくなる筈ですが、まあ、波形が観察できないこともないだろーといういい加減さで、生成周波数を勝手に上げてみました。
修正点は1箇所のみ。こんな感じ。
10kHzに変更した場合の時間波形が以下に。大分振幅が小さくなっていますが、正弦波に見えます。
スペクトルみてみたものが以下に。10kHz、20kHzにピークが見えます。
ダメ元?で100kHzに上げてみました。生成波形は下のようです。しぶとく正弦波?
流石にLPFのせいで振幅がとても小さくなっていますが、依然として正弦波でOKそうですな。スペクトルを見れば100kHzだと。
ともかく演算量軽いIIRフィルタによる正弦波生成。やる気で回路やソフトを調整したらもっと高い周波数まで対応できそうであります。