SDR - Amateurfunk-Station DK1IO

Direkt zum Seiteninhalt

Hauptmenü

SDR

SDR (Software Defined Radio) ist der gegenwärtige Trend bei Funkgeräten. Wesentliche Merkmale des Gerätes werden jetzt nicht
mehr von der Hardware bestimmt, sondern von der zugehörigen Software. Die Analogsignale werden direkt am Antenneneingang
in Zahlenwerte umgewandelt, von da an wird nur noch gerechnet.
Um mich mit dieser Technik vertraut zu machen, habe ich mir einen SDR-Empfänger gekauft, einen
AIRSPY HF+.

Bild 1


AIRSPY HF+ und SDR#


Dieses kleine Kästchen mit den Ausmaßen einer Zigarettenschachtel soll ein vollwertiger Empfänger sein?
Ja, ist es, und ein guter obendrein. Der RX deckt den gesamten HF-Bereich von 9 kHz bis 31 MHz ab. Auf VHF reicht der Bereich von
60 MHz bis 260 MHz.
Aber wie oben schon erwähnt: die Hardware ist nur Hälfte des Empfängers, der Software kommt eine genau so große Bedeutung zu.
Es gibt nun mehrere Programme, mit denen die Hardware zum Leben erweckt werden kann. Ich habe mich für
SDR# (SDRSharp)
entschieden, weil der Entwickler des RX auch diese Software geschrieben hat. Damit hat man schon alles, was zum Empfang von CW
und Fonie benötigt wird. Außerdem ist es ein guter Panoramaempfäger mit max. 768 KHz Bandbreite.
Das alles interessiert mich allerdings nicht besonders, mein Hauptaugenmerk liegt auf den digitalen Betriebsarten, PSK und FT8.
Dafür braucht es natürlich das jeweilige Programm, z. B.
WSJT-X. SDR# ist sozusagen nur das notwendige Übel, das die Audiodaten
zur Verfügung stellt. Zur Verbindung zwischen den Programmen ist ein virtuelles Audiokabel erfoderlich. Ich verwende
VB Cable, das
eine problemlose Installation ermöglicht.
Es erscheint im Gerätemanager ein neues Audiogerät (VB-Audio Virtual Cable) sowie zwei neue Audio-Ein- und Ausgänge (CABLE Input
und CABLE Output).

Bild 2


In SDR# ist der Ausgang auf CABLE Input zu legen, in WSJT-X der Eingang mit CABLE Output zu verbinden, fertig.
Das Plugin "FFT Display" wird auf "None" gestellt und wieder geschlossen. Damit sind Frequenz- und Spektrumanzeige deaktiviert. Sie
werden ja sowieso zum größten Teil von WSJT-X überdeckt. In diese leere schwarze Fläche werden die beiden Fenster von WSJT-X
platziert.
Es ist zweckmäßig, mit dem Frequenzmanager, die Bandfrequenzen der gewünschten Betriebsarten zu editieren. Ich habe dazu
die Gruppennamen "FT8" und "PSK" gewählt und die entsprechenden Frequenzen für die Kurzwellenbänder eingetragen.
Diese Maßnahme ist zwingend erforderlich für das weiter unten beschriebene automatische Übertragen der Frequenzinformation von
WSJT-X zu SDR#

Wenn jetzt in SDR# auf "Start" gklickt wird, sollte alles laufen. Mit einem Doppelklick auf eine der Frequenzen wird diese vom
Empfänger übernommen.

Bild 3


Ein Nachteil dieser Konfiguration sei nicht verschwiegen: Die Frequenz wird ausschließlich in SDR# eingestellt. Da zwischen beiden
Programmen keine Kommunikation stattfindet, bleibt die Frequenzanzeige bei WSJT-X auf dem alten Stand und muss manuell
nachgestellt werden. Wer als SWL damit loggen will, ist damit nicht so gut bedient.
Um diesen Nachteil zu beheben, habe ich ein kleines Programm geschrieben, das ohne eigene Bedienoberfläche auskommt.
Trotz der fehlenden Schnittstelle zu anderen Programmen ist es damit möglich, die Frequenz von WSJT-X zu SDR#
programmgesteuert zu übertragen.
Zuerst muss SDR# dafür hergerichtet werden. Die Datei "Plugins.xml" im SDR#-Verzeichnis enthält 9 für SDR# verfügbare Plugins.
Das sind Zusatzprogramme für besondere Aufgaben, z. B. Rauschunterdrückung. Diese nehmen aber in der Menüleiste soviel Platz
weg, dass ein Scrollbalken erforderlich ist, um alle anzuzeigen. Dieser Scrollbalken stört die Funktion des Zusatzprogramms. Deshalb
werden außer "Audio", "AGC", "FFT Display" und "Frequency Manager" alle anderen Plugins in "Plugins.xml" gelöscht. Wenn SDR# mit
der geänderten Datei gestartet wird, ist der Scrollbalken verschwunden.
Natürlich sollte die Ursprungsdatei erhalten bleiben, z. B. unter dem Namen "Plugins.xml.xxx", um den Originalzustand wieder
herstellen zu können. Die Datei kann mit jedem Textverarbeitungsprogramm editiert werde, z. B. mit dem Windows-Editor.
Das Zusatzprogramm öffnet erst SDR#, dann WSJT-X. Danach werden das Hauptfenster und das Grafikfenster von WSJT-X an die
Größe der freien Fläche in SDR# angepasst. Außerdem wird SDR# zum Elternfenster für die beiden WSJTX-Fenster erklärt. Damit
sind alle drei Fenster fest miteinander verknüpft. Wenn z. B. SDR# minimiert wird, verschwinden auch die WSJTX-Fenster und kehren
auch mit SDR# wieder zurück. Zum Starten der Signalverarbeitung in SDR# wird ein Mausklick auf den Startbutton simuliert und das
Gafikfenster zeigt die Signale an. Auch das Fenster "Band Activity" in WSJT-X wird sich mit dekodierten Zeilen füllen.
Die Frequenzänderung wird in WSJT-X vorgenommen. Aus dem Dropdown-Menü neben der Frequenzanzeige das gewünschte neue
Band durch Klick auswählen. WSJT-X aktualisiert sofort eine Statusdatei. Diese Datei wird periodisch (alle 10 ms) vom
Zusatzprogramm auf eine Änderung überprüft. Ist diese Änderung eine Frequenzänderung, wird der neuen Frequenz eine Cursor-
position zugeordnet, die einem der Frequenzeinträge im Frequenzmanager entspricht. Die erforderlichen Cursorpositionen habe ich
vorher mit
Windowse ermittelt, einem für solche Fälle extrem nützlichen Programm. Nun wird ein Doppelklick simuliert und SDR#
übernimmt die neue Frequenz. Natürlich hängt die entsprechende Cursorposition von der Bildschirmgröße und -auflösung ab und
muss individuell ermittelt werden.
Diese Lösung ist zwar nicht die eleganteste, funktioniert aber zuverlässig. Vielleicht gibt es ja irgendwann mal ein Plugin, das die
Kommunikation zwischen einem Fremdprogramm und SDR# ermöglicht, so wie bei HDSDR mit ExtIO.
HDSDR mit ExtIO_AirSpyplus.dll habe ich ausprobiert, das funktioniert. Die Bedienoberfläche von HDSDR gefällt mir aber nicht so gut,
da wirkt SDR# wesentlich aufgeräumter und strukturierter. Auch gab es ein Problem mit der Audioeinstellung.
Deswegen bin ich zu SDR# zurückgekehrt.
Beendet werden beide Programme mit dem Schließen von WSJT-X. SDR# könnte zwar mit PB-Anweisungen beendet werden, dann
werden aber evtl. vorenommene Änderungen nicht abgespeichert. Deshalb wird das Programm mit einem simulierten Klick auf den
Schließen-Button geschlossen.
Wer versehentlich zuerst SDR# schließt, hat dann Probleme beim Neustart. WSJT-X moniert dann, dass noch eine Instanz aktiv ist.
Diese muss mit dem Taskmanager beendet werden.

Das Programm

; WSJT-X mit SDR-Empfänger AIRSPY HF+

EnableExplicit

Enumeration
 #Wnd_Dummy
 #Tmr_Stat
 #WSJTX_Status
EndEnumeration

Define hSDRSharp, hWSJTX, hWdeGrph
Define pSDRSharp, pWSJTX
Define iStatus0, iStatus1
Define Freq0$, Freq1$

Global int1
Global str1$

Procedure SimLClk()
 Define inp.INPUT
 inp      = #INPUT_MOUSE
 inp= #MOUSEEVENTF_LEFTDOWN
 SendInput_(1, @inp, SizeOf(INPUT))
 inp= #MOUSEEVENTF_LEFTUP
 SendInput_(1, @inp, SizeOf(INPUT))
EndProcedure

Procedure ReadStatusFile()
 Repeat
 Until ReadFile(#WSJTX_Status, "C:\Users\RL\AppDat\Local\Temp\WSJT-X\wsjtx_status.txt")
 str1$ = ReadString(#WSJTX_Status)
 CloseFile(#WSJTX_Status)
 int1 = FindString(str1$, ".")
 If int1
   ProcedureReturn
 Else
   ReadStatusFile()
 EndIf
EndProcedure

RenameFile(C:\Users\RL\AppData\Local\WSJT-X\WSJT-X.ini.SDR", "C:\Users\RL\AppData\Local\WSJT-X\WSJT-X.ini")
Delay(500)

Delay(500)

pSDRSharp = RunProgram("C:\Users\RL\Downloads\sdrsharp-x86\SDRSharp.exe", "", "", #PB_Program_Open)

Repeat  
 hSDRSharp = FindWindow_(#Null, "SDR# v1.0.0.1637 - AIRSPY HF+")
Until hSDRSharp

pWSJTX = RunProgram("C:\WSJT\wsjtx\bin\wsjtx.exe", "", "", #PB_Program_Open)

Repeat
hWSJTX = FindWindow_(#Null, "WSJT-X   v1.8.0   by K1JT")
Until hWSJTX

Repeat
 hWdeGrph = FindWindow_(#Null, "WSJT-X - Wide Graph")
Until hWdeGrph

SetParent_(hWSJTX, hSDRSharp)

SetParent_(hWdeGrph, hSDRSharp)

MoveWindow_(hWSJTX, 260, 62, 740, 945, #True)

MoveWindow_(hWdeGrph, 1040, 707, 855, 300, #True)

OpenWindow(#Wnd_Dummy, 0, 0, 0, 0, "", #PB_Window_Invisible)

AddWindowTimer(#Wnd_Dummy, #Tmr_Stat, 10)

SetCursorPos_(75, 64)
SimLClk()
Delay(5)
SetCursorPos_(150, 610)
SimLClk()
Delay(5)
SetCursorPos_(150, 653)
SimLClk()
Delay(5)
SetCursorPos_(900, 500)

Define iStatus0 = GetFileDate("C:\Users\RL\AppData\Local\Temp\WSJT-X\wsjtx_status.txt", #PB_Date_Modified)

ReadStatusFile()
Freq0$ = Left(str1$, int1 - 1)

While ProgramRunning(pWSJTX)
 Select WaitWindowEvent()
   Case #PB_Event_Timer
     Select EventTimer()
       Case #Tmr_Stat
         iStatus1 = GetFileDate("C:\Users\RL\AppData\Local\Temp\WSJT-X\wsjtx_status.txt", #PB_Date_Modified)
         If iStatus1 > iStatus0
           iStatus0 = iStatus1
           ReadStatusFile()
           Freq1$ = Left(str1$, int1 - 1)
           If Freq1$ <> Freq0$
             Freq0$ = Freq1$
             Select Freq1$
               Case "1"
                 SetCursorPos_(180, 680)
               Case "3"
                 SetCursorPos_(180, 704)
               Case "7"
                 SetCursorPos_(180, 728)
               Case "10"
                 SetCursorPos_(180, 752)
               Case "14"
                 SetCursorPos_(180, 776)
               Case "18"
                 SetCursorPos_(180, 800)
               Case "21"
                 SetCursorPos_(180, 824)
               Case "24"
                 SetCursoePos_(180, 848)
               Case "28"
                 SetCursorPos_(180, 872)
             EndSelect
             SimLClk()
             Delay(25)
             SimLClk()
             Delay(5)
             SetCursorPos_(900, 500)
           EndIf
         EndIf
     EndSelect
 EndSelect
Wend

SetCursorPos_(1883, 14)
SimLClk()
RenameFile(C:\Users\RL\AppData\Local\WSJT-X\WSJT-X.ini", "C:\Users\RL\AppData\Local\WSJT-X\WSJT-X.ini.SDR")
End


 
Zurück zum Seiteninhalt | Zurück zum Hauptmenü