今回から周波数シフタです。周波数をシフトするのに加法定理を使う。それにはcosとsinの両方が要る。cosをπ/2だけ位相シフトすればsinになる、ということで、位相をシフトするために使うのがヒルベルト変換器であります。分かったような分からぬような。今回は先に実機上で動作確認してから個々の部品を調べていきたいと思います。
※「手習ひデジタル信号処理」投稿順 Indexはこちら
以下は、勝手に手習ひさせていただいております教科書へのリンクです。
三上直樹先生著、工学社『「Armマイコン」プログラムで学ぶデジタル信号処理』
上記教科書の6.3「ヒルベルト変換器」による「位相シフタ」を使う「周波数シフタ」が今回のお題であります。
ソフトウエアのビルド
今回は三上先生のソフトウエアそのままをArm MbedのWebコンパイラ環境でST Microelectronics製Nucleo-F446REボード用にビルドし、動作させてみます。毎度申し上げておりますとおり、三上先生のサンプルプログラムは、Arm社のMbed Webコンパイラ環境で公開されているので、登録すれば誰でも参照することができます。
別件シリーズでも同じArm Mbed Webコンパイラを使うことがあるのですがそちらではMbed OS6です。三上先生はOS2をお使いなので、こちらでは Mbed OS2です。ライブラリのリビジョン履歴からそれを確認しているところを貼り付けておきます。
何時ものビルド結果は以下のようです。今回は結構複雑なコードだと思うのですけれども大した量メモリを使ってません。毎度ながら、STM32F446REは、Flashにせよ、RAMにせよ、余裕シャキシャキ。
実機動作確認
三上先生の教科書でやられているとおり、入力C1(黄色)に300Hzの正弦波(振幅1V、オフセット0V)を与えたときの出力C2(青色)を観察してみました。今回は100Hz「シフト・アップ」する設定です。観察したところ、以下のように予定通りな感じです。良かった。
単純な正弦波では複数の周波数が「混ざっている」ときの動作が分からないので、教科書では方形波を入れてそのスペクトルを観察しています。こちらでも方形波を入れてみました。教科書には載っていませんが、まず時間波形を観察したところがこちらです。奇怪な波形ぞなもし。
サンプリング周波数が10kHzなので、5kHzまでのスペクトルをグラフにしたものを冒頭のアイキャッチ画像に貼り付けました。
色は入力黄色、出力青色で変わりませぬ。
5kHzまでだと若干みずらいので2kHzまでの範囲を拡大したものを以下に貼り付けました。横軸周波数が読み取り易くなったのでは。
まず、黄色の入力波形を観察すると、以下の位置にピークが見えます。
-
- 300Hz
- 900Hz
- 1500Hz
方形波は点対称繰り返しなので、偶数次の高調波はなく、300Hz=基本波、900Hz=3次高調波、1500Hz=5次高調波であります。振幅は次数Nに対して1/Nとなる筈なので、3次は1/3で約-10dB、5次は1/5で約-14dBとなる筈です。だいたいのところ上のグラフはそんな感じに見受けられます。
さて青色の出力波形を観察すると、以下のところにほぼ黄色のピークと並ぶ振幅のピークがあります。
-
- 400Hz
- 1000Hz
- 1600Hz
今回は+100Hzのシフトであるので、まさにこれらのピークが周波数シフトした結果だと分かります。しかし、以下のところにも減衰はしているもののピークが見えます。
-
- 200Hz
- 800Hz
- 1400Hz
上記について、三上先生の教科書のご説明を1箇所引用させていただきます。
「ヒルベルト変換フィルタ」の特性が不十分なために現れる、元の周波数成分より100Hz低い周波数成分
うほほーい、ご説明ありがとございました。しかし、説明がついた奴らはいいけれど、まだよくわからんピークもあるぞ。どうする?まあ、来週以降要素部品毎に見ていきます(分かるかどうかも分からんな、自分。)