SDR auf den Pi: Generieren von Wasserfall Diagrammen mit rtl_power und heatmap.py nicht nur für ACARS Frequenzen

Erstellt am 11. Januar 2019 von It_berater

Mit einem SDR kann man Frequenzen überwachen. Mit rtl_power kann man dann CSV Dateien schreiben und diese dann mit einem Python Script in eine schöne übersichtliche Wasserfall Grafik umwandeln. Da kann man dann leicht sehen was für Aktivität auf den jeweiligen Frequenzen los war. Hier in Hannover ist halt nicht so viel los. Und das alles auf einen kleine Raspberry Pi.

Ich hatte vor einem Jahr schon mal davon berichtet, wie das mit meinem Java Programm geht. Nun wollte ich mal das Python Script ausprobieren was ich auf GitHub gefunden habe.

Wir nehmen mal die ACARS Frequenzen, andere siehe in dieser Tabelle.

Hier ein Auszug was so auf den Frequenzen läuft:

131,525 	  	  	ACARS Europa Sekundär
131,725 	  	  	ACARS Europa Primär
131,825 	  	  	ACARS Europa Sekundär

Wir starte rtl_power im Frequenzbereich 131 MHz bis 132 MHz, schreiben alle 10 Sekunden das Ergebnis in 1 KHz Schritten in die airband-131.000-131.999M-1k-12h.csv Datei und lassen das ganze 12 Stunden laufen. Als Korrekturfaktor gebe ich 48 ppm mit, das ist für andere Sticks natürlich ein anderer Wert, kann aber auch weggelassen werden.

rtl_power -f 131.000M:131.999M:1k -g 30 -i 10 -e 12h -p 48 airband-131.000-131.999M-1k-12h.csv

Dann wandeln wir die erzeugte CSV Datei mit dem Pyton Script heatmap.py um. Wir schreiben alle 15 Minuten für die Y-Achse einen Zeit-Label und verwende die twente Palette, die gefällt mir am Besten:

python heatmap.py --ytick 15 --palette twente airband-131.000-131.999M-1k-12h.csv airband-131.000-131.999M-1k-12h-besch-twent.jpg

An dem Diagramm sehen wir auch, das der Scann-Prozess nach 3 Stunden abgebrochen ist. Aber drei Stunden reichen auch:

Es können auch noch andere Paletten verwendet werden:

Z.B. extended:

oder charolastra:

oder ohne Beschriftung:

Hier noch die Anleitung und Parameter zu dem Script:

python heatmap.py -h
loading
usage: heatmap.py [-h] [--offset OFFSET_FREQ] [--ytick TIME_TICK]
                  [--db DB_LIMIT DB_LIMIT] [--compress COMPRESS]
                  [--low LOW_FREQ] [--high HIGH_FREQ] [--begin BEGIN_TIME]
                  [--end END_TIME] [--head HEAD_TIME] [--tail TAIL_TIME]
                  [--palette PALETTE]
                  INPUT OUTPUT

Convert rtl_power CSV files into graphics.

positional arguments:
  INPUT                 Input CSV file. (may be a .csv.gz)
  OUTPUT                Output image. (various extensions supported)

optional arguments:
  -h, --help            show this help message and exit
  --offset OFFSET_FREQ  Shift the entire frequency range, for up/down
                        converters.
  --ytick TIME_TICK     Place ticks along the Y axis every N
                        seconds/minutes/hours/days.
  --db DB_LIMIT DB_LIMIT
                        Minimum and maximum db values.
  --compress COMPRESS   Apply a gradual asymptotic time compression. Values >
                        1 are the new target height, values < 1 are a scaling
                        factor.
  --palette PALETTE     Set Color Palette: default, extended, charolastra,
                        twente

Slicing:
  Efficiently render a portion of the data. (optional) Frequencies can take
  G/M/k suffixes. Timestamps look like "YYYY-MM-DD HH:MM:SS" Durations take
  d/h/m/s suffixes.

  --low LOW_FREQ        Minimum frequency for a subrange.
  --high HIGH_FREQ      Maximum frequency for a subrange.
  --begin BEGIN_TIME    Timestamp to start at.
  --end END_TIME        Timestamp to stop at.
  --head HEAD_TIME      Duration to use, starting at the beginning.
  --tail TAIL_TIME      Duration to use, stopping at the end.

Und für rtl_power:

rtl_power -h
rtl_power, a simple FFT logger for RTL2832 based DVB-T receivers

Use:	rtl_power -f freq_range [-options] [filename]
	-f lower:upper:bin_size [Hz]
	 (bin size is a maximum, smaller more convenient bins
	  will be used.  valid range 1Hz - 2.8MHz)
	[-i integration_interval (default: 10 seconds)]
	 (buggy if a full sweep takes longer than the interval)
	[-1 enables single-shot mode (default: off)]
	[-e exit_timer (default: off/0)]
	[-d device_index (default: 0)]
	[-g tuner_gain (default: automatic)]
	[-p ppm_error (default: 0)]
	[-T enable bias-T on GPIO PIN 0 (works for rtl-sdr.com v3 dongles)]
	filename (a '-' dumps samples to stdout)
	 (omitting the filename also uses stdout)

Experimental options:
	[-w window (default: rectangle)]
	 (hamming, blackman, blackman-harris, hann-poisson, bartlett, youssef)
	[-c crop_percent (default: 0%, recommended: 20%-50%)]
	 (discards data at the edges, 100% discards everything)
	 (has no effect for bins larger than 1MHz)
	[-F fir_size (default: disabled)]
	 (enables low-leakage downsample filter,
	  fir_size can be 0 or 9.  0 has bad roll off,
	  try with '-c 50%')
	[-P enables peak hold (default: off)]
	[-D enable direct sampling (default: off)]
	[-O enable offset tuning (default: off)]

CSV FFT output columns:
	date, time, Hz low, Hz high, Hz step, samples, dbm, dbm, ...

Examples:
	rtl_power -f 88M:108M:125k fm_stations.csv
	 (creates 160 bins across the FM band,
	  individual stations should be visible)
	rtl_power -f 100M:1G:1M -i 5m -1 survey.csv
	 (a five minute low res scan of nearly everything)
	rtl_power -f ... -i 15m -1 log.csv
	 (integrate for 15 minutes and exit afterwards)
	rtl_power -f ... -e 1h | gzip > log.csv.gz
	 (collect data for one hour and compress it on the fly)

Convert CSV to a waterfall graphic with:
	 http://kmkeen.com/tmp/heatmap.py.txt

Das Python Script gibt es auf GitHub. Weiter Infos hier auf dem Block.

Ähnliche Artikel:

  1. Heatmap mit Raspberry Pi Zero W und gopow erzeugen
  2. SDR: Fix rtl_power: symbol lookup error: rtl_power: undefined symbol: rtlsdr_set_bias_tee für Raspberry Pi
  3. TWPlotter: Java Wasserfall Diagramme Generierung von rtl_power erzeugten CSV-Dateien