前回、適応フィルタの応用とてALE(Adaptive Line Enhancer)、適応線スペクトル強調器なるものを動かしてみました。まあサンプルプログラムを動かしてみるだけなら簡単っと。今回はさらに「学習同定法」というものが登場し、信号の大きさに応じてパラメータを変化させるのだ、と。ううむ、どんどんムツカシクなっている気がするのだけれど。。。やるしかない。
※「手習ひデジタル信号処理」投稿順 Indexはこちら
※参照させていただいております三上直樹先生著の教科書は以下です。
工学社『「Armマイコン」プログラムで学ぶデジタル信号処理』
三上先生の御ソースは、Arm社MbedのWeb環境(要登録、無料)内で公開されており、「呂」で検索すれば発見できます。今回は第9章「適応フィルタ」のところの9.4.3 「学習同定法」と「Leaky LMSアルゴリズム」を組み合わせたプログラムを参照させていただいております。
※実験は、ST Microelectronics社製 Nucleo-F446REボード(Arm Cortex-M4Fコア搭載STM32F446RE)向けにMbed環境内でビルドしています。測定はDigilent社 Analog Discovery2で行っています。
ビルド
信号処理素人は「アダプティブ」と言われただけでビビっているのに、さらに「学習」です。びびりまくり。しかしソースがあればビルドはできる、と。ビルド結果が以下に。
これみて、私は気づいてしまいました。前回よりオブジェクトコードが小さいじゃん。なぜ?と考えると、以下の違いに思いいたりました。
-
- 前回は、USBシリアルで「行」入力を行うために三上先生の通信ライブラリを使っていた。
- 今回は、パラメータの入力が無いので、通信ライブラリ使わず、USBシリアルとの間は素の一文字を送りっこするだけ
これのせいなのかな~、確かめてないケド。しかし今回実験するにあたって注意点が一つ。USBシリアルでターミナルエミュレータを接続後です。
前回と違って「改行」は入力しない。文字 ‘y’ を入力すればALEオンになり、その他の文字でALEオフになる。
私は y の後にRETURNキーを叩き、あれれ全然オンになった気がしない、などと慌てておりました。お馬鹿さん。
さて時間波形です。前回忘れていましたがAnalog Discovery2、波形を重ねて通過する波形を「確率的」に表現できたのです。今回は使ってみました。以下、入力波形が下、出力波形が上です。まずは、ALEをオフったときの様子。
続いてALEオンの時の波形。振幅が若干小さくなると同時に、上の波形で目立っていた、波形の揺らぎ部分が小さくなっているのが分かります。
さらに決定的なのは周波数スペクトルです。前回と変えて10Hzから10kHzまで見ています。まずはALEオフのとき。
ALEをオンにしたものが以下に。一目瞭然のその効果であります。なお、9kHzあたりの小さなピークは「折り返し」のせいですかい。知らんけど。
ステップ・サイズ・パラメータが自動で変更される様子を覗き見
今回のポイントは「学習同定法」です。前回、固定値を外部から与えて(変更はできるが天下り式)であったステップ・サイズ・パラメータが自動で上げ下げされるんだとか。信号の大きさをみて動的に変わるらしいです。
(2022年7月18日追記、以下にはバグも入力信号の問題もあり、第45回にそのフィックスを掲載しましたので、そちらをご覧ください。)
三上先生のオリジナルのソースではそこの部分をアカラサマに観察できるようになっていなかったので、不埒にも1か所勝手に追加し、ステップ・サイズ・パラメータをUSBシリアルに表示できるようにしてしまいました。修正部分はこんな感じ。
ALEのオン、オフの入力機能に寄生して、もしmという文字が押されたら、ステップ・サイズ・パラメータ値を表示するもの。なお当然ですが、以下の変更も必要です。
-
- 浮動小数点数の表示にprintf使ってしまったので stdio.h の取り込み
- 本来 privateメンバの ss_(ステップ・サイズ・パラメータ)を main関数から読むために ss_ を public に移した
上記の変更で覗き見はできますが、Mbed環境でコンパイルすると警告が出ます。こんな感じ。
これは、ss_を本来ある位置の privateメンバの中から、publicへ移したために初期化の順番が違ってしまったためだと思われます。動作するのに支障はないだろうから、まあいいか。いい加減だな。実験だし。
信号の振幅をいろいろ変えれば良かったのですが、以下では周波数を変更してます。2kHzの信号(勿論ノイズ入り)をいれると大体60台の値が報告(たまに70台になったりします)されますが、20Hzに切り替えると70台後半の値に切り替わりました。
確かに、自律的に上下しているみたいです。あたりまえか。