ステートとキューを使ってUSRP での受信設定を実行中に変更する ~ niUSRP EX Spectral Monitoring (Interactive).vi (USRP のサンプルを紐解く (21))

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

今回で 21回目の USRP のサンプルについての紹介となります。

今回紹介するサンプルはタイトルの「ステートとキューを使ってUSRP での受信設定を実行中に変更するサンプル」です。ステートとキューを使用して実行中に USRP の設定を変更するといった割と実用的なプログラムの構造になっています。

それでは「niUSRP EX Spectral Monitoring (Interactive).vi 」を見ていきましょう。

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

※以前よりお伝えしましおりますが、USRP の古い型番の物はそろそろ(今年中には)販売中止になるものも出てくるそうですのでご注意ください。

niUSRP EX Spectral Monitoring (History).vi 

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


名前順にソートされて20番目のサンプルが「niUSRP EX Spectral Monitoring (Interactive).vi 」です。

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

下のような GUI を確認できます。


フロントパネルとしては大きく分けて、下段が設定関連、上段が受信信号のグラフ表示になります。

名称デフォルト設定値について
Device Names192.168.10.2USRP のデバイス名を入力します。
Ethernet で接続している時はIP で設定します。
USRP-RIO のように PCIe (MXI) ケーブルで
接続しているときは NI MAX で認識している
デバイス名を入力します。
IQ Sampling Rate [S/sec]10Mいわゆるサンプリングレートです。設定可能な
範囲は USRP のハードによります
Reference Frequency SourceInternalリファレンスクロックソースを選択します。デフォルトは
Internal = 内部クロックです。ドロップダウンで選択します。
Internal、RefIn、MIMO、GPS から選択します。
所謂 10M リファレンスです。
Carrier Frequency [Hz]915Mキャリア周波数を設定します。
設定可能な範囲は USRP のハードによります。
Timebace Clock SourceInternal同期クロックソース(トリガ)を選択します。デフォルトは
Internal = 内部です。ドロップダウンで選択します。
Internal、PPSIn、MIMO、GPS から選択します。
所謂 PPS トリガです。
Gain [dB]23設定したいゲインを入力します。
Acq Duration [sec]50m一回の受信時間を秒で指定します。
Active AntennaRX1アンテナと書いてありますが、受信するポート
の名称を文字列で指定します。USRP のハード
によって多少ことなりますが、TX/RX 、RX1
などを設定します。

スペクトラム表示の平均パラメータを設定できます。


名称デフォルト設定値について
Averaging ModeNo Averaging平均方法を選択します。デフォルトは No Averaging =
平均しない が選択されています。
他には Vector averaging、RMS averaging、Peak hold
を選択できます。
Weighting ModeExponential
重み付けのモードを選択します。デフォルトは Exponential です。
他には Linear を選択できます。
Number of Averages10平均数を指定します。デフォルトは 10回分を平均します。

実際に設定されたリードバック値の表示です。

名称設定値について
IQ Sampling Rate [S/sec] (actual)実行時に設定された IQレートが表示されます。
Carrier Frequency [Hz] (actual)実行時に設定されたキャリア周波数が表示されます。
Gain [dB] (actual)実行時に設定されたゲインが表示されます。
Frame Size [samples]実際の受信サンプル数が表示されます。


Reconfigure ボタン:実行中にこのボタンを押すことで現在の設定に再設定されます。


STOP ボタン:プログラムを終了するボタンです。



Error out

エラーが発生したときに表示されます。


Acquired Signal グラフには 受信信号(実部と虚部=IとQ)が表示されます。


Magnitude Spectrum  にはスペクトラムを表示します。


これまでのサンプルとは異なり、ブロックダイアグラムは大きく 3つのステートで構成されています。

① Configure USRP(USRP に設定)

② Acquire Frames(フレームを受信)

③ Exit

この VI を実行するとまず、実行時の設定で ① USRP に設定⇒②フレームを受信

になり、②を繰り返し実行しています。

②の状態で何か設定を変更して Reconfigure ボタンを押すことで状態②→①で設定変更→②改めてフレーム受信となります。

②の状態でSTOP ボタンを押すと、③で VI の実行を終了します。


実行開始時はステートキューに”Configure USRP"と"Acquire Frames"をセットしておきます。

ステートは②のステートで変化します。


① Configure USRP(USRP に設定)のステートのブロックダイアグラム

USRP の初期化と設定をします。

Acquire Frames(フレームを受信)のステートのブロックダイアグラム

USRPからデータを受信してスペクトラムに表示します。
Reconfigure ボタンが押されたら ループを抜けて USRP を終了しステートキューにccします。
STOP ボタンが押されたら ループを抜けて USRP を終了しステートキューにExit"をセットします。


③ Exit のステートのブロックダイアグラム
何もせず VI が終了します。

それでは詳細を見てみましょう。

① Configure USRP(USRP に設定)のステート

① Configure USRP(USRP に設定)のステートの部分では 大きく5つの処理をしています。

①デバイスオープン
チャネルの有効化
③IQレート、キャリア周波数、ゲインといったRF設定
④リファレンスソースの設定
取得方法の設定(有限)


①USRPデバイスのオープン




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

名称デフォルト設定値について
device Names
USRP の IP アドレスを入力します。
Ethernet で接続している時はIP で設定します。
ここでは 2つのイーサネットポートを[;] の文字列で
結合して渡しています。

Device Name への設定の仕方としてマスターを先に設定します。

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


②チャネルの有効化




この部分は USRP のプロパティノードを使用しています。
使用するチャンネル番号は制御器になっていますが、フロントパネルでは非表示になっていてデフォルトでは 0 を指定しています。(なぜ制御器にしていて且つ非表示なのかは不明です)

③IQレート、キャリア周波数、ゲインといったRF設定


IQ レート、キャリア周波数、ゲイン、アクティブアンテナの設定をします。
(ついでに取得したキャリア周波数から表示グラフである [Magnitude Spectrum] の X軸のオフセットをグラフのプロパティノードで設定しています。)

リファレンスソースの設定



Reference Frequency Source と Timebase Clock Source を設定します。


⑤取得方法の設定(有限)

取得方法を有限に設定し、1回の取得サンプル数を指定します。



⑤ 受信開始



受信が開始され、指定されたタイミングで取得した RF 信号が IQ データにダウンコンバートされてバッファに蓄えられていきます。


最初のフレームを取得


このサンプルではパイプラインを開始するにあたり最初のフレームを取得しておくようです。目的は恐らく表示に時間がかかるので、次の受信ループの際にエラーしないようにするためだと考えられます。(あまり良いやり方とは思えませんが、、、)

② Acquire Frames(フレームを受信)

② Acquire Frames(フレームを受信)の部分では、USRP でRF 信号が IQ データにダウンコンバートされてバッファに蓄えられていきますので、データを PC に吸いあげる(フェッチする)ことが主な処理です。また取得データをグラフに表示する処理も行っています。

さらに Reconfigure ボタン、STOP ボタンを監視し、押された場合にはループを抜けてそれぞれ別のステートをステートのキューに入れます。


①最初の受信開始

②最初のフェッチ

While Loop 

④ループ内での受信開始とフェッチ

⑤グラフ表示

⑥ USRP 停止

⑦ USRP デバイスを閉じる

⑧ ボタンによる次のステートをキューに入れる

それでは見ていきます。


① 受信開始



ループに入る前に最初の受信が開始され、指定されたタイミングで取得した RF 信号が IQ データにダウンコンバートされてバッファに蓄えられていきます。


②最初のフレームを取得



このサンプルではパイプラインを開始するにあたり最初のフレームを取得しておくようです。目的は恐らく表示に時間がかかるので、次の受信ループの際にエラーしないようにするためだと考えられます。(これが良いやり方か分かりませんが、、、)


個のステートでのメインの受信の処理ループは While ループです。エラーした場合かユーザーが Reconfigure ボタンか、STOP ボタンを押したときにこのループを終了する構造になっています。

③ While Loop 

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

④ ループ内での受信開始とフェッチ


毎回イニシエートしてからフェッチの関数で USRP からIQ データをフェッチしています。多くのサンプルでは個のフェッチのあと直接グラフにデータを渡すことが多いですが、このサンプルではグラフ表示のほうにはシフトレジスタで前回のデータを渡しています。この関数では CDB WDT という形式にしています。

CDB WDT は Complex Double の倍精度複素数のデータと時間情報がついた波形データが取得されます。

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

⑤グラフ表示

フェッチした 2D の複素である IQ データを通常のグラフとスペクトラム(平均化パラメータに対応)に変換して Magnitude Spectrumに表示しています。


ユーザーが Reconfigure ボタンか、STOP ボタンをおしたらループを抜けて終了処理をします。USRP を停止してUSRP デバイスを閉じ、押されたボタンによってステートを変更します。

⑥USRP を停止


USRP を停止します。

⑦ USRP デバイスを閉じる


USRP のセッションを閉じます。

⑧ ボタンによる次のステートをキューに入れる

エラーか、STOP ボタンであれば Exit ステートをキューにセットします。
それ以外(つまりReconfigure ボタン)の時は、Configure USRP"と"Acquire Frames"をセットします。

③ Exit 終了処理

なにもせず、終了します。

実行してみる



実行すると、受信が開始され、上段の IQ グラフとスペクトラムへの表示がされました。
VIを停止せずに、USRP の設定を変更して Reconfigure ボタンを押します。

再度初期化設定のために一瞬止まった感じになりますがインタラクティブに変更されました。

STOP ボタンで VI が停止します。


まとめ

このサンプルはステートとキューを使用して実行中に USRP の設定を変更するといった割と実用的なプログラムの構造になっています。
とはいえ、まだまだ単純な構造なのでこれをベースにそのままループ内に色々信号処理を追加してしまうと、、、重くなりそうですね。フェッチも連続ではなく、有限実行のモードなので重くても落ちないとは思いますが。
(弊社での構造はもっと洗練しておりますので、IQレートが高くても処理可能です。)

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

0 件のコメント :

コメントを投稿