シリーズ3回目ともなり、ようやく今回はちょっとデジタル信号処理っぽいところに入れます。とはいえ、まずは「動かして効果を実感してみよ」という感じです。実際の信号処理は裏のライブラリで処理されているものを使っているだけでお勉強はまだ後です。しかしま、衣の下(鎧ですぞ)がようやくチラチラしてきました。
※「手習ひデジタル信号処理」投稿順 Indexはこちら
まずは「手習ひ」に使わせていただいておりますご本とサイトへのリンクをまとめておきます。
三上直樹先生著、工学社『「Armマイコン」プログラムで学ぶデジタル信号処理』
ネタバレにならぬようソースの引用等は行いませんが、何となればArm社のMbed環境上で、三上先生様のソースは誰でも参照できる状態になっています。作者「呂不韋」で検索せよとのお言葉、恐れいります。
Arm社のWeb開発環境(Mbed OS)へのリンクは以下に。誰でも無料で armcc が使える太っ腹な環境であります。
そして実習に使わせていただいております、STM32マイコンの情報は以下に(日本語サイト。)
今回使用させていただいておりますのは、STM32F446RE搭載のST社の開発ボード、Nucleo-F446REであります。お求めやすい価格の一品。
さて今回は、三上先生本の第2章の末尾の実験をやってみました。といって手元にダウンロード済のソース一式をMbed環境にアップロードしてコンパイルして、オブジェクトをGETし、Nucleo-F446REに書き込んで「動かしてみた」というだけ。
本人、何も頭を使っておりません。
まずは生成されたオブジェクトを調べてみました。左はMbed環境でビルド後に表示された「プログラムの詳細」です。
これを見るとSTM32F446REのリソースを使っているのはごくわずかです。この先いろいろ処理を追加する余地は沢山残っているようです。
今回の実験から、三上先生お手製のデータ配列用のテンプレートライブラリ が登場しました。付録PDFに説明があるようなのでこれから読みますです。今回はアップサンプリングの裏側でちょこっと使われているだけみたいですが、処理が「本格化」すると多用されるのかも。
それにつけても組み込みで折角C++を使うのであれば、テンプレートライブラリというのはよさげです。普段Cばかりだと目から鱗かもしれないです。
STM32F4の使っているところと使っていないところ
ソースをわざわざ読まなくても、ご本に書いてあることですが、三上先生のご本は「浮動小数点」で書かれています。デジタル信号処理といえば「固定小数点」ですが、固定小数点で書くのはご存じのとおりメンドイです。ここは何ビットで小数点以下何ビットなんていうのが並んで分けが分からなくなります。MATLABなど使うといろいろ支援してくれますが、そういうツールなどないと辛い。その点、浮動小数点処理であると成り行き(?)で原理に近いコードで素直にやれるのでお楽(甘く見ちゃいけないですが。)しかし、ST社のマイコン担当の人の心中を察するに、「売り」の順番は
- STM32F4にはDSP処理用の命令群(MACとかサチュレーション演算)あり
- STM32F4にはSIMDもあり
- STM32F4には浮動小数点演算ユニットもあり
でないかと想像するのであります。浮動小数点は最後ね、みたいな。今回もアップサンプリングの裏側で浮動小数点演算ユニットがしっかり働いてくれているみたいです。けれども、ゆくゆくは1とか2も使ってよね、速くなるから、という感じですかね。
なお、別件ですが、ラズパイPicoに搭載のRP2040マイコンには「インターポレーション」ユニットが搭載されていることを思い出しました。固定小数点処理でアップサンプリングするようなときには使えるのだろうな、多分。後で調べてみないと。
動作確認
前回、アップサンプリングなしに、3.5kHzの正弦波を入力したら「唸っている」ような時間波形が出てきました。いわゆるエイリアシングってやつだったんでしょうか。今回、DAにアップサンプリングが入ったので早速比べてみます。こんな感じ(黄色が入力、青が出力。)
確かに、出力波形、キレイな正弦波に近づいておりますな。アップサンプリングの効果はあらたか。しかし、2点気づくこともあります。
- 入出力とも500mV/Div設定なんだけれども、出力の振幅ちょっと小さくなっているよね。
- 前回の単純スルーのときは入力と出力の間の遅延というか位相差、時間波形ではよく見ないと分からないくらい小さかったのだけれど、今回はハッキリ遅れているよね。
このあたりは今後、お勉強することになるのだと思います。頑張らないと。なお、波形の遅れは、端的に言えばアップサンプリングのために、浮動小数点処理でインターポレーションをしている時間が見えている、と想像されます。とりあえずピーク位置でテキトーに「遅れ」測ってみたのが以下です。187μ秒、これが「4倍に膨らかしてる」処理にかかっている時間のようです。
ようやく本格化する次回が楽しみ(怠けてないで、ちゃんと勉強しろよ、自分。)