
Vor nicht allzu langer Zeit kaufte ADALM PLUTO impulsiv einen niedlichen SDR-Transceiver für Kinder und Jugendliche. Zu meinem Bedauern funktioniert es mit einer Reihe von Software für LINUX, aber mein Lieblings- HDSDR unterstützt es nicht. Ohne nachzudenken, begann ich mich mit diesem Problem zu befassen und hier ist, was daraus wurde:
Analog Devices richtet sein PLUTO an Studenten. Die gesamte Software für PLUTO ist offen und frei verfügbar. Auf der Website des Unternehmens finden Sie eine Seite, auf der Sie fast alle erforderlichen Informationen zum Betrieb von PLUTO finden. Der größte Teil der Software ist unter Linux geschrieben. Den Schülern wird empfohlen, GNU Radio, MATLAB usw. zu verwenden.
Ich habe ein reines Amateurfunkinteresse an PLUTO. Ein SDR mit einem Bereich von 70 MHz bis 6 GHz (nach Offenlegung ) für nur 150 amerikanische Gelder ist ein Wunder. Wie viele Experimente können durchgeführt werden! Sehen Sie, wie viel alles dort integriert ist:

Anscheinend glaubt AD, dass Schinken selbst Treiber für beliebte Programme schreiben sollten, so dass bis vor kurzem sogar SDR # nicht unterstützt wurde. SDR # passt jedoch nicht zu mir, da ich eine gute CAT-Unterstützung in einem Programm benötige, um die Frequenz mit einem Transceiver zu synchronisieren. Ich möchte versuchen, HDSDR als Panoramaempfänger zu verwenden, indem ich es an die erste Zwischenfrequenz des Transceivers anschließe. Es gibt also nur einen Ausweg - HDSDR und PLUTO selbst zu integrieren.
Mit Google habe ich schnell herausgefunden, dass ich zur Lösung meines Problems eine spezielle ExtIO_.dll-Bibliothek im Winrad- Format erstellen muss . Diese Bibliothek dient als Softwarebrücke zwischen dem HDSDR und dem gewünschten SDR-Empfänger. Glücklicherweise ist die Bibliotheksoberfläche gut dokumentiert . Darüber hinaus gibt es auf github einige vorgefertigte Bibliotheksimplementierungen für verschiedene Empfänger: RTL_SDR, LimeSDR usw. Es gab einen Ort, an dem man sehen konnte, wie man Code schreibt. Die Bibliothek selbst ist ziemlich altmodisch, keine neuen Technologien, reines C89, wie sie vor 20 Jahren geschrieben haben. Zumindest müssen Sie keine neue Programmiersprache lernen, was bereits Hoffnung auf Erfolg weckte.
Tatsächlich muss ExtIO_.dll mit Dutzenden von Funktionen implementiert werden, mit denen Sie SDR-Geräte initialisieren, den Signalempfang starten und stoppen sowie die Einstellungen speichern und wiederherstellen können. Für mich war der unverständlichste Moment das Format des Datenaustauschs zwischen dem Empfänger und HDSDR, aber mehr dazu weiter unten.
Nun stellt sich die Frage, wie PLUTO programmgesteuert gesteuert werden kann. Es gibt tatsächlich mehrere Steuerungsoptionen. Ich habe mindestens zwei gefunden: entweder direkt mit dem Chip über die libad9361.dll- Bibliothek oder über die IIO- Bibliothek. Die letztere Option schien mir einfacher und besser beschrieben zu sein, also entschied ich mich dafür. In dieser Bibliothek sind alle Geräteeinstellungen in Form einer XML-Struktur verfügbar. Auf ein einzelnes Element wird über den Textnamen der Eigenschaft zugegriffen, was sehr praktisch ist. Eine detailliertere Beschreibung der Bibliothek finden Sie hier . Der große Vorteil der Bibliothek besteht darin, dass sie über Befehlszeilenprogramme verfügt, mit denen Sie die gewünschten Empfängereinstellungen jederzeit schnell ändern können. Sie müssen also nicht alle SDR-Einstellungen in der HDSDR-Schnittstelle implementieren, sondern können mit dem erforderlichen Minimum auskommen. Das Laden eines exotischen FIR-Filters kann über die Befehlszeile erfolgen, falls dies jemals erforderlich sein sollte. Datenströme in IIO:

Programmatisch war das Erlernen der Steuerung von PLUTO über HDSDR ziemlich schnell und einfach. Es war etwas schwieriger, beim Streaming von Daten ein zufriedenstellendes Ergebnis zu erzielen, zumal ich noch keine Erfahrung mit SDR hatte. Hier müssen Sie verstehen, dass die Daten vom SDR-Empfänger in Form eines Stroms von I / Q / I / Q ... I / Q-Abtastwerten stammen. Jeder Abtastwert ist eine vorzeichenlose 16-Bit-Ganzzahl, von der nur 12 niederwertige Bits von Bedeutung sind. Gleichzeitig bietet HDSDR ein Dutzend Optionen zum Empfangen von Datenströmen. Welches bequemer und besser ist, ist mir nicht ganz klar. Infolgedessen habe ich mich für die Option entschieden, die in ExtIO als exthwUSBdata16 bezeichnet wird, d. H. eigentlich eins zu eins, wie die IIO-Bibliothek Daten liefert.
Das nächste Problem war die Übertragung von Daten zwischen den IIO-Empfangspuffern und HDSDR. Letzterer empfängt Daten in Blöcken, die ein Vielfaches von 512 Bytes sind, und IIO kann keine Daten in diesem Format ausgeben. Ich musste einen Zwischenpuffer erstellen und den Stream durch ihn übertragen. Der Übertragungscode wird unten angezeigt.
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;
Unter Verwendung des angegebenen Zyklus war es möglich, eine Stromübertragung von 4 MS / s zu erreichen. Oberhalb dieses Wertes haben die Daten keine Zeit zum Senden und das Signal wird mit Stottern empfangen, obwohl das Eisen in der Lage zu sein scheint, 20 MS / s und noch mehr zu senden. Die Priorität des Threads, in dem sich die Schleife zu THREAD_PRIORITY_TIME_CRITICAL dreht, wurde erhöht, und die Größe der Puffer wurde erhöht. Kein Ergebnis. Wenn der Puffer auf 1 MB erhöht wurde, war außerdem ein normaler Empfang bei der minimalen Flussrate unmöglich. Mehr heißt hier nicht besser. Wenn Sie Ideen zur Geschwindigkeitssteigerung haben, teilen Sie diese bitte in den Kommentaren mit.
Ich muss sagen, dass 4 MS / s für meine Zwecke völlig ausreichen, die Band deckt mehr als jede Amateur-HF-Band ab. Ja, und auf den UKW- und Mikrowellenbändern genug für die meisten Aufgaben. Infolgedessen wird die Bibliothek geschrieben, das HDSDR-Fenster mit eingeschaltetem PLUTO für den Empfang sieht ungefähr so aus:

Der gesamte Bibliothekscode ist hier auf github verfügbar. Fühlen Sie sich frei, es für Ihre Experimente mit ADALM PLUTO zu verwenden.
73 de R2AJP