手習ひデジタル信号処理(52) SDR、直交信号発生器、linux上のg++で動作確認

Joseph Halfmoon

前回はCICフィルタの特性だったですが、今回はNCO(Numerically-Controlled Oscillator)、数値制御発振器です。搬送波周波数のSIN波とCOS波を同時生成できればよい、と。今回も朧げな記憶の奥底に最近やったような感じがします。同じことをやっても面白くないのでLinux上のgccで実習。

※教科書として読ませていただいておりますのは、三上先生の以下の御本です。

CQ出版社『Armマイコンでつくるダイレクト・サンプリングSDR

元記事はCQ出版社トラ技誌の2021年連載です。上記はそれをまとめたPDF版のダウンロードサイトへのリンクです。

上記教科書の第3回に入りました。アンダーサンプリング後の信号にSIN、COS波を乗ずるための直交信号発生器のところです。ここで登場するのがIIRフィルタを使って正弦波(余弦波も)を求めるNCOです。非常に簡単なIIRフィルタで計算できてしまう!

でもね、おぼろげながらやったような記憶があるのです。調べてみたら5月ごろ、わずか4か月ほど前にやってました。いつものことながら忘却力恐るべし。

IIRフィルタのブロックダイアグラムをScilab/XCOSを使ってシミュレーションし、SIN波が生成できることを確かめているのが、以下です。

手習ひデジタル信号処理(34) IIRフィルタによる正弦波発生器その1

つづいて上記をチョイ変して、直交するSIN/COS波を取り出せるようにしたブロックダイアグラムのシミュレーションが以下の回。

手習ひデジタル信号処理(36) IIRフィルタ、直交する正弦波発生器その1

そして実際にIIRフィルタを実装した三上先生のC++のプログラムをNucleo-F446REボード上で実行して波形を観察したのが以下の回です。

手習ひデジタル信号処理(37) IIRフィルタ、直交する正弦波発生器その2

まあ、上記3つを復習すれば、今回やりたいことはダイタイOKという感じ。でも読み返しただけでは忘却力に抗うことはかないませぬ。ということで、今回は、三上先生のSDRのプログラムから直交信号発生器部分のみを取り出して動かして、正弦波、余弦波が紡ぎだされるのを味わいたいと思います。Nucleo-F446RE上で実行するのも芸が無さすぎるので、今回は Linux上のg++でビルドして確かめたいと思います。

Linux上への移植

三上先生の御ソース(Arm Mbedオンラインコンパイラ環境上)では直交信号発生器部分は、

QuadOscIir.hpp

なるヘッダファイルにクラスとしてまとまっています。Linux上で実行するためには以下のところは要修正です。Arm Cortex-M4Fは、Float型のみハード対応なので、STM32F446RE前提の三上先生の御ソースはMbed OS上のFloat型で書かれているためです。

    1. mbed.h をインクルードしているのを math.h に換える
    2. 係数を求めるSet関数の中でcosf, sinf関数を使っているのを、cos, sin関数に換える。計算結果を(float)にキャスト。

上記変更したヘッダファイルを読み込んで、搬送波周波数に対応した直交信号を発生器してみるだけのmain関数のソースが以下です。

testMain

ビルド後実行

ビルドは普通に以下のようなコマンドラインで出来るとおもいます。

g++ -g -O0 -o OSC0 main.cpp

搬送波周波数594kHz(NHK第1<東京>)向けにビルド(F_C_[0]指定)し、実行した結果の標準出力を表計算ソフトに食わせてグラフ化したものが以下に。なお振幅が馬鹿デカイのは、振幅用の定数8192をかけているためです。594kHzWave

むむ、なんじゃこりゃ?単純な正弦波、余弦波でないじゃん?しばらく考え込んでようやく理解しました。

    • 今回のサンプリング周波数900kHz(ナイキスト周波数450kHz)
    • ターゲット周波数594kHz

前々回にアンダーサンプリングの件勉強しました。アンダーサンプリングによってナイキスト周波数より高い周波数の信号を「取り出して」処理するのでした。それ向けの高い周波数を「低いサンプリング周波数」でプロットしたらまさにエイリアスが出てしまう筈。

これを確認するためにナイキスト周波数よりも低い周波数を指定して正弦波、余弦波を生成させてみます。上記ソースではF_C_[7]に勝手追加の100kHzが入ってます。この場合の波形が以下に。

100kHzWave

生成する信号がナイキスト周波数より十分小さければ、ちゃんと正弦波、余弦波に見える感じがいたします。

素人は何事も実際に計算してみないと身に染みませぬな。大丈夫か、自分。

手習ひデジタル信号処理(51) SDR、「CICフィルタ再び」Scilabでgainplot へ戻る

手習ひデジタル信号処理(53) SDR、CICフィルタを使うダウンサンプリング へ進む