前回まではダウンサンプリング処理でした。今回アップサンプリングに入るのですが、新たな実習用のサンプルプログラムはありません。毎度お世話になっているDA変換による出力処理のところで4倍アップサンプリングしてきたからです。仕方がないので珍しくOctaveを取り出してきて4倍のアップサンプリング処理をやってお茶を濁した、と。
※「手習ひデジタル信号処理」投稿順 Indexはこちら
※参照させていただいております三上直樹先生著の教科書は以下です。
工学社『「Armマイコン」プログラムで学ぶデジタル信号処理』
三上先生の御ソースは、Arm社のMbedのWeb環境(要登録、無料)内で公開されており、「呂」で検索すれば発見できます。
「8.3 インターポレータを利用するアップ・サンプリングDA変換」
上記の教科書には上記「8.3 インターポレータを。。。」という節があり、説明とソースが掲載されているのですが、実例プログラムの新たな記載がありません。何のことはありません。とっくの昔にアップサンプリング処理の効果を目の当たりにしてきたためです。
第2回 ADからDA、割り込み方式、STM32のハードの裏とり?
にてアップサンプリング処理無で、ナイキスト周波数近くの周波数を扱うと結構ヤバイぜという例をみており、
にて4倍のアップサンプリングを行うことで綺麗な出力波形が得られることを観察してます。上記の8.3節はそのときなかった解説を後からおこなっているもの。プログラムそのものはとっくにお世話になっていた、と。
Octaveのresample関数でアップサンプリングしてみる
以前と同じことをやっても面白くないので、Octaveを使ってアップサンプリングの雰囲気を味わってみることにいたしました。
Octaveをインストールしてあれば以下のパッケージをロードすることでリサンプリングを行う関数が使えるようになります。エイリアスが出ないようにするためのローパスフィルタも関数内部で掛けてくれているみたいです。ただ、三上先生のプログラムとフィルタは異なるんじゃないかと思いますけれど不明です(調べてません。)
pkg load signal
以下のようにサンプリング周波数を1kHzとし、まずは、アップサンプリングしなくても綺麗な波形が見える筈の33Hzの信号をプロットしてみました。
clear Fs=1e3 t=0:1/Fs:0.04 F1=33 omega1=2*pi*F1 y1=sin(omega1*t) plot(y1, '-o') title("Fs=1e3, F=33Hz, Wave Form")
波形は以下のようです。SIN波してますねえ。あたりまえか。
それに対して周波数を233Hzに上げてみます。サンプリング1kHz、ナイキスト周波数500Hzなので、まだ大丈夫かと思えるのですが。
F2=233 omega2=2*pi*F2 y2=sin(omega2*t) plot(y2, '-o') title("Fs=1e3, F=233Hz, Wave Form")
波形はこちら。ちょっとガタガタになってエイリアス的な波形が見え始めているんじゃないですかい。先ほどの以前の回、第2回の波形がこんな感じ。
さて、オクターブのresample関数で4倍にアップサンプリング掛けるシーケンスがこちら。たった1行 resample関数を呼ぶだけっス。
y2_4=resample(y2, 4, 1) plot(y2_4, '-o') title("Fs=1e3 4x RESAMPLING, F=233Hz, Wave Form")
4倍リサンプリングの波形が以下に。かなりSIN波っぽくない?
たまに発作的にOctave使おうと思ってもよう使えません。。。