Sdrtst: Unterschied zwischen den Versionen

Aus DXL-Wiki
Zur Navigation springen Zur Suche springen
 
(24 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 3: Zeile 3:
== Beschreibung von sdrtst ==
== Beschreibung von sdrtst ==


sdrtst ist ein AM/FM/SSB Empfänger für rtl_tcp. Es können beliebig viele parallele Empfangskanäle generiert werden, welche sich innerhalb des Frequenzbereiches (Samplerate) des SDR-Empfängers befinden. Frequenzen, Modulationsarten und weitere Parameter werden in einer Konfigurationsdatei abgelegt, welche jederzeit, also auch im laufenden Betrieb, geändert werden kann
sdrtst ist ein AM/FM/SSB Empfänger für rtl_tcp. Es können beliebig viele parallele Empfangskanäle erzeugt werden, welche sich innerhalb des Frequenzbereiches (Samplerate) des SDR-Empfängers befinden. Frequenzen, Modulationsarten und weitere Parameter werden in einer Konfigurationsdatei [[sdrcfg.txt]] abgelegt, welche jederzeit, also auch im laufenden Betrieb, geändert werden kann. Die Ausgabe erfolgt als Audiostream, entweder in eine lokale Audiopipe (mknod pipename p)oder per UDP-Stream auf einen anderen Rechner. Es kann auch stdout/stdin für den lokalen Transport des Streams benutzt werden, anstatt mit einer Audiopipe.
 


== Übersicht der Parameter ==
== Übersicht der Parameter ==
Zeile 11: Zeile 10:


AM/FM/SSB Multirx from rtl_tcp (8 bit IQ via tcpip or file) to audio channel(s) 8/16 bit PCM by oe5dxl
AM/FM/SSB Multirx from rtl_tcp (8 bit IQ via tcpip or file) to audio channel(s) 8/16 bit PCM by oe5dxl
  -A <soundfilename> or <ip:port> ALAW (G.711) n-channel sound stream/pipe/UDP
  -A <soundfilename> or <ip:port> ALAW (G.711) n-channel sound stream pipe/UDP
  -a <number>        maximum active rx to limit cpu load, if number is reached,
  -a <number>        maximum active rx to limit cpu load, if number is reached,
                       no more inactive rx will listen to become active
                       no more inactive rx will listen to become active
Zeile 17: Zeile 16:
  -c <configfilename> read channels config from file (sdrcfg.txt)
  -c <configfilename> read channels config from file (sdrcfg.txt)
  -c <ip:port>        read channels config from UDP, if ip=0.0.0.0 accept any ip
  -c <ip:port>        read channels config from UDP, if ip=0.0.0.0 accept any ip
  -d <Hz>            downsample output to Hz
-D <file>          write received tcp IQ Data to file
  -d <Hz>            downsample if to output Hz by linear interpolation
  -e                  enable sending SDR Data hidden in audio channels (tune/afc/rssi..)
  -e                  enable sending SDR Data hidden in audio channels (tune/afc/rssi..)
-f u8|i16|f32      iq-data format, f32 samplerate 1..3MHz, slow float arithmetic (u8)
  -h                  help
  -h                  help
  -i <Hz>            input sampelrate Hz 1024000 or 2048000..2500000 (2048000)
  -i <Hz>            input sampelrate Hz 1024000 or 2048000..2500000 (2048000)
Zeile 26: Zeile 27:
  -m <audiochannels>  mix up/down all rx channels to 1 or 2 audiochannels (mono/stereo)
  -m <audiochannels>  mix up/down all rx channels to 1 or 2 audiochannels (mono/stereo)
                       for 2 channels the rx audios will be arranged from left to right
                       for 2 channels the rx audios will be arranged from left to right
                      WAV-Header will be preceded (UDP with header may be lost)
  -N <x.x.x.x:destport> send Noise (Squelch) table in UDP to Scanner Scripts (may be repeatet)
  -N <x.x.x.x:destport> send Noise (Squelch) table in UDP to Scanner Scripts (may be repeatet)
  -O <Hz>            moves center freq. away from used band to avoid ADC-DC-offset noise (10000)
  -O <Hz>            moves center freq. away from used band to avoid ADC-DC-offset noise (10000)
  -o <mhz>            offset for entered frequencies if Converters are used
  -o <mhz>            offset for entered frequencies if Converters are used
  -p <cmd> <value>    send rtl_tcp parameter, ppm, tunergain ...
  -p <cmd> <value>    send rtl_tcp parameter, ppm, tunergain ...
  -r <Hz>            output sampelrate Hz for all channels 8000..192000 (16000)
  -r <Hz>            if and default output sampelrate Hz for all channels 8000..256000 (16000)
                       for FM min. 25% more than rx IF-width
                       for FM min. 25% more than rx IF-width
  -s <soundfilename> or <ip:port> 16bit signed n-channel sound stream/pipe/UDP
  -s <soundfilename> or <ip:port> 16bit signed n-channel sound stream/pipe/UDP
Zeile 42: Zeile 44:
  -Z <ms>            same but fast open with no audio quieting for sending
  -Z <ms>            same but fast open with no audio quieting for sending
                       to decoders and not human ears
                       to decoders and not human ears
example: ./sdrtst -k -s /dev/stdout -t 127.0.0.1:1234 -c up.txt -i 2048000 -r 16000 -m 2 -v | sox -t raw -r 16000 -c 2 -b 16 -s - -t alsa
example: ./sdrtst -k -s /dev/stdout -t 127.0.0.1:1234 -c up.txt -i 2048000 -r 16000 -m 2 -v | aplay
        will mix up/down any channels to stereo and play on alsa
          will mix up/down any channels to stereo and play on alsa
         ./sdrtst -k -s /dev/stdout -t 127.0.0.1:1234 -c up.txt -i 2048000 -r 16000 -v | ./afskmodem -o /dev/stdin -s 16000 -c 2 -M 0 -c 0 -M 1 -c 1
         ./sdrtst -k -s /dev/stdout -t 127.0.0.1:1234 -c up.txt -i 2048000 -r 16000 -v | ./afskmodem -o /dev/stdin -s 16000 -c 2 -M 0 -c 0 -M 1 -c 1
        with 2 frequencies in up.txt will listen to PR/APRS on 2 channels
          with 2 frequencies in up.txt will listen to PR/APRS on 2 channels
        nc -l -u -p 7000 | sox -t wav - -t alsa
        ./sdrtst -k -A 127.0.0.1:7000 -m 1 -d 8000 -t 127.0.0.1:1234 -c 0.0.0.0:7001 -i 2048000 -r 16000 -v
        echo -e "f 438.55 5 80 80\nf 439.3 5 80 80" | nc -u 127.0.0.1 7001
          for A-LAW compressed sound via UDP and remote control via UDP


config file: (re-read every some seconds and may be modified any time)
config file: (re-read every some seconds and may be modified any time)
   # comment
   # comment
   p <cmd> <value>  rtl_tcp parameter like 'p 5 50' ppm, 'p 8 1' autogain on
   p <cmd> <value>  rtl_tcp parameter like 'p 5 50' ppm, 'p 8 1' autogain on
   f <mhz> <AFC-range> <squelch%> <lowpass%>  <IF-width>  FM Demodulator
   f <mhz> <AFC-range> <squelch%> <lowpass%>  <IF-width>  FM Demodulator
   a <mhz>  0          <squelch%> <lowpass%>  <IF-width>  AM Demodulator
   a <mhz>  0          <squelch%> <lowpass%>  <IF-width>  AM Demodulator
   u <mhz> <IF-shift>   0        <agc speed> <IF-width>  USB Demodulator
   u <mhz> <IF-shift> <agc limit> <agc speed> <IF-width>  USB Demodulator
   l same for LSB
   l same for LSB
     AFC-range in +-kHz, Squelch 0 off, 100 open, 70 may do
     AFC-range in +-kHz, Squelch 0 off, 100 open, 70 may do
Zeile 59: Zeile 65:
     (192000 only with >=2048khz iq-rate), (4th order IIR)
     (192000 only with >=2048khz iq-rate), (4th order IIR)
     (SSB 8th order IF-IIR), OTHER values with MORE CPU-load (12000 default)
     (SSB 8th order IF-IIR), OTHER values with MORE CPU-load (12000 default)
  q <mhz> <0> <0> <lowpass%> <IF-width> bandwidth filterd iq output with if rate
  s <from-MHz> <to-MHz> <step-Hz> <sleepsteps> <IF-width> low cpu usage scanner
  improof fast IIR-if-filter with a FIR by <IF-width>+<FIR-width>[,<FIR-lenght>] default length=32, max=2048
    works on AM,FM,IQ-demod  f 145.800 0 80 90 12000+10000,64


   example:
   example:
     p 5 50
     p 5 50
     p 8 1
     p 8 1
     f 438.825  5  75 70        (afc, quelch, audio lowpass, 12khz IF)
     f 438.825  5  75 70        (afc, squelch, audio lowpass, 12khz IF)
     f 439.275  0  0  80 20000  (20khz IF, uses more CPU)
     f 439.275  0  0  80 20000  (20khz IF, uses more CPU)
     u 439.5001 -700 0  600     (USB with 600Hz CW-Filter at 800Hz
     u 432.4825 -700 0  2500 600   (USB with 600Hz CW-Filter at 800Hz slow agc


   will generate 3 channel 16bit PCM stream (up to 64 channels with -z or -Z)
   will generate 3 channel 16bit PCM stream (up to 64 channels with -z or -Z)
Zeile 73: Zeile 83:


     f 100.1 0 0 15 96000          (WFM with "-r 192000 -d 44100" for 1 channnel 44100hz
     f 100.1 0 0 15 96000          (WFM with "-r 192000 -d 44100" for 1 channnel 44100hz
</nowiki>
== Ausführliche Beschreibung der Parameter ==
{| class="wikitable"
|-
! Parameter!! Beschreibung
|-
| A <soundfilename> or <ip:port> || Quelle eines n-Kanal Audiostreams (z.B. Pipe, UDP) im Format ALAW (G.711).
|-
| a <number>|| Maximale Anzahl an Empfängern um die CPU Last zu begrenzen.
|-
| B <samples>|| Gleichzeitig gesendete sound samples. Mit UDP aufgepasst: doppelte Anzahl an Bytes mit 16 bit PCM.
|-
| c <configfilename>|| Lese Channel Konfiguration aus einer Datei, z.B. [[sdrcfg.txt]].
|-
| c <ip:port>|| Lese Channel Konfiguration per UDP. Wenn ip=0.0.0.0 werden Informationen von jeder Quell-IP zugelassen.
|-
| d <Hz>|| Downsampling des Outputs auf d Hz.
|-
| e|| Aktiviere das Senden von versteckten SDR Informationen im Audiostream (Freuqenz/AFC/Feldstärke etc.)
|-
| f u8/i16/d32|| IQ-Datenformat, f32 Samlerate 1..3 MHz, langsame Fließkomma Arithmetik. Standard = u8.
|-
| h|| Hilfetext
|-
| i <Hz>|| Abtastfrequenz (samplerate) des Inputs in Hz. Standard = 2048000<br>1024000 oder 2048000..2500000<br>Wenn i > 2048000, erhöht sich die AM/FM-ZF-Bandbreite proportional.
|-
| k|| Verbindung halten. Wenn die Verbindung zum rtl_tcp Server abbricht, wird eine Wiederverbindung versucht.
|-
| L <x.x.x.x:destport>|| Sende Level Tabelle in UDP zu Wasserfall-Viewern ([[waterfall.py]]). Kann wiederholt werden.
|-
| m <audiochannels>|| Mische alle Empfangskanäle zu einem oder zwei Audiokanälen (Mono/Stereo) zusammen. Die Kanäle werden von links nach recht angeordnet. WAV-Header werden vorangestellt (UDP mit Header kann verlorengehen).
|-
| N <x.x.x.x:destport>|| Sende Rauschtabelle (Squelch) in UDP zu Scanner Scripts (kann wiederholt werden)
|-
| O <Hz>|| Verändert die Mittenfrequenz des SDR um den Wert O Hz um den ADC-DC Störträger zu verschieben. Standard = 10000 Hz = 10 KHz.
|-
| o <mhz>|| Frequenzoffset für die angegebene Frequenzen. Dies wird bei der Nutzung von Konvertern benötigt.
|-
| p <cmd> <value>|| Sende Parameter an rtl_tcp, z.B. ppm, tunergain ...
|-
| r <Hz>|| Ausgangs-Abtastfrequenz (Sampelrate) in Hz für alle Kanäle. Mögliche Werte 8000..192000. Standard = 16000. Für FM muss die Abtastrate mindestens 25% höher sein als die in der [[sdrcfg.txt]] angegebene ZF-Bandbreite des Kanals.
|-
| s <soundfilename> or <ip:port>|| Quelle eines 16bit n-Kanal Audiostreams (z.B. Pipe, UDP).
|-
| S <soundfilename> or <ip:port>|| Quelle eines 8bit n-Kanal Audiostreams (z.B. Pipe, UDP).
|-
| T <mhz>|| Tune manuell zur Mitte des IQ-Bandes (für IQ-Daten aus einer Datei)). Standard = 0
|-
| t <url:port>|| Verbindung zum rtl_tcp Server. Standard = 127.0.0.1:1234.
|-
| t <filename:0>|| Lese den digitalen Datenstrom aus einer Datei.
|-
| v|| Zeige Feldstärke in dB (rssi) und Frequenzabweichung in kHz (AFC).
|-
| w <ms>|| Maximale Wach-Zeit in ms nach Schließen der Rauschsperre. Beschäftigt solange noch die CPU. Standard = 2000 ms.
|-
| z <ms>|| Schlaf-Zeit in ms ohne CPU Belastung für inaktive RXe während die Rauschsperre geschlossen ist. Beispiel: -z 100.
|-
| Z <ms>|| Das gleiche wie -z, jedoch schnelle Öffnung ohne Stummschaltung zum Senden an Dekoder, und nicht fürs menschliche Gehör.
|}
== Beispiele ==
=== Wettersonden RX oder APRS RX ===
Die Syntax kann sowohl für einen Sonden-RX als auch für einen APRS-RX in dieser Form verwendet werden. Das folgende Beispiel ist auf einen Sonden-RX abgestimmt.
<nowiki>
sdrtst -t 127.0.0.1:18100 -r 16000 -s sondepipe0 -Z 100 -c sdrcfg0.txt -e -k -v
</nowiki>
Diese Zeile startet den Empfänger am angegebenen SDR-Stick. Die empfangenen Signale werden in eine sogenannte „Audiopipe“ geschickt. Dabei handelt es sich um eine Art Transferdatei, die es ermöglicht die Audioinformationen von einem Programm zum anderen zu transferieren. Diese muss vorher angelegt worden sein mit  mknod sondepipe0 p  .


In der Datei [[Sdrcfg.txt|sdrcfg0.txt]] erfährt der Empfänger, auf welchen Frequenzen er hören soll. Für jede Frequenz wird dort eine eigene Zeile angelegt.
Inhalt sdrcfg0.txt:
<nowiki>
#-----------------------------------------------------------------------------------------------------
# sdrcfg0.txt - von DL1NUX 14.04.2020: Keine Tab-Stops bei der Nutzung von Auskommentierungen (#)!!!
# Diese Datei ggf. je nach anzahl der verwendeten Sticks kopieren und durchnummerieren: sdrcfg0.txt, sdrcfg1.txt usw.
# Original von OE3OSB
#-----------------------------------------------------------------------------------------------------
#
#  p <cmd> <value>  rtl_tcp parameter like 'p 5 50' ppm, 'p 8 1' autogain on
#  f <mhz> <AFC-range> <squelch%> <lowpass%>  <IF-width>  FM Demodulator
#  a <mhz>  0          <squelch%> <lowpass%>  <IF-width>  AM Demodulator
#  u <mhz> <IF-shift>  0        <agc speed> <IF-width>  USB Demodulator
#  l same for LSB
#    AFC-Bereich in +-kHz, Squelch 0 aus, 100 offen, 70 ist normal
#    Audio Tiefpass in % Nyquist Ausgabefrequenz Sampelrate, 0 is aus
#    IF-width 3000 6000 12000 24000 48000 96000 192000Hz für wenig CPU Auslastung
#    (192000 nur mit >=2048khz iq-rate), (4th order IIR)
#    (SSB 8th order IF-IIR), Andere Werte haben mehr CPU-Last (12000 default)
#-----------------------------------------------------------------------------------------------------
# Parameter für SDR Stick:
# p 5 = Frequenz Offset in PPM - Sticks mit TCXO benötigen die syntax p 5 0
#      Bei allen anderen Sticks ohne TCXO muss die Frequenzabweichung in PPM berechnet werden
#      z.B.: https://github.com/ptrkrysik/gr-gsm/wiki/Installation-on-RaspberryPi-3
#      Wenn Ihnen die PPM für den Stick bekannt ist, hängen Sie ihn hier an: p 5 ppm
#      Korrekte Syntax für ppm 50 ist p 5 50
p 5 0
#
# p 8 = Automatic Gain Control (AGC)
#      p 8 1 = AGC an  / p 8 0 = AGC aus
p 8 1
#-----------------------------------------------------------------------------------------------------
# Einstellen der Sondenfrequenz(en) (Wichtig: Als MHz-Trennung einen Punkt verwenden, und KEIN Komma (403.0 anstatt 403,0)
# f <mhz> <AFC-range> <squelch%> <lowpass%>  <IF-width>
# f 405.31 5 65 0 6000    # Einstellung für DFM Sonden
# f 402.70 5 70 0 12000  # Einstellung für Sonstige Sonden (RS41, RS92 etc.)
# f 403.00 8 80 0 20000  # Einstellung für M10 Sonden
# Bei M10 Empfang unbedingt auch die Samplerate bei sdrtst und sondeudp auf mindestens 20000Hz erhöhen!
#-----------------------------------------------------------------------------------------------------
# Wichtig: Die SDR Sticks haben nur etwa 2 MHz Bandbreite!
# Wenn Sie mehrere Frequenzen überwachen, sollten diese nicht mehr wie 2 MHz auseinander liegen
# Bei den gewünschten Frequenzen die Auskommentierung "#" entfernen.
# Frequenzen können nach Bedarf ergänzt oder angepasst werden.
# Auf einem RaspberryPi können locker 8 Frequenzen pro SDR-Stick gleichzeitig überwacht werden (bei 2 Sticks) (abhängig von CPU-Leistung!)
f 402.300 5 70 0 12000
f 402.500 5 70 0 12000
f 402.700 5 70 0 12000
f 402.900 5 70 0 12000
f 403.000 5 70 0 12000
f 403.330 5 65 0 6000
f 403.800 5 70 0 12000
f 403.900 5 70 0 12000
f 404.100 5 70 0 12000
</nowiki>
</nowiki>
== Detaillierte Erläuterung der Parameter ==
Erklärung zur sdrcfg0.txt:


== Beispiele ==
* Wir benutzen einen Stick mit TCXO und benötigen keine Frequenzkorrektur (p 5 0), die AGC ist an (p 8). Es können auch weitere SDR Parameter für rtl_tcp hier angegeben werden.
* Sondenempfangsfrequenzen werden nach Bedarf ans Ende der Datei eingetragen, je eine pro Zeile. Es sind drei Frequenzbeispiele aufgeführt. Die Parameter AFC-Range, Squelsh, Lowpass und IF-Width sind eine Empfehlung von Chris OE5DXL je nach Sondentyp. Die Eingabe erfolgt ohne die Raute # am Anfang.
 
Die Parameter:
* -t <url:port> = connect rtl_tcp server
* -r <Hz> = Output sampelrate Hz for all channels 8000..192000. For FM min. 25% more than rx IF-width
* -s <soundfilename> = 16bit signed n-channel sound stream/pipe
* -Z = sleep time (no cpu) for inactive rx if squelch closed (-z 100), fast open with no audio quieting for sending
* -c <configfilename> = Read channels config from file
* -e = enable sending SDR Data hidden in audio channels (tune/afc/rssi..)
* -k = keep connection
* -v = Show rssi (dB) and afc (khz)
 
Erklärung:
 
* Wir connecten uns an den rtl_tcp Server (-t), den wir mit „rtl_tcp“ initialisiert haben mit einer Abtastrate von 16 KHz (-r). Wenn man Sonden vom Typ M10 empfangen möchte, muss hier und beim sondeudp die Abtastrate auf mindestens 20 KHz erhöht werden! Aber Achtung, dadurch entsteht höhere CPU-Last!
* Als Bindeglied zu sondeudp dient die zuvor erstellte Pipe „sondepipe0“ (-s)
* Der Parameter -Z spart CPU-Auslastung, wenn die Rauschsperre geschlossen ist auf einzelnen Kanälen
* Die Frequenzen bzw. Frequenzparameter sind in der Datei „sdrcfg0.txt“ zu finden (-c).
* Nützliche Daten über das Empfangssignal (RSSI, AFC usw.) können mit -e an sondeudp weitergegeben werden.
* „Keep connection“ soll dafür sorgen, dass sdrtst die TCP-verbindung zu rtl_tcp neu startet wenn sie versehentlich beendet wird. Dies kann z.B. dann passieren, wenn der SDR Stick in der USB Buchse bewegt wird.
* Mit -v wird die Signalstärke in dB und die AFC Abweichung in KHz des Signals mit ausgegeben.

Aktuelle Version vom 11. September 2022, 18:16 Uhr

!!! Wiki Artikel ist noch in Arbeit !!!

Beschreibung von sdrtst

sdrtst ist ein AM/FM/SSB Empfänger für rtl_tcp. Es können beliebig viele parallele Empfangskanäle erzeugt werden, welche sich innerhalb des Frequenzbereiches (Samplerate) des SDR-Empfängers befinden. Frequenzen, Modulationsarten und weitere Parameter werden in einer Konfigurationsdatei sdrcfg.txt abgelegt, welche jederzeit, also auch im laufenden Betrieb, geändert werden kann. Die Ausgabe erfolgt als Audiostream, entweder in eine lokale Audiopipe (mknod pipename p)oder per UDP-Stream auf einen anderen Rechner. Es kann auch stdout/stdin für den lokalen Transport des Streams benutzt werden, anstatt mit einer Audiopipe.

Übersicht der Parameter

sdrtst -h

AM/FM/SSB Multirx from rtl_tcp (8 bit IQ via tcpip or file) to audio channel(s) 8/16 bit PCM by oe5dxl
 -A <soundfilename> or <ip:port> ALAW (G.711) n-channel sound stream pipe/UDP
 -a <number>         maximum active rx to limit cpu load, if number is reached,
                       no more inactive rx will listen to become active
 -B <samples>        sound samples sent at once. With UDP take care: double number of bytes with 16bit PCM
 -c <configfilename> read channels config from file (sdrcfg.txt)
 -c <ip:port>        read channels config from UDP, if ip=0.0.0.0 accept any ip
 -D <file>           write received tcp IQ Data to file
 -d <Hz>             downsample if to output Hz by linear interpolation
 -e                  enable sending SDR Data hidden in audio channels (tune/afc/rssi..)
 -f u8|i16|f32       iq-data format, f32 samplerate 1..3MHz, slow float arithmetic (u8)
 -h                  help
 -i <Hz>             input sampelrate Hz 1024000 or 2048000..2500000 (2048000)
                       if >2048000, AM/FM-IF-width will increase proportional
 -k                  keep connection, reconnect lost connection to rtl_tcp server
 -L <x.x.x.x:destport> send Level table in UDP to Waterfall Viewers (may be repeatet)
 -m <audiochannels>  mix up/down all rx channels to 1 or 2 audiochannels (mono/stereo)
                      for 2 channels the rx audios will be arranged from left to right
                      WAV-Header will be preceded (UDP with header may be lost)
 -N <x.x.x.x:destport> send Noise (Squelch) table in UDP to Scanner Scripts (may be repeatet)
 -O <Hz>             moves center freq. away from used band to avoid ADC-DC-offset noise (10000)
 -o <mhz>            offset for entered frequencies if Converters are used
 -p <cmd> <value>    send rtl_tcp parameter, ppm, tunergain ...
 -r <Hz>             if and default output sampelrate Hz for all channels 8000..256000 (16000)
                       for FM min. 25% more than rx IF-width
 -s <soundfilename> or <ip:port> 16bit signed n-channel sound stream/pipe/UDP
 -S <soundfilename> or <ip:port> 8bit unsigned n-channel sound stream/pipe/UDP
 -T <mhz>            Tune manual to center of iq-band (for iq-data from file) (0)
 -t <url:port>       connect rtl_tcp server (127.0.0.1:1234)
 -t <filename:0>     read iq-data from file
 -v                  show rssi (dB) and afc (khz)
 -w <ms>             max stay awake (use CPU) time after squelch close (2000)
 -z <ms>             sleep time (no cpu) for inactive rx if squelch closed (-z 100)
 -Z <ms>             same but fast open with no audio quieting for sending
                      to decoders and not human ears
example: ./sdrtst -k -s /dev/stdout -t 127.0.0.1:1234 -c up.txt -i 2048000 -r 16000 -m 2 -v | aplay
           will mix up/down any channels to stereo and play on alsa
         ./sdrtst -k -s /dev/stdout -t 127.0.0.1:1234 -c up.txt -i 2048000 -r 16000 -v | ./afskmodem -o /dev/stdin -s 16000 -c 2 -M 0 -c 0 -M 1 -c 1
           with 2 frequencies in up.txt will listen to PR/APRS on 2 channels
         nc -l -u -p 7000 | sox -t wav - -t alsa
         ./sdrtst -k -A 127.0.0.1:7000 -m 1 -d 8000 -t 127.0.0.1:1234 -c 0.0.0.0:7001 -i 2048000 -r 16000 -v
         echo -e "f 438.55 5 80 80\nf 439.3 5 80 80" | nc -u 127.0.0.1 7001
           for A-LAW compressed sound via UDP and remote control via UDP

config file: (re-read every some seconds and may be modified any time)
  # comment
  p <cmd> <value>  rtl_tcp parameter like 'p 5 50' ppm, 'p 8 1' autogain on
  f <mhz> <AFC-range> <squelch%>  <lowpass%>  <IF-width>  FM Demodulator
  a <mhz>  0          <squelch%>  <lowpass%>  <IF-width>  AM Demodulator
  u <mhz> <IF-shift>  <agc limit> <agc speed> <IF-width>  USB Demodulator
  l same for LSB
    AFC-range in +-kHz, Squelch 0 off, 100 open, 70 may do
    audio lowpass in % Nyquist frequ. of output sampelrate, 0 is off
    IF-width 3000 6000 12000 24000 48000 96000 192000Hz for low CPU usage
    (192000 only with >=2048khz iq-rate), (4th order IIR)
    (SSB 8th order IF-IIR), OTHER values with MORE CPU-load (12000 default)
  q <mhz> <0> <0> <lowpass%> <IF-width> bandwidth filterd iq output with if rate
  s <from-MHz> <to-MHz> <step-Hz> <sleepsteps> <IF-width> low cpu usage scanner
  improof fast IIR-if-filter with a FIR by <IF-width>+<FIR-width>[,<FIR-lenght>] default length=32, max=2048
    works on AM,FM,IQ-demod  f 145.800 0 80 90 12000+10000,64

  example:
    p 5 50
    p 8 1
    f 438.825   5   75 70         (afc, squelch, audio lowpass, 12khz IF)
    f 439.275   0   0  80 20000   (20khz IF, uses more CPU)
    u 432.4825 -700 0  2500 600   (USB with 600Hz CW-Filter at 800Hz slow agc

  will generate 3 channel 16bit PCM stream (up to 64 channels with -z or -Z)
  use max. 95% of -i span. rtl-stick will be tuned to center of the span
  rx in center of band will be +-10khz relocated to avoid ADC-DC offset pseudo
  carriers, SSB-only will be relocated 10..210khz to avoid inexact tuning steps

    f 100.1 0 0 15 96000          (WFM with "-r 192000 -d 44100" for 1 channnel 44100hz

Ausführliche Beschreibung der Parameter

Parameter Beschreibung
A <soundfilename> or <ip:port> Quelle eines n-Kanal Audiostreams (z.B. Pipe, UDP) im Format ALAW (G.711).
a <number> Maximale Anzahl an Empfängern um die CPU Last zu begrenzen.
B <samples> Gleichzeitig gesendete sound samples. Mit UDP aufgepasst: doppelte Anzahl an Bytes mit 16 bit PCM.
c <configfilename> Lese Channel Konfiguration aus einer Datei, z.B. sdrcfg.txt.
c <ip:port> Lese Channel Konfiguration per UDP. Wenn ip=0.0.0.0 werden Informationen von jeder Quell-IP zugelassen.
d <Hz> Downsampling des Outputs auf d Hz.
e Aktiviere das Senden von versteckten SDR Informationen im Audiostream (Freuqenz/AFC/Feldstärke etc.)
f u8/i16/d32 IQ-Datenformat, f32 Samlerate 1..3 MHz, langsame Fließkomma Arithmetik. Standard = u8.
h Hilfetext
i <Hz> Abtastfrequenz (samplerate) des Inputs in Hz. Standard = 2048000
1024000 oder 2048000..2500000
Wenn i > 2048000, erhöht sich die AM/FM-ZF-Bandbreite proportional.
k Verbindung halten. Wenn die Verbindung zum rtl_tcp Server abbricht, wird eine Wiederverbindung versucht.
L <x.x.x.x:destport> Sende Level Tabelle in UDP zu Wasserfall-Viewern (waterfall.py). Kann wiederholt werden.
m <audiochannels> Mische alle Empfangskanäle zu einem oder zwei Audiokanälen (Mono/Stereo) zusammen. Die Kanäle werden von links nach recht angeordnet. WAV-Header werden vorangestellt (UDP mit Header kann verlorengehen).
N <x.x.x.x:destport> Sende Rauschtabelle (Squelch) in UDP zu Scanner Scripts (kann wiederholt werden)
O <Hz> Verändert die Mittenfrequenz des SDR um den Wert O Hz um den ADC-DC Störträger zu verschieben. Standard = 10000 Hz = 10 KHz.
o <mhz> Frequenzoffset für die angegebene Frequenzen. Dies wird bei der Nutzung von Konvertern benötigt.
p <cmd> <value> Sende Parameter an rtl_tcp, z.B. ppm, tunergain ...
r <Hz> Ausgangs-Abtastfrequenz (Sampelrate) in Hz für alle Kanäle. Mögliche Werte 8000..192000. Standard = 16000. Für FM muss die Abtastrate mindestens 25% höher sein als die in der sdrcfg.txt angegebene ZF-Bandbreite des Kanals.
s <soundfilename> or <ip:port> Quelle eines 16bit n-Kanal Audiostreams (z.B. Pipe, UDP).
S <soundfilename> or <ip:port> Quelle eines 8bit n-Kanal Audiostreams (z.B. Pipe, UDP).
T <mhz> Tune manuell zur Mitte des IQ-Bandes (für IQ-Daten aus einer Datei)). Standard = 0
t <url:port> Verbindung zum rtl_tcp Server. Standard = 127.0.0.1:1234.
t <filename:0> Lese den digitalen Datenstrom aus einer Datei.
v Zeige Feldstärke in dB (rssi) und Frequenzabweichung in kHz (AFC).
w <ms> Maximale Wach-Zeit in ms nach Schließen der Rauschsperre. Beschäftigt solange noch die CPU. Standard = 2000 ms.
z <ms> Schlaf-Zeit in ms ohne CPU Belastung für inaktive RXe während die Rauschsperre geschlossen ist. Beispiel: -z 100.
Z <ms> Das gleiche wie -z, jedoch schnelle Öffnung ohne Stummschaltung zum Senden an Dekoder, und nicht fürs menschliche Gehör.

Beispiele

Wettersonden RX oder APRS RX

Die Syntax kann sowohl für einen Sonden-RX als auch für einen APRS-RX in dieser Form verwendet werden. Das folgende Beispiel ist auf einen Sonden-RX abgestimmt.

sdrtst -t 127.0.0.1:18100 -r 16000 -s sondepipe0 -Z 100 -c sdrcfg0.txt -e -k -v

Diese Zeile startet den Empfänger am angegebenen SDR-Stick. Die empfangenen Signale werden in eine sogenannte „Audiopipe“ geschickt. Dabei handelt es sich um eine Art Transferdatei, die es ermöglicht die Audioinformationen von einem Programm zum anderen zu transferieren. Diese muss vorher angelegt worden sein mit mknod sondepipe0 p .

In der Datei sdrcfg0.txt erfährt der Empfänger, auf welchen Frequenzen er hören soll. Für jede Frequenz wird dort eine eigene Zeile angelegt.

Inhalt sdrcfg0.txt:

#-----------------------------------------------------------------------------------------------------
# sdrcfg0.txt - von DL1NUX 14.04.2020: Keine Tab-Stops bei der Nutzung von Auskommentierungen (#)!!!
# Diese Datei ggf. je nach anzahl der verwendeten Sticks kopieren und durchnummerieren: sdrcfg0.txt, sdrcfg1.txt usw.
# Original von OE3OSB
#-----------------------------------------------------------------------------------------------------
# 
#  p <cmd> <value>  rtl_tcp parameter like 'p 5 50' ppm, 'p 8 1' autogain on
#  f <mhz> <AFC-range> <squelch%> <lowpass%>  <IF-width>  FM Demodulator
#  a <mhz>  0          <squelch%> <lowpass%>  <IF-width>  AM Demodulator
#  u <mhz> <IF-shift>   0         <agc speed> <IF-width>  USB Demodulator
#  l same for LSB
#    AFC-Bereich in +-kHz, Squelch 0 aus, 100 offen, 70 ist normal
#    Audio Tiefpass in % Nyquist Ausgabefrequenz Sampelrate, 0 is aus
#    IF-width 3000 6000 12000 24000 48000 96000 192000Hz für wenig CPU Auslastung
#    (192000 nur mit >=2048khz iq-rate), (4th order IIR)
#    (SSB 8th order IF-IIR), Andere Werte haben mehr CPU-Last (12000 default)
#-----------------------------------------------------------------------------------------------------
# Parameter für SDR Stick:
# p 5 = Frequenz Offset in PPM - Sticks mit TCXO benötigen die syntax p 5 0
#       Bei allen anderen Sticks ohne TCXO muss die Frequenzabweichung in PPM berechnet werden
#       z.B.: https://github.com/ptrkrysik/gr-gsm/wiki/Installation-on-RaspberryPi-3
#       Wenn Ihnen die PPM für den Stick bekannt ist, hängen Sie ihn hier an: p 5 ppm
#       Korrekte Syntax für ppm 50 ist p 5 50
p 5 0
#
# p 8 = Automatic Gain Control (AGC) 
#      p 8 1 = AGC an  / p 8 0 = AGC aus
p 8 1
#-----------------------------------------------------------------------------------------------------
# Einstellen der Sondenfrequenz(en) (Wichtig: Als MHz-Trennung einen Punkt verwenden, und KEIN Komma (403.0 anstatt 403,0)
# f <mhz> <AFC-range> <squelch%> <lowpass%>  <IF-width>
# f 405.31 5 65 0 6000    # Einstellung für DFM Sonden
# f 402.70 5 70 0 12000   # Einstellung für Sonstige Sonden (RS41, RS92 etc.)
# f 403.00 8 80 0 20000   # Einstellung für M10 Sonden
# Bei M10 Empfang unbedingt auch die Samplerate bei sdrtst und sondeudp auf mindestens 20000Hz erhöhen!
#-----------------------------------------------------------------------------------------------------
# Wichtig: Die SDR Sticks haben nur etwa 2 MHz Bandbreite!
# Wenn Sie mehrere Frequenzen überwachen, sollten diese nicht mehr wie 2 MHz auseinander liegen
# Bei den gewünschten Frequenzen die Auskommentierung "#" entfernen. 
# Frequenzen können nach Bedarf ergänzt oder angepasst werden.
# Auf einem RaspberryPi können locker 8 Frequenzen pro SDR-Stick gleichzeitig überwacht werden (bei 2 Sticks) (abhängig von CPU-Leistung!)

f 402.300 5 70 0 12000
f 402.500 5 70 0 12000
f 402.700 5 70 0 12000
f 402.900 5 70 0 12000
f 403.000 5 70 0 12000
f 403.330 5 65 0 6000

f 403.800 5 70 0 12000
f 403.900 5 70 0 12000
f 404.100 5 70 0 12000

Erklärung zur sdrcfg0.txt:

  • Wir benutzen einen Stick mit TCXO und benötigen keine Frequenzkorrektur (p 5 0), die AGC ist an (p 8). Es können auch weitere SDR Parameter für rtl_tcp hier angegeben werden.
  • Sondenempfangsfrequenzen werden nach Bedarf ans Ende der Datei eingetragen, je eine pro Zeile. Es sind drei Frequenzbeispiele aufgeführt. Die Parameter AFC-Range, Squelsh, Lowpass und IF-Width sind eine Empfehlung von Chris OE5DXL je nach Sondentyp. Die Eingabe erfolgt ohne die Raute # am Anfang.

Die Parameter:

  • -t <url:port> = connect rtl_tcp server
  • -r <Hz> = Output sampelrate Hz for all channels 8000..192000. For FM min. 25% more than rx IF-width
  • -s <soundfilename> = 16bit signed n-channel sound stream/pipe
  • -Z = sleep time (no cpu) for inactive rx if squelch closed (-z 100), fast open with no audio quieting for sending
  • -c <configfilename> = Read channels config from file
  • -e = enable sending SDR Data hidden in audio channels (tune/afc/rssi..)
  • -k = keep connection
  • -v = Show rssi (dB) and afc (khz)

Erklärung:

  • Wir connecten uns an den rtl_tcp Server (-t), den wir mit „rtl_tcp“ initialisiert haben mit einer Abtastrate von 16 KHz (-r). Wenn man Sonden vom Typ M10 empfangen möchte, muss hier und beim sondeudp die Abtastrate auf mindestens 20 KHz erhöht werden! Aber Achtung, dadurch entsteht höhere CPU-Last!
  • Als Bindeglied zu sondeudp dient die zuvor erstellte Pipe „sondepipe0“ (-s)
  • Der Parameter -Z spart CPU-Auslastung, wenn die Rauschsperre geschlossen ist auf einzelnen Kanälen
  • Die Frequenzen bzw. Frequenzparameter sind in der Datei „sdrcfg0.txt“ zu finden (-c).
  • Nützliche Daten über das Empfangssignal (RSSI, AFC usw.) können mit -e an sondeudp weitergegeben werden.
  • „Keep connection“ soll dafür sorgen, dass sdrtst die TCP-verbindung zu rtl_tcp neu startet wenn sie versehentlich beendet wird. Dies kann z.B. dann passieren, wenn der SDR Stick in der USB Buchse bewegt wird.
  • Mit -v wird die Signalstärke in dB und die AFC Abweichung in KHz des Signals mit ausgegeben.