LO位相同期機能を備えたGRC用独自ブロックのビルド方法(USRP N200用)

2023/10/19 3:09 PM

USRP N200シリーズ用のLO位相同期機能を備えたGRC(GNU Radio Companion)用独自ブロックをビルドして,GRC上で利用可能とする手順を以下に示す.GNU Radio 3.8.4 + UHD 3.15の環境下で,開発および動作確認を行った.独自ブロックの名称は,下記である.

  1. USRP_Loopback
  2. USRPN2XX_2ch_Source
  3. USRP_1Tx_1Rx

この独自ブロックのソースコードは,gr-USRP_SYNC.zipとしてこのWebページで公開している.上記のブロックは,GRC上でUSRP_SYNCという種類に属するブロックとして作成する.上記の1.から3.の名称の独自ブロックの機能を以下に示す.

  1. USRP N200シリーズ1台で,周波数・位相同期した状態で同時送受信を行う(1台で送受信の場合は,マザーボードが同一で基準信号が送受信機間で共通なので,キャリア周波数ずれはそもそも発生しない.ドータボードのLO:local oscillator の初期位相が異なると,試行ごとに復調信号波形の初期位相が変動する.観測・測定の用途では,試行ごとに初期位相が変動しないほうが便利.ここで言う位相同期とは,復調信号の初期位相が試行ごとに変動しないこと).
  2. USRP N200シリーズ2台で,周波数・位相同期した状態で同時受信を行う.
  3. USRP N200シリーズ2台で,1台で送信して,もう1台で受信する動作を周波数・位相同期した状態で実行する.

すべてのUSRPには,共通の10MHz基準信号とPPS(pulse per second)信号が供給されていることが前提である.SBX-40ドータボードとUSRP N200シリーズとの組み合わせで動作確認ずみである.UBXドータボードでも使用可能と考えられるが,動作確認は未定である.なお,Ettus社のドキュメントには,CBXドータボードはLO位相同期(phase synchronization)機能を有さないとの記載がある.CBXについては,本GRC独自ブロックで位相同期はできないと思われる(CBXドータボードを購入・使用したことがないので,推測).

■準備する配布パッケージ:gr-USRP_SYNC.zip

ホームディレクトリに foo などといった名称のディレクトリを適宜作成し,配布パッケージ gr-USRP_SYNC.zip を foo に置いて unzip gr-USRP_SYNC.zip として展開する.展開したファイル群の中で,のちほど以下の6個のファイルだけをビルドに使用する.

~/foo/gr-USRP_SYNC/python の中の下記のファイル
USRP_Loopback.py
USRPN2XX_2ch_Source.py
USRP_1Tx_1Rx.py

~/foo/gr-USRP_SYNC/grc の中の下記のファイル
USRP_SYNC_USRP_Loopback.block.yml
USRP_SYNC_USRPN2XX_2ch_Source.block.yml
USRP_SYNC_USRP_1Tx_1Rx.block.yml

ビルド方法を以下に示していく.まず,ホームディレクトリなどで下記のコマンドを入力し,新規に独自モジュールのスケルトン(中味がない枠組みに相当)を生成していく.

$ gr_modtool newmod USRP_SYNC  (gr-USRP_SYNCディレクトリが作成される)
$ cd gr-USRP_SYNC

引き続き,下記のコマンドを入力する.

$ gr_modtool add -t hier -l python

すると,以下のように入力を促されるので,赤色部分を入力していく.下記の実行例では,USRP_Loopback という名称のGRCブロックの生成を指定している.

GNU Radio module name identified: USRP_SYNC
Language: Python
Enter name of block/code (without module name prefix): USRP_Loopback
Block/code identifier: USRP_Loopback
Please specify the copyright holder: T.Nakahama
Enter valid argument list, including default arguments:

「Enter valid argument list, including default arguments:」のところでは,GRCが生成するPythonコードで利用する引数(GRCブロックで指定したいパラメタ)を入力する.少し長いが,途中で改行しないで下記のように入力する(下記の文字列をエディタなどに貼り付けしておいて,コピー&ペーストで入力することをお薦めする).

tx_rf_freq, tx_dsp_freq, rx_rf_freq, rx_dsp_freq, lo_mode, samp_rate, clock_rate, clock_source, time_source, dev_addr, dev_args, tx_gain, rx_gain, tx_ant, rx_ant, pps, tx_subdev_spec, rx_subdev_spec

Enterキーを押して,続けて下記のように入力を継続する.

Add Python QA code? [Y/n] n
Adding file 'python/USRP_Loopback.py’…
Adding file 'grc/USRP_SYNC_USRP_Loopback.block.yml’…
Editing grc/CMakeLists.txt…

さきほど,配布パッケージ gr-USRP_SYNC.zip をホームディレクトリ配下のディレクトリ foo で展開してできた gr-USRP_SYNC フォルダには,下記の2つのファイルがあるはずだ.これらは,PythonコードとYAML(YAML Ain’t Markup Language)ファイルである.

~/foo/gr-USRP_SYNC/python/USRP_Loopback.py
~/foo/gr-USRP_SYNC/grc/USRP_SYNC_USRP_Loopback.block.yml

上記の2つのファイルと同じ名前のファイルが下記のディレクトリにあるはずなので,念のため有無を確認する.下記の2つのファイルは,ここまでの手順で生成されたスケルトンファイル(本来の内容がまだ記述されていないが,GRC用独自ブロックの枠組みが記述されたファイル)である.ビルド時のエラー発生などに備えて,下記の2つのファイルを別のディレクトリにコピーするかリネームするなどして保管しておくことをお薦めする.

~/gr-USRP_SYNC/python/USRP_Loopback.py
~/gr-USRP_SYNC/grc/USRP_SYNC_USRP_Loopback.block.yml

次のコマンドにより,配布パッケージ内の2つのファイルを上記のスケルトンファイルに上書きコピーする.

$ cd ~/gr-USRP_SYNC
$ cp ~/foo/gr-USRP_SYNC/python/USRP_Loopback.py ./python/
$ cp ~/foo/gr-USRP_SYNC/grc/USRP_SYNC_USRP_Loopback.block.yml ./grc/

ここまでの操作で,gr-USRP_SYNC ディレクトリがカレントディレクトリになっている.引き続き以下のコマンド

$ gr_modtool add -t hier -l python

を入力し,ここまでに述べた手順を USRPN2XX_2ch_Source と USRP_1Tx_1Rx ブロック作成のためにそれぞれ繰り返す.これにより,下記の名称のGRC独自ブロックのスケルトンファイルを生成していく.

USRPN2XX_2ch_Source
USRP_1Tx_1Rx

gr_modtool 実行時に「Enter valid argument list, including default arguments:」と聞かれる際に入力する文字列(ブロックの引数の種類を指定)は,下記である.

■USRPN2XX_2ch_Source.py のスケルトンファイル生成時
rf_freq, dsp_freq, lo_mode, samp_rate, clock_rate, ch1_clock_source, ch2_clock_source, ch1_time_source, ch2_time_source, dev_addrs, dev_args, ch1_gain, ch2_gain, ch1_ant, ch2_ant, pps
■USRP_1Tx_1Rx.py のスケルトンファイル生成時
tx_rf_freq, tx_dsp_freq, rx_rf_freq, rx_dsp_freq, lo_mode, samp_rate, clock_rate, time_source, clock_source, tx_dev_addr, rx_dev_addr, dev_args, tx_gain, rx_gain, tx_ant, rx_ant, pps, tx_subdev_spec, rx_subdev_spec

また,下記のファイルもそれぞれ ~/gr-USRP_SYNC/python ディレクトリ(Pythonコード)と,~/gr-USRP_SYNC/grc ディレクトリ(YAMLファイル)に同様にコピーする.

~/foo/gr-USRP_SYNC/python の中の下記のファイル
USRPN2XX_2ch_Source.py
USRP_1Tx_1Rx.py

~/foo/gr-USRP_SYNC/grc の中の下記のファイル
USRP_SYNC_USRPN2XX_2ch_Source.block.yml
USRP_SYNC_USRP_1Tx_1Rx.block.yml

これで準備完了である.以下のコマンドにより,ビルド・インストールを行う.

$ cd ~/gr-USRP_SYNC
$ mkdir build
$ cd build
$ cmake ../
$ make
$ make install
$ sudo ldconfig

以上で,すべての手順が完了した.gnuradio-companion を起動すれば,下記の図の右側に表示されているGRCブロック選択ペインで,以下の名称の3つのGRCブロックが新たに選択可能になっていることがわかる.

USRPN2XX_2ch_Source
USRP_1Tx_1Rx
USRP_Loopback