Hauptmenü
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-
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-
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
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-
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-
und CABLE Output).
Bild 2
In SDR# ist der Ausgang auf CABLE Input zu legen, in WSJT-
werden ja sowieso zum größten Teil von WSJT-
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-
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-
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-
programmgesteuert zu übertragen.
Zuerst muss SDR# dafür hergerichtet werden. Die Datei "Plugins.xml" im SDR#-
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-
Das Zusatzprogramm öffnet erst SDR#, dann WSJT-
Größe der freien Fläche in SDR# angepasst. Außerdem wird SDR# zum Elternfenster für die beiden WSJTX-
sind alle drei Fenster fest miteinander verknüpft. Wenn z. B. SDR# minimiert wird, verschwinden auch die WSJTX-
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-
Die Frequenzänderung wird in WSJT-
Band durch Klick auswählen. WSJT-
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
übernimmt die neue Frequenz. Natürlich hängt die entsprechende Cursorposition von der Bildschirmgröße 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-
werden aber evtl. vorenommene Änderungen nicht abgespeichert. Deshalb wird das Programm mit einem simulierten Klick auf den
Schließen-
Wer versehentlich zuerst SDR# schließt, hat dann Probleme beim Neustart. WSJT-
Diese muss mit dem Taskmanager beendet werden.
; WSJT-
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-
str1$ = ReadString(#WSJTX_Status)
CloseFile(#WSJTX_Status)
int1 = FindString(str1$, ".")
If int1
ProcedureReturn
Else
ReadStatusFile()
EndIf
EndProcedure
RenameFile(C:\Users\RL\AppData\Local\WSJT-
Delay(500)
Delay(500)
pSDRSharp = RunProgram("C:\Users\RL\Downloads\sdrsharp-
Repeat
hSDRSharp = FindWindow_(#Null, "SDR# v1.0.0.1637 -
Until hSDRSharp
pWSJTX = RunProgram("C:\WSJT\wsjtx\bin\wsjtx.exe", "", "", #PB_Program_Open)
Repeat
hWSJTX = FindWindow_(#Null, "WSJT-
Until hWSJTX
Repeat
hWdeGrph = FindWindow_(#Null, "WSJT-
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-
ReadStatusFile()
Freq0$ = Left(str1$, int1 -
While ProgramRunning(pWSJTX)
Select WaitWindowEvent()
Case #PB_Event_Timer
Select EventTimer()
Case #Tmr_Stat
iStatus1 = GetFileDate("C:\Users\RL\AppData\Local\Temp\WSJT-
If iStatus1 > iStatus0
iStatus0 = iStatus1
ReadStatusFile()
Freq1$ = Left(str1$, int1 -
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-
End