NI USRP のサンプルを紐解く (5) ~基本的な送信サンプルのプログラム構造

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

今日も USRPサンプル紹介の続き第5回目です。

サンプルの場所や開き方は第一回目 NI USRP のサンプルを紐解く (1) ~"niUSRP EX Rx Continuous Async.vi"~ のブログを見てみてください。

前々回までは実行する際のパラメータの説明などを主に解説し、前回は基本的な受信サンプルのプログラム構造 (ブロックダイアグラムの構造) を1回目と同じ "niUSRP EX Rx Continuous Asyc.vi" で見ていきました。


今回は基本的な送信サンプルのプログラム構造 (ブロックダイアグラムの構造) を3回目の時の"niUSRP EX Tx Continuous Asyc.vi"で見てまいります。

USRP 送信プログラムの基本構造

"niUSRP EX Tx Continuous Asyc.vi" を開くと以下のようなフロントパネルが開きます。


LabVIEW のプログラムはこのフロントパネルと対になったブロックダイアグラムに記述されています。[Ctrl +E] を押すかメニューの [ウィンドウ]→[ブロックダイアグラムを表示] でブロックダイアグラムが開きます。

このサンプルは以下のようなブロックダイアグラムになっています。


通常、左から右へデータフローとして処理が流れていきます。

四角いものが関数だったりプロパティノードだったりして、各ブロックをワイヤで接続し、実行時にデータがワイヤを伝搬して処理を進めていきます。

LabVIEW のブロックダイアグラムでのプログラミングの基本は NI のサイト等を参考にしてもらって、本ブログではこのブロックダイアグラムの構造と処理の流れを見ていきます。

まず、大きく3つの構造に分けることができます。

① 初期化の部分

② 処理のループの部分

③ 終了処理の部分

この辺りは受信の構造とほぼ同一ですね。


①初期化の部分



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

左から

①USRPデバイスのオープン




"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これも USRP のハードウェアによって 複数チャネルに
対応していることもあります。0, 1 などを設定します。

文字列で与えます。通常は 0 です。USRP の種類によって 2ch 使えるものは 1 も設定できます。

③各種 RF 設定


送信の RF 設定のメインとなる関数です。
名称デフォルト設定値について
IQ Rate[S/sec]1Mいわゆるサンプリングレートです。設定可能な
範囲は USRP のハードウェアによります
Carrier Frequency2Gいわゆるキャリア周波数(センター周波数)です。
設定可能な範囲は USRP のハードウェアによります。
Gain0ゲインを設定します。
設定範囲はUSRP のハードウェアによります。
Active AntennaTX1アンテナと書いてありますが、受信するポートの名称を文字列で
指定します。USRP のハードウェアによって多少ことなりますが、
TX/RX 、TX1 などを設定します。
Coerced IQ Rate[S/sec]実行したときに実際に設定された IQレートが表示されます。
Coerced Carrier Frequency実行したときに実際に設定されたキャリア周波数が表示されます。
Coerced gain実行したときに実際に設定された ゲインが表示されます。


④ 送信波形作成

処理ループに入る前に、送信したい波形を作成しています。
この処理は送信波形を流し込む前に作成していれば良いので改造するならここを例えばファイルから波形を読み出したりしても良いと思います。

サンプルでは送信波形として複素正弦波の配列を作成しています。複素正弦波 (IQでの正弦波)なので正弦波の関数を 2つ用意して、0度位相 (sin = Q)と 90 度位相 (cos = I)の正弦波を作成し、複素数 (I + Qi) に変換しています。

次の処理ループの送信関数で指定したデータタイプで作成すれば OK です。

下の図は処理ループでの送信関数のアイコン画像です。



サンプルでは CDB というタイプにしているので、複素正弦波の配列を作成しています。

このドロップダウンでCDB 以外のデータタイプに変更して指定できます。


またこの段階で送信する波形をグラフ表示しています。

時間波形表示だけのようです。

このサンプルではここで作成した波形データを繰り返し送信するサンプルになっていますので、作成は 1回だけです。

あくまでサンプルなので、任意の波形を自由に送信する場合には構造を考えないといけません。


②処理ループの部分


処理ループでは、事前に作成した波形データ(ここでは CDB = 複素数配列 =IQデータ)を送信関数に渡すことで、一旦バッファリングされて、USRP でRF 信号にアップコンバートされて実際に送信する処理になります。

構造としては

① While Loop 

 グレーの枠が While Loop です。Stop ボタンが押されるか、エラーが発生したらループを停止します。

②送信関数(送信データの書き込み)





この関数で送信データをバッファリングし、 アップコンバートして送信します。

バッファからアップコンバート RF の設定に従って自動で行っています。


名称デフォルト設定値について
data送信データ
複素数配列
送信するデータを入力します。データタイプは関数下部のドロップダウンで指定します。デフォルトは CDB 複素数配列です。
Timeout10sタイムアウトとして指定する秒数を指定します。
end of data?F送信終了のフラグです。サンプルでは STOPボタンで T になって送信を終了します。

出力データは、デフォルトでは CDB という形式です。

CDB は Complex DouBle なので倍精度複素数のデータです。

他にも CDB Cluster 、CDB WDT や、I16 があります。

WDT は Waveform Data Type の略で、配列に時間データが付与された波形データの形式を表しています。

Cluster も WDT に準じたクラスターという型です。

I16 は所謂 USRP の内部の生データタイプとなりまして、16bit 整数の配列です。IQ交互に配列要素とします。

③終了処理

受信の時は Abort -> 閉じるという処理でしたが送信側のサンプルの終了処理はUSRP デバイスを閉じるだけです。


受信側の Abort に相当する部分は送信関数の入力の [end of data?] で行っているような気がします。(すみません内部までは見れまでません)。送信はこのUSRP のセッションを閉じて終了です。


まとめ

今回は基本的な USRP 送信サンプルのプログラムの構造を解説しました。

受信同様大きく3つの構造でできていました。

① 初期化の部分

② 処理のループの部分

③ 終了処理の部分

同じような構造のサンプルなので、シンプルで良いと思います。

受信同様このサンプルをベースにインタラクティブなものに作り替える必要があることがほとんどだと思いますし、単純に処理ループ内での処理を増やしていくと(例えば毎回送信データを処理ループ内で作成していると)、送信バッファへの転送が間に合わなくなってバッファがアンダーフローして簡単にエラーしてしまいます。

その辺りは工夫が必須ですね。

0 件のコメント :

コメントを投稿