前回、白色雑音(ホワイトノイズ)の生成に使うLFSR(Liner Feedback Shift Register)を「わざわざ」ゲートレベルの回路図でシミュレーション。LTspice使う荒業?です。今回は三上先生のプログラムを実機STM32マイコン上で動作させてみます。Cで書けばLFSRなど何ということもない?
※「手習ひデジタル信号処理」投稿順 Indexはこちら
※参照させていただいております三上直樹先生著の教科書は以下です。
工学社『「Armマイコン」プログラムで学ぶデジタル信号処理』
今回使用させていただいている三上先生の御ソースは、Arm社のMbedのWeb環境(要登録、無料)内で公開されており、「呂」で検索すれば発見できます。該当ソースを実機ST Microelectronics社製 Nucleo-F446REボード(Arm Cortex-M4Fコア)向けにMbed環境内でビルドして実行しています。
※前回はゲートレベルの回路図を描いて論理シミュレーションするのに牛刀割鶏、アナデバ様のアナログ回路シミュレータLTspiceをつかわせていただきました。今更ながらのゲートレベル回路図のフリーな論理シミュレータの件はこちら。
ビルド結果
前回は、M系列信号を生成するLFSRを回路図で描くのに拘って、メンドイことをしましたが、三上先生のC++のソースは簡潔で短いです。何のこともありませんな。ただ生成後のフィルタ処理など細かい処理が多くて、ソースファイルのファイル数はそこそこあります。ビルドしてみたところが以下に。
いつものことながらSTM32F446REのFlashもRAMも余裕です。
実機実行結果
Nucleo-F446REボードに書き込んで動作させてみたところが以下に。DA出力端子にはLPFが接続されているのでそこを通過した後の時間波形です。最大、最小、平均値などは表示画面のもの。
サンプリング周波数10kHz向けのホワイトノイズだ、ということを確認するためのFFTの結果が以下に。100回測定してRMS平均値計算設定です。縦軸はdBVです。
-
- M系列の乱数の先にIIRフィルタで作ったLPFがあり
- DA端子の先にもRCフィルタのLPFがあり
です。三上先生の教科書から1箇所引用させていただくと
ここでは信号の「位相」は乱れても問題はないので、「IIRフィルタ」を使います。
だそうです。M系列信号発生器は70kHzで7分の1にダウン・サンプリングしているのですが、FIRであるべきフィルタをIIRで済ませる件についての注釈です。いよいよ次回あたりからダウン/アップサンプリングするみたいなので、その前振りですかね。
低い周波数ではフラット(白色)な感じできて、ナイキスト周波数である5kHz付近で「予定通り」落ち込んでいるのが確認できます。
ソフトウエアで処理しているIIRフィルタ部分の三上先生の御設計を、三上先生ツールで再現してみたものが以下に。
FFTの波形は、上記のデジタルフィルタを通過した後でDAを通り、そして外部ハードRC回路のLPF通ってます。