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

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

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

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

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

USRP 受信サンプルのプログラム構造

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


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

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



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

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

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

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

① 初期化の部分

② 処理のループの部分

③ 終了処理の部分


①初期化の部分


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

左から

①USRPデバイスのオープン


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

名称デフォルト設定値について
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 のハードウェアによります。
Gain1ゲインを設定します。
設定範囲はUSRP のハードウェアによります。
Active AntennaRX1アンテナと書いてありますが、受信するポートの名称を文字列で
指定します。USRP のハードウェアによって多少ことなりますが、
TX/RX 、RX1 などを設定します。
Coerced IQ Rate[S/sec]実行したときに実際に設定された IQレートが表示されます。
Coerced Carrier Frequency実行したときに実際に設定されたキャリア周波数が表示されます。
Coerced gain実行したときに実際に設定された ゲインが表示されます。


④ 受信開始

設定後、この関数で受信開始を USRP に指示します。

受信が開始され、RF 信号が IQ データにダウンコンバートされてバッファに蓄えられていきますので、②の処理ループでデータを PC に吸いあげます。

②処理ループの部分

処理ループでは、USRP でRF 信号が IQ データにダウンコンバートされてバッファに蓄えられていきますので、データを PC に吸いあげる(フェッチする)ことが主な処理です。

付随して、吸い上げたデータをフロントパネルのグラフ表示器で表示します。

構造としては

① While Loop 

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

② 受信データのフェッチ 

この関数で USRP から Number of Sample で指定した数の IQ データをフェッチしてグラフ表示のほうに渡しています。

サンプルを参考に受信信号に信号処理させるときはこの関数の出力を使うことになります。

名称デフォルト設定値について
Number of Samples16384USRP から取得する1回あたりのサンプル数を指定します。
Timeout10sタイムアウトとして指定する秒数を指定します。
Actual Rx Timestamp実行して受信をしたタイミングでのタイムスタンプを表示します。

出力データは、CDB WDT という形式です。

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

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


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

③グラフ表示


フェッチした IQ データをスペクトラム、IQ 時間軸で表示しています。

スペクトラムは処理が重いので 1秒ごとに1 回の処理にしているようです。


③終了処理


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

①USRP を停止


USRP を停止します。

② USRP デバイスを閉じる


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


まとめ

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

大きく3つの構造でできていました。

① 初期化の部分

② 処理のループの部分

③ 終了処理の部分

サンプルとしてはシンプルで判りやすくて、複雑怪奇なサンプルよりは良いと思います。

ただこのサンプルをベースにインタラクティブなものに作り替える必要があることがほとんどだと思いますし、処理ループ内での処理を増やしていくと、フェッチが間に合わなくなってバッファがオーバーフローして簡単にエラーしてしまいます。

ドルフィンシステムでは秘伝のテンプレートがあるので普段の業務で開発の初期段階はかなり省力化できています。(代々伝わる秘伝のタレなのでちょっと公開はしかねます、、、)







0 件のコメント :

コメントを投稿