こんにちは。ドルフィンシステム福島です。
時間が空いてしまいましたがLabVIEWで非対応なUSRPを動かすの2回目です。
1回目は、セットアップと接続されているUSRPの認識を行いました。
LabVIEWで非対応なUSRPを動かす(第1回:概要とセットアップ)
http://mikioblog.dolphinsystem.jp/2025/10/labviewusrp1.html
今回は送受信ループバックを行う
- tx-rx-loopback.vi
を実行してみます。
USRP IP addressには、弊社のN310のIPアドレスを設定して実行します。
するとしばらくするとRF0のTxチャンネルから出力、受信が開始し、下図のような受信波形が表示されました。
LabVIEWの内部構造を見てみる
内部構造を見てみます。
まずはLabVIEW側です。
VIの最初の方で、
- Pythonセッションの開始
- Open_sessionでUSRPを開く
- 受信設定、送信設定
などを行っています。
続いて
- start_rx_streamで、ストリーミング開始
を行っています。
メインのループでは、
- データ送信
- データ受信
を行っており、受信したIQデータを別のスレッドに回して、そちらでグラフ描画を行っています。
Stopボタンを押下してループを抜けたところの処理は、
- 送信停止
- USRPを閉じる
- Pythonスクリプトを閉じる
などを行っています。
制御自体はシンプルで、LabVIEWでの計測器制御の流れと同じです。
Pythonの内部構造を見てみる
次にtx-rx-loopback/tx-rx-loopback.pyを見てみます。
https://github.com/ni/labview-usrp-examples/blob/main/tx-rx-loopback/tx-rx-loopback.py
ファイル内には以下の関数が実装されています。
Python環境で
- c:\> py tx-rx-loopback.py
のように実行すると、このスクリプト単体でUSRPの制御ができます。
- __init__
- __del__
- setup_graph
- check_session
- check_settings
- check_graph_settings
- open_session
- configure_rx
- configure_tx
- start_rx_stream
- send_data
- receive_data
- receive_tx_async
- send_done
- stop_rx_stream
- close_session
- send_file
390行近辺にIPアドレスやアンテナ名を設定できるので、ここを直接編集して実行してみます。
# Initializing graph settings and RF settings # Note: antenna names might differ between USRP device types. # Here, settings for an X410 device are preset. graph_settings = GraphSettings(rx_radio=0, rx_chan=0, tx_radio=0, tx_chan=0) rx_settings = RfSettings(frequency=2e9, gain=0, antenna="RX2", rate=1e6) tx_settings = RfSettings(frequency=2e9, gain=0, antenna="TX/RX", rate=1e6) # Open session session = open_session("addr=192.168.0.22", graph_settings) # Configure Tx and Rx settings configure_tx(session, tx_settings) configure_rx(session, rx_settings) # Start Tx thread --> read waveform from file and send it # The example waveform.npy file is a NumPy array containing int64 samples # and have properties listed below: # Waveform = Sine, Freq tone = 10kHz, Amplitude = 0.707, Size = 10000 samples tx_thread = threading.Thread(target=send_file, args=(session,)) tx_thread.start() # Create buffer for Rx buffer_size = 10000 buffer = np.zeros((1, buffer_size), dtype=np.int64) # Start Rx streaming overall = 0 start_rx_stream(session)
すると先程のLabVIEWと同じように実行することができました。
使い方
通常のLabVIEWのように関数パレットからVIに関数をドロップしてプログラミングするスタイルではありません。
あらかじめPythonからUHDを呼び出すプログラムを作っておいたうえで、その関数をLabVIEWから呼び出すスタイルです。
なので現在のままではUHDやPythonに詳しい必要があり、NI-USRPドライバを使ったLabVIEWのような気軽さはありません。
今後、LabVIEWで簡単にプログラミング出来るようにするためには、
- 汎用的なPythonスクリプトを実装し
- LabVIEW関数が実装され関数パレットからドロップできるようになれば
有用なものになりそうです。
時間があれば作ってみようかなあ。
問題点は、LabVIEW→Python→UHDと多段の呼び出し階層になるため、相当程度オーバーヘッドが発生し広帯域なストリーミング処理は難しいだろうことが予想されることです。
以上、ドルフィンシステム福島でした。






コメント
コメントを投稿