ソフトウェア制御のUSRPでマイクロ秒単位の送受信制御を行う(finite編)

【今回】ソフトウェア制御のUSRPでマイクロ秒単位の送受信制御を行う(finite編)
【次回】ソフトウェア制御のUSRPでマイクロ秒単位の送受信制御を行う(ストリーミング編)


こんにちはドルフィンシステム福島です。
7月に入ってから猛暑日が続いています。

お昼休みに近くのコンビニへ行く程度でも汗だらだらになるので、昨年から日傘を常用しています。

私がもっぱら使っているのは、以下の日傘で、

  • 完全遮光
  • なのに120gと軽量で
  • カラー展開も豊富
  • 晴雨兼用

と言うことがありません。

U.Light airy airy+
https://item.rakuten.co.jp/kizawa/mex-05-320pi/?s-id=ph_pc_itemname

これくらい軽いと常にバッグに入れておいても気にならないですし、日差しがきついときにさっと出せるので、便利です。


さてNIコミュニティにSDRの掲示板というものがあり、主にLabVIEWでのUSRPについて質問と回答が寄せられています。私も時折回答をしているのですが、それを見ていた方からプライベートメッセージが来ました。

こんにちは。USRP B210 について質問があり、ご支援をお願いしています。

TX 経由で 10 マイクロ秒間信号を送信してパッシブ センサーを励起し、その後 10 マイクロ秒間停止して応答をリッスンするプロジェクトに取り組んでいます。このような遅延があると、送信ループがアクティブになり、リスニング ループが正しく待機するようにタイミングを制御するのが難しくなります。どうしたら良いでしょうか?

この方がどのようなコードを書いているのかは分かりませんが、恐らく以下のような処理をしていると思われます。

  1. 10us分のサンプルを送信する
  2. 10us後に反射したデータを受信するために10us待機して10us間受信する

メッセージには送信ループやリスニングループと書かれているので、上記 1. 2. は並列処理しているようです。タイミングチャートは以下の「理想」になるはずですが、実際は「現実」にあるようにズレたところで受信してしまうようです。


「理想」


「現実」


ハードウェア制御の戦略

Windowsのプログラム上ではミリ秒単位の待機などは出来ますが、厳密にミリ秒単位で制御は出来ていません。人間の感覚ではミリ秒単位の制御が出来ているようでも、実際に観測可能な形で時間確定性を評価すると全然使い物にならない事が判明します。

FPGAなら1クロック単位での制御が出来るので厳密な時間確定性を保証できますが、ソフトウェア制御ではジッター(jitter)が発生するため不可能です。

それでもSDRシステムが動作しているのは、時間に余裕を持たせた制御をしているからです。例えば100ms間隔で処理を行わなければならないときは、90msで処理が終わるようにプログラミングすることで「間に合う」ようにしているので動作しているのです。

FPGAの時間確定性

システム動作クロック1クロックあたりの時間
1M1マイクロ秒
10M100ナノ秒
100M10ナノ秒

リアルタイムオペレーティングシステム(RTOS)とは


さて今回のお題を実現するためにはどのような処理にすれば良いでしょうか?

私の回答です。

ソフトウェア制御で「ソフトウェア無線機をシビアな時間制御しない」というのが正しい戦略になります。

ハードウェアをソフトウェア制御して送信と受信を〇〇usで切り替えるなどは考えてはいけません。出来るだけハードウェア制御はしないことが正しい戦略になります。
※もちろん場合によりけりですが、ソフトウェアはus単位の制御は出来ないことが分かっているので。


コード実装の戦略

コードを実装するにあたり、いくつかの戦略が考えられます。
まず大きく別れるポイントは、送受信を連続して実行しなければならないのか?それとも単発で良いのか?という点です。

単発でよいのであれば、実装は非常に簡単です。

受信はfiniteで送受信タイミングの制御に以前紹介したTimed Commandを使用すれば良いのです。


USRPの制御を時間確定的に制御する Timed CommandはStreamを制御できるか? (3)
http://mikioblog.dolphinsystem.jp/2024/01/usrp-timed-command-3.html


送信のタイミングと、受信のタイミングをそれぞれ別個にサンプル単位で指定できます。

例えば、

  • 収録開始後 1秒後に送信
  • 収録開始後 1秒+10us後に受信

とすると、希望通りになりそうです。


というわけで、niUSRP EX Rx Finite Sync.viを改造して同時に送受信できるVIを作りました。


送受信のタイミングは秒単位と秒以下の単位で指定可能です。

下図のように、

  • 送信タイミング(左)を動作開始後2秒後
  • 受信タイミング(右)を動作開始後2秒後

として動かしてみます。


下図の下側が送信データで、上側が受信データです。
正しい送受信タイミングのようです。


次に501us程受信を早めてみます。


先程は先頭に来ていたデータが501u程遅れて受信しました。


1点気をつけた方が良いのは、受信タイミングには誤差があるようです。

下図のようにActual Rx Timeを見ると指定した時刻よりも2us程遅く受信しているようです。

信号を解析するときにはActual Rx Timeを見て解析するサンプル数を調整するのが良さそうです。


グラフの表示開始と終了位置を変更して確認してみると、12サンプル程のズレがあるようです。


コードの解説

サンプルは以下からダウンロードして下さい。

20240708-niUSRP EX Rx Finite Sync -  Full duplex.vi
https://dolphinsystem-my.sharepoint.com/:u:/g/personal/mikio_dolphinsystem_onmicrosoft_com/EQrOdaLCLqNKmZ8IIcT0IXgBl3DbduuP-P1IxeYpIFDVew?e=EvVZae


USRPデバイスを初期化してクロックソースを設定後、送受信タイミングを指定します(下図赤枠)。


次にUSRPのタイマーをリセットし、送受信を実行します。


これで送受信のタイミングを制御することが出来ました。

受信の誤差があるようですが誤差の値も計算することが出来るので、解析時に参考になります。


サンプルの使い方

  1. VIを開きます。LabVIEW 2022で作成してあります。
  2. Device NameにUSRPのIPアドレスやリソース名を入れます(192.168.0.1, MyB200, B200mini等)
  3. IQ Rateを指定します。最初はデータ落ちしないように1M等小さめな値で実行します。
  4. Carrier Freqを指定します。
  5. Gainを指定します。
  6. Number of samplesは、受信する信号長を指定します。
  7. Waveform sizeは、送信する信号長を指定します。
  8. Time to Send First Sampleには動作開始から送信までの時間を指定します。whole secondsは秒単位、fractional secondsには秒単位以下の数値を指定します。
  9. 例えば、
  10. whole seconds = 2
  11. fractional seconds = 10ms
  12. と入力すると、USRP動作開始後2分10ms後にデータを送信します。
  13. Time to Receive First Sampleには動作開始から受信までの時間を指定します。Time to Send First Sampleと同じように指定します。
  14. 値の指定が終わったら、VIを実行します。(F5)
  15. Send & Recv ボタンを押すと、送受信を行います。
  16. VIにエラーが発生したらVIは停止します。
  17. VIを停止させるときはexitボタンを押します。


まとめ

ひとまずTimed Commandを使用してus単位の送受信制御は出来ました。ただこの方法は単発時にしか使用できません。
次回はストリーミングでus単位の送受信制御を行いたいと思います。


以上、ドルフィンシステム福島でした。



コメント