USRP で送受信 Full Duplex 処理を行うサンプル ~ niUSRP EX Full Duplex (Single Device, Multi Channel).vi(USRP のサンプルを紐解く (10))

こんにちは、ドルフィンシステムの笹生です。

昨年に引き続きあまり説明がされていない USRP のサンプルについて実際に動作させたりしながら紹介していきたいと思います。

サンプルプログラムの開き方は第一回のブログを参照してください。

niUSRP EX Full Duplex (Single Device, Multi Channel).vi

サンプルのフォルダを開くと以下のようにずらずらっと並んでおります


名前順にソートされて5番目のサンプルが「niUSRP EX Full Duplex (Single Device, Multi Channel).vi」です。

このサンプルは 1台の USRPデバイスで、多チャンネルに対応した送受信のフルデュプレックス処理を行うサンプルとなります。

意外と送受信同時に行うサンプルは提供されていないです、

それではフロントパネルを見てみましょう。





左側の設定項目については以下のような意味です。
左側上段の設定
名称デフォルト設定値について
Device Name192.168.10.2USRP のデバイス名を入力します。
Ethernet で接続している時はIP で設定します。
USRP-RIO のように PCIe (MXI) ケーブルで
接続しているときは NI MAX で認識しているデバイス名
を入力します。このサンプルではUSB接続の
USRP-2900や2901 にも対応しています。
Rx Gain / Tx Gain1ゲインを設定します。
設定範囲はUSRP のハードウェアに依存します。
Rx IQ Rate / Tx IQ Rate1Mいわゆるサンプリングレートです。設定可能な
範囲は USRP のハードウェアに依存します
Rx Active AntennaRx2アンテナと書いてありますが、受信するポートの名称を文字列で
指定します。USRP のハードウェアによって多少ことなりますが、
RX2 などを設定します。
Tx Active AntennaTX1アンテナと書いてありますが、送信するポートの名称を文字列で
指定します。USRP のハードウェアによって多少ことなりますが、
TX1 などを設定します。コメントに書いてある通り X410 を使う
ときは TX/RX0 という記述をするようです。

左側中段のタブ
注意書き:NI-2900 および NI-2901 では、両方の Rx チャンネルが LO を共有し、両方の Tx チャンネルが LO を共有することに注意してください。 ただし、NI-294x/295x デバイスでは、チャンネル 0 の Rx と Tx は LO を共有し、チャンネル 1 の Rx と Tx は LO を共有します。

●NI-294x/295x/X410 のタブ
名称デフォルト設定値について
channel 0 carrier frequency [Hz]2G
294x/295x/X410 シリーズの USRP の ch 0 の送信と受信の LO に設定する
キャリア周波数(センター周波数)です。
設定可能な範囲は USRP のハードウェアに依存します。
channel 1 carrier frequency [Hz]2G
294x/295x/X410 シリーズの USRP の ch 1 の送信と受信の LO に設定する
キャリア周波数(センター周波数)です。
設定可能な範囲は USRP のハードウェアに依存します。

●NI-2900/2901 のタブ
名称デフォルト設定値について
Rx carrier frequency [Hz]2G
2900/2901 シリーズの USRP の ch 0とch1 の受信の LO に設定する
キャリア周波数(センター周波数)です。
設定可能な範囲は USRP のハードウェアに依存します。
Tx carrier frequency [Hz]2G
2900/2901 シリーズの USRP の ch 0とch1 の送信の LO に設定する
キャリア周波数(センター周波数)です。
設定可能な範囲は USRP のハードウェアに依存します。

左側下段の設定

名称デフォルト設定値について
Channel 0 Tone Frequency10k
ch0 の送信信号のトーン周波数を指定します。デフォルトは 10kHzです。
Channel 0 Tone Amplitude0.707
ch0 の送信信号の振幅を指定しますが、1.0 がフルスケールになるようです。
WaveformSize10000ch0,ch1 共通の送信信号のサイズをサンプルで指定します。
Channel 1 Tone Frequency35k
ch1 の送信信号のトーン周波数を指定します。デフォルトは 35kHzです。
Channel 1 Tone Amplitude0.4
ch1 の送信信号の振幅を指定しますが、1.0 がフルスケールになるようです。
whole seconds1開始ボタンから実行するトリガまでの時間の秒を指定します
fractional seconds0
開始ボタンから実行するトリガまでの時間の秒未満の値を指定します

ブロックダイアグラムはこのような感じです。

横に長いので4つに分割してます。

まずは一番左から受信側の初期化をしています。ほとんどプロパティーノードで設定しています。



次に送信側の初期化をしています。こちらもほとんどプロパティーノードで設定しています。



次にコミットして、トリガのための時間を 0 にセットして、イニシエイトします。同時に送信のデータを指定されたトーン周波数の正弦波として作成します。



次に上側は受信ループで、下側は送信ループです。Stop ボタンで終了して、デバイスを閉じます。





ここで使用している USRP の関数は左から、
[niUSRP Open Rx Session.vi]、
[niUSRP Configure Trigger.vi]、
[プロパティーノードでの各種設定取得]、
[niUSRP Open Tx Session.vi]、
[niUSRP Configure Trigger.vi]、
[プロパティーノードでの各種設定取得]、
[niUSRP Commit.vi]、
[niUSRP Set Time.vi]、
[niUSRP Initiate.vi]、
[niUSRP Fetch Rx Data (poly).vi]、
[niUSRP Write Tx Data (poly).vi]、
[niUSRP Abort]、
[niUSRP Close Session]
です。

①受信と送信の初期化の部分

初期化の部分では 大きく4つの処理をしています。

左から

①USRPデバイスのオープン


"niUSRP Open Rx Session.vi" でデバイスの受信側 Rx を開きます。送信の初期化では "niUSRP Open Tx Session.vi" でデバイスの送信側 Tx を開きます。まずはこの関数を呼ばないことには始まりません。必須です。


名称デフォルト設定値について
Device Name192.168.10.2USRP のデバイス名を入力します。
Ethernet で接続している時はIP で設定します。
USRP-RIO のように PCIe (MXI) ケーブルで
接続しているときは NI MAX で認識しているデバイス名
を入力します。

Device Name への設定の仕方は USRP のデバイスの種類によって異なります。

Ethernet で接続するタイプの USRP では USRP に設定してある IP アドレスを設定します。PCIe ケーブル接続の USRP では、NI MAX で認識しているデバイス名を設定します。

開くことが出来たら、セッションハンドルを出力しますのでこの後の設定などはそのセッションハンドルを基に行います。


②チャネルの有効化



この部分は USRP のプロパティノードを使用しています。

使いたい チャネルの有効化をするプロパティです。

名称デフォルト設定値について
Enabled Channel0,1これも USRP のハードウェアによって 複数チャネルに
対応していることもあります。0, 1 などを設定します。

文字列で与えます。このサンプルでは固定値として "0,1" が与えられています。

③トリガの時間を設定

開始してから実際の実行開始までのトリガの設定をしています。(受信側の初期化の時で1回だけ。絶対にここで設定しなくてはいけないわけではないです。)

フロントパネルの Start Trigger Time の設定が設定されます。

whole seconds1開始ボタンから実行するトリガまでの時間の秒を指定します
fractional seconds0
開始ボタンから実行するトリガまでの時間の秒未満の値を指定します


④各種 RF 設定と設定値取得

この部分でも USRP のプロパティノードを使用しています。


まず [IQ Rate] を設定し、その後 [Model] を取得しています。
そして[Model] で取得した文字列によって、その後の設定をケースストラクチャで分けています。

[Model]  デフォルトの場合→ 294x/295x/X410など
タブの [NI-294x/295x/X410] の方の設定で設定してます。
プロパティノード名設定元設定値について
Active Channel0ch 0 の設定を指定します。
Carrier Frequencychannel 0
carrier frequency
[Hz]
フロントパネルの294x/295x シリーズの USRP の ch 0 の
設定が設定されます。
GainRx Gainフロントパネル USRP の Rx Gain設定が設定されます。
Active AntennaRx Active
Antenna
フロントパネルの設定が設定されます。
Active Channel1ch 1 の設定を指定します。
Carrier Frequencychannel 1
carrier frequency
[Hz]
フロントパネルの294x/295x シリーズの USRP の ch 1 の
設定が設定されます。
GainRx Gainフロントパネル USRP の Rx Gain設定が設定されます。
Active AntennaRx Active
Antenna
フロントパネルの設定が設定されます。

[Model]  "B210", "NI USRP-2901" の場合
タブの [NI-2900/2901] の方の設定で設定してます。
プロパティノード名設定元設定値について
Carrier FrequencyRx (or Tx)
carrier frequency
[Hz]
フロントパネルの2900/2901 シリーズの USRP の Rx (or Tx) の
設定が設定されます。
Active Channel0ch 0 の設定を指定します。
GainRx Gainフロントパネル USRP の Rx Gain設定が設定されます。
Active AntennaRx Active
Antenna
フロントパネルの設定が設定されます。
Active Channel1ch 1 の設定を指定します。
GainRx Gainフロントパネル USRP の Rx Gain設定が設定されます。
Active AntennaRx Active
Antenna
フロントパネルの設定が設定されます。


⑤ 送信側コミット~受信側トリガ時間セット~受信開始

送信側のコミットをして、エラーワイヤを結合することで、受信と送信の設定が終わってから次の処理に移ります。
次はトリガ時間を 0 にセット(=初期化)して、USRP の受信開始をします。



⑥送信データの作成
本当なら実行開始前に準備しておいたほうがいいと思いますが、本サンプルでは実行開始してから送信するための正弦波データを作成しています。
またフロントパネルのグラフに作成した正弦波の信号を表示しています。

②受信処理ループの部分



本サンプルの受信の処理ループは For ループでスイープ分のステップを実行します。

構造としては以下の様になっています。


① While Loop 

 外側の四角い枠が While Loop です。Stop ボタンを押されるか、エラーが発生したらループを停止する条件で実装されています。

② 受信データのフェッチ 



この関数で USRP からIQ データをフェッチしてグラフ表示のほうに渡しています。この関数では 2D CDB という形式にしており、マルチチャネルに対応してデータを取得しています。

CDB は Complex Double なので倍精度複素数のデータですので 2次元の複素数配列が取得されます。

基本的には行がチャネルになりますので、サンプルの様に指標配列の For Loop で簡単にチャネルのデータを得ることができます。

ちなみにサンプル数の指定をしていないので、デフォルトの [100000] サンプル分データをフェッチします。

関数の下部にある選択できるリストから出力するデータフォーマットを変更することができます。もちろん変更した場合はそのあとの処理も対応する必要があります。

③グラフ表示

フェッチした 2D の複素である IQ データを、IQ グラフと、スペクトラムに変換しグラフに表示しています。

③送信処理ループの部分



本サンプルの送信の処理ループは For ループでスイープ分のステップを実行します。

構造としては以下の様になっています。

① While Loop 

 外側の四角い枠が While Loop です。Stop ボタンを押されるか、エラーが発生したらループを停止する条件で実装されています。

② 送信データの書き込み


この関数で USRPに作成した IQ データ渡すことで送信しています。この関数では 2D CDB という形式にしており、マルチチャネルに対応してデータを送信しています。

CDB は Complex Double なので倍精度複素数のデータですので 2次元の複素数配列で作成します。

基本的には行がチャネルになりますので、サンプルの様に各チャネルの複素数を配列結合して渡します。

関数の下部にある選択できるリストから出力するデータフォーマットを変更することができます。もちろん変更した場合はそれに合わせて作成データも対応する必要があります。

③終了処理

最期は終了処理で、USRP を停止してUSRP デバイスを閉じます。

①USRP を停止(受信側のみ)


受信側でイニシエートしているので、受信側では USRP を停止します。

② USRP デバイスを閉じる(受信側も送信側も)


USRP のセッションを閉じて終了です。


実行してみる

使用する USRP は USRP 2954 で実行してみます。

Device Name に NI MAX で取得した名称を指定して実行します。




実行すると、右側上のグラフには送信している信号が表示され、下部には受信した IQ グラフとスペクトラムがタブの切り替えで表示されます。




まとめ

多くのサンプルが NI から提供されていますが、ほとんどが送信のみ、受信のみ、なので貴重な送受信両方行うサンプルになります。
設定や実行内容は比較的素直だと思うので、NI USRP- 294x, 295x, 2901 などお使いの場合は最初に見てみるといいかもしれません。

このサンプルの難易度は初級者向け(★☆☆)としたいと思います。



0 件のコメント :

コメントを投稿