友達を作る方法PLUTOとHDSDR





少し前まで、子供と若者向けのかわいいSDRトランシーバーADALM PLUTOを衝動的に購入しました。 残念なことに 、Linux用の多数のソフトウェアで動作しますが、私のお気に入りのHDSDRはサポートしていません。 考え直すことなく、私はこの問題に対処し始めました、そして、それがここから来たものです:







Analog Devicesは、そのPLUTOを学生に向けています。 PLUTOのすべてのソフトウェアはオープンであり、自由に利用できます。 会社のウェブサイトには、PLUTOの操作に関する必要な情報のほとんどすべてを見つけることができるページがあります。 ほとんどのソフトウェアはLinux用に作成されており、学生はGNU Radio、MATLABなどを使用することをお勧めします。







私はPLUTOに純粋にアマチュア無線の関心があります。 わずか150米ドルで70MHzから6GHzの範囲( 開示後)のSDRは奇跡です。 いくつの実験を行うことができます! すべてがそこに統合されているかを確認します。















どうやら、ADはハム自体が人気のあるプログラムのドライバーを作成する必要があると考えているため、最近までSDR#さえサポートされていませんでした。 ただし、周波数をトランシーバーと同期させるためにプログラムでCATを適切にサポートする必要があるため、SDR#は私には適していません。 HDSDRをトランシーバーの最初の中間周波数に接続して、パノラマレシーバーとして使用したいと思います。 そのため、HDSDRとPLUTOを自分で統合する方法は1つしかありません。







Googleを使用して、問題を解決するには、特別なExtIO_.dllライブラリをWinrad形式で作成する必要があることがすぐにわかりました。 このライブラリは、HDSDRと目的のSDRレシーバー間のソフトウェアブリッジとして機能します。 幸いなことに、ライブラリインターフェイスは十分に文書化されてます 。 さらに、githubのさまざまなレシーバーには、 RTL_SDRLimeSDRなどの既製のライブラリ実装がかなりあります。コードの書き方を確認する場所がありました。 ライブラリ自体は、20年前に書いたように、まったく古い学校で、新しいテクノロジーはなく、純粋なC89です。 少なくとも、新しいプログラミング言語を学ぶ必要はありません。既にプログラミング言語は成功への希望をもたらしています。







基本的に、ExtIO_.dllには、SDR機器の初期化、信号受信の開始と停止、指定された設定の保存と復元を可能にする多数の機能を実装する必要があります。 私にとって最もわかりにくい瞬間は、レシーバーとHDSDRの間のストリーミングデータの交換の形式でしたが、それについては以下で詳しく説明します。







ここで、PLUTOをプログラムで制御する方法が問題になりました。 実際にはいくつかの制御オプションがあります。 libad9361.dllライブラリを介してチップで直接、またはIIOライブラリを介して、少なくとも2つを見つけました。 後者のオプションはよりシンプルで、よりよく説明されているように思えたので、私はそれに決めました。 このライブラリでは、すべての機器設定が何らかのXML構造の形式で利用可能であり、個々の要素はプロパティのテキスト名によってアクセスされ、非常に便利です。 ライブラリの詳細については、 こちらをご覧ください 。 このライブラリの大きな利点は、コマンドラインユーティリティが付属していることです。このユーティリティを使用すると、必要なレシーバ設定をいつでもすばやく変更できます。 したがって、HDSDRインターフェイスにすべてのSDR設定を実装する必要はありません。必要な最小限のもので十分です。 また、エキゾチックなFIRフィルターのロードは、コマンドラインから実行できますが、これが必要な場合があります。 IIOのデータストリーム:















プログラムにより、HDSDRからPLUTOを制御する方法を学ぶのは非常に迅速かつ簡単でした。 特にSDRの経験がなかったため、ストリーミングデータで満足のいく結果を得るのは少し難しくなりました。 ここで、データはSDRレシーバーからI / Q / I / Q ... I / Qサンプルのストリームの形式で送信されることを理解する必要があります。 各サンプルは符号なし16ビット整数で、そのうちの下位12ビットのみが重要です。 同時に、HDSDRにはデータストリームを受信するための多数のオプションがあります。 どちらがより便利で優れているかは、私には完全には明らかではありません。 その結果、ExtIOではexthwUSBdata16と呼ばれるオプションに決着しました。 実際には、IIOライブラリがデータを提供する方法は1対1です。

次の問題は、IIO受信バッファーとHDSDR間のデータ転送です。 後者は512バイトの倍数であるブロックでデータを受信し、IIOはこの形式でデータを出力できません。 中間バッファーを作成し、ストリームを転送する必要がありました。 以下に送信コードを示します。











DWORD WINAPI GeneratorThreadProc( __in LPVOID lpParameter ) { int16_t iqbuf[EXT_BLOCKLEN * 2]; ssize_t nbytes_rx; char *p_dat, *p_end; ptrdiff_t p_inc; int iqcnt = 0; // pointer to sample in iqbuf while ( !gbExitThread ) { nbytes_rx = iio_buffer_refill(rxbuf); p_inc = iio_buffer_step(rxbuf); p_end = (char *)iio_buffer_end(rxbuf); for (p_dat = (char *)iio_buffer_first(rxbuf, rx0_i); p_dat < p_end; p_dat += p_inc) { iqbuf[iqcnt++] = ((int16_t*)p_dat)[0]; iqbuf[iqcnt++] = ((int16_t*)p_dat)[1]; if (iqcnt == EXT_BLOCKLEN * 2) { // buffer full iqcnt = 0; pfnCallback(EXT_BLOCKLEN, 0, 0.0F, &iqbuf[0]); } } } gbExitThread = false; gbThreadRunning = false; return 0; }
      
      





示されたサイクルを使用して、4 MS / sのストリーム転送を達成することができました。この値を超えると、データは送信される時間がなく、信号はst音で受信されますが、鉄は20 MS / s以上を送信できるようです。 ループがTHREAD_PRIORITY_TIME_CRITICALにスピンするスレッドの優先順位を上げ、バッファーのサイズを増やしました。 結果なし。 さらに、バッファを1 MBに増やすと、最小流量では正常に受信できませんでした。 ここが多いほど良いというわけではありません。 速度を上げる方法についてアイデアがある場合は、コメントで共有してください。







私は4 MS / sが私の目的には十分であると言わなければなりません。バンドはアマチュアHFバンドをカバーしています。 はい、そしてほとんどのタスクに十分なVHFおよびマイクロ波帯域で。 その結果、ライブラリが書き込まれ、受信用にPLUTOがオンになっているHDSDRウィンドウは次のようになります。















すべてのライブラリコードは、 こちらの github 入手できます 。 ADALM PLUTOを使用した実験に自由に使用してください。







73 de R2AJP








All Articles