{"id":12531,"date":"2019-01-11T02:48:16","date_gmt":"2019-01-11T01:48:16","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=12531"},"modified":"2019-01-12T15:35:01","modified_gmt":"2019-01-12T14:35:01","slug":"sdr-auf-den-pi-generieren-von-wasserfall-diagrammen-mit-rtl_power-und-heatmap-py-nicht-nur-fuer-acars-frequenzen","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=12531","title":{"rendered":"SDR auf den Pi: Generieren von Wasserfall Diagrammen mit rtl_power und heatmap.py nicht nur f\u00fcr ACARS Frequenzen"},"content":{"rendered":"<p>Mit einem SDR kann man Frequenzen \u00fcberwachen. Mit <strong>rtl_power<\/strong> kann man dann <strong>CSV Dateien<\/strong> schreiben und diese dann mit einem Python Script in eine sch\u00f6ne \u00fcbersichtliche Wasserfall Grafik umwandeln. Da kann man dann leicht sehen was f\u00fcr Aktivit\u00e4t auf den jeweiligen Frequenzen los war. Hier in Hannover ist halt nicht so viel los. Und das alles auf einen kleine Raspberry Pi.<\/p>\n<p>Ich hatte vor einem Jahr schon mal davon <a href=\"http:\/\/blog.wenzlaff.de\/?p=9565\" rel=\"noopener\" target=\"_blank\">berichtet<\/a>, wie das mit meinem Java Programm geht. Nun wollte ich mal das Python Script ausprobieren was ich auf GitHub gefunden habe.<\/p>\n<p>Wir nehmen mal die <strong>ACARS<\/strong> Frequenzen, andere siehe in dieser <a href=\"https:\/\/www.funk-technik.info\/frequenzen\/utilities\/100-000-144-000-mhz.html\" rel=\"noopener\" target=\"_blank\">Tabelle<\/a>.<\/p>\n<p>Hier ein Auszug was so auf den Frequenzen l\u00e4uft:<\/p>\n<pre class=\"lang:default decode:true \" >\r\n131,525 \t  \t  \tACARS Europa Sekund\u00e4r\r\n131,725 \t  \t  \tACARS Europa Prim\u00e4r\r\n131,825 \t  \t  \tACARS Europa Sekund\u00e4r\r\n<\/pre>\n<p>Wir starte <strong>rtl_power<\/strong> 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\u00fcr andere Sticks nat\u00fcrlich ein anderer Wert, kann aber auch weggelassen werden.<\/p>\n<pre class=\"lang:default decode:true \" >rtl_power -f 131.000M:131.999M:1k -g 30 -i 10 -e 12h -p 48 airband-131.000-131.999M-1k-12h.csv<\/pre>\n<p>Dann wandeln wir die erzeugte CSV Datei mit dem Python Script <strong>heatmap.py<\/strong> um. Wir schreiben alle 15 Minuten f\u00fcr die Y-Achse einen Zeit-Label und verwende die <strong>twente<\/strong> Palette, die gef\u00e4llt mir am Besten:<\/p>\n<pre class=\"lang:default decode:true \" >\r\n\r\npython heatmap.py --ytick 15 --palette twente airband-131.000-131.999M-1k-12h.csv airband-131.000-131.999M-1k-12h-besch-twent.jpg\r\n\r\n<\/pre>\n<p>An dem Diagramm sehen wir auch, das der Scann-Prozess nach 3 Stunden abgebrochen ist. Aber drei Stunden reichen auch:<\/p>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2019\/01\/airband-131.000-131.999M-1k-12h-besch-twent.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2019\/01\/airband-131.000-131.999M-1k-12h-besch-twent.jpg\" alt=\"\" width=\"1024\" height=\"1313\" class=\"aligncenter size-full wp-image-12532\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2019\/01\/airband-131.000-131.999M-1k-12h-besch-twent.jpg 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2019\/01\/airband-131.000-131.999M-1k-12h-besch-twent-234x300.jpg 234w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2019\/01\/airband-131.000-131.999M-1k-12h-besch-twent-768x985.jpg 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2019\/01\/airband-131.000-131.999M-1k-12h-besch-twent-799x1024.jpg 799w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>Es k\u00f6nnen auch noch andere Paletten verwendet werden:<!--more--><\/p>\n<p>Z.B. <strong>extended<\/strong>:<\/p>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2019\/01\/airband-131.000-131.999M-1k-12h-besch-ext.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2019\/01\/airband-131.000-131.999M-1k-12h-besch-ext.jpg\" alt=\"\" width=\"1024\" height=\"1313\" class=\"aligncenter size-full wp-image-12533\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2019\/01\/airband-131.000-131.999M-1k-12h-besch-ext.jpg 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2019\/01\/airband-131.000-131.999M-1k-12h-besch-ext-234x300.jpg 234w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2019\/01\/airband-131.000-131.999M-1k-12h-besch-ext-768x985.jpg 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2019\/01\/airband-131.000-131.999M-1k-12h-besch-ext-799x1024.jpg 799w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>oder <strong>charolastra<\/strong>:<\/p>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2019\/01\/airband-131.000-131.999M-1k-12h-besch-charo.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2019\/01\/airband-131.000-131.999M-1k-12h-besch-charo.jpg\" alt=\"\" width=\"1024\" height=\"1313\" class=\"aligncenter size-full wp-image-12534\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2019\/01\/airband-131.000-131.999M-1k-12h-besch-charo.jpg 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2019\/01\/airband-131.000-131.999M-1k-12h-besch-charo-234x300.jpg 234w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2019\/01\/airband-131.000-131.999M-1k-12h-besch-charo-768x985.jpg 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2019\/01\/airband-131.000-131.999M-1k-12h-besch-charo-799x1024.jpg 799w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>oder ohne Beschriftung:<\/p>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2019\/01\/airband-131.000-131.999M-1k-12h.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2019\/01\/airband-131.000-131.999M-1k-12h.jpg\" alt=\"\" width=\"1024\" height=\"1313\" class=\"aligncenter size-full wp-image-12535\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2019\/01\/airband-131.000-131.999M-1k-12h.jpg 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2019\/01\/airband-131.000-131.999M-1k-12h-234x300.jpg 234w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2019\/01\/airband-131.000-131.999M-1k-12h-768x985.jpg 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2019\/01\/airband-131.000-131.999M-1k-12h-799x1024.jpg 799w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>Hier noch die Anleitung und Parameter zu dem Script:<\/p>\n<pre class=\"lang:default decode:true \" >\r\n\r\npython heatmap.py -h\r\nloading\r\nusage: heatmap.py [-h] [--offset OFFSET_FREQ] [--ytick TIME_TICK]\r\n                  [--db DB_LIMIT DB_LIMIT] [--compress COMPRESS]\r\n                  [--low LOW_FREQ] [--high HIGH_FREQ] [--begin BEGIN_TIME]\r\n                  [--end END_TIME] [--head HEAD_TIME] [--tail TAIL_TIME]\r\n                  [--palette PALETTE]\r\n                  INPUT OUTPUT\r\n\r\nConvert rtl_power CSV files into graphics.\r\n\r\npositional arguments:\r\n  INPUT                 Input CSV file. (may be a .csv.gz)\r\n  OUTPUT                Output image. (various extensions supported)\r\n\r\noptional arguments:\r\n  -h, --help            show this help message and exit\r\n  --offset OFFSET_FREQ  Shift the entire frequency range, for up\/down\r\n                        converters.\r\n  --ytick TIME_TICK     Place ticks along the Y axis every N\r\n                        seconds\/minutes\/hours\/days.\r\n  --db DB_LIMIT DB_LIMIT\r\n                        Minimum and maximum db values.\r\n  --compress COMPRESS   Apply a gradual asymptotic time compression. Values &gt;\r\n                        1 are the new target height, values &lt; 1 are a scaling\r\n                        factor.\r\n  --palette PALETTE     Set Color Palette: default, extended, charolastra,\r\n                        twente\r\n\r\nSlicing:\r\n  Efficiently render a portion of the data. (optional) Frequencies can take\r\n  G\/M\/k suffixes. Timestamps look like \"YYYY-MM-DD HH:MM:SS\" Durations take\r\n  d\/h\/m\/s suffixes.\r\n\r\n  --low LOW_FREQ        Minimum frequency for a subrange.\r\n  --high HIGH_FREQ      Maximum frequency for a subrange.\r\n  --begin BEGIN_TIME    Timestamp to start at.\r\n  --end END_TIME        Timestamp to stop at.\r\n  --head HEAD_TIME      Duration to use, starting at the beginning.\r\n  --tail TAIL_TIME      Duration to use, stopping at the end.\r\n<\/pre>\n<p>Und f\u00fcr rtl_power:<\/p>\n<pre class=\"lang:default decode:true \" >rtl_power -h\r\nrtl_power, a simple FFT logger for RTL2832 based DVB-T receivers\r\n\r\nUse:\trtl_power -f freq_range [-options] [filename]\r\n\t-f lower:upper:bin_size [Hz]\r\n\t (bin size is a maximum, smaller more convenient bins\r\n\t  will be used.  valid range 1Hz - 2.8MHz)\r\n\t[-i integration_interval (default: 10 seconds)]\r\n\t (buggy if a full sweep takes longer than the interval)\r\n\t[-1 enables single-shot mode (default: off)]\r\n\t[-e exit_timer (default: off\/0)]\r\n\t[-d device_index (default: 0)]\r\n\t[-g tuner_gain (default: automatic)]\r\n\t[-p ppm_error (default: 0)]\r\n\t[-T enable bias-T on GPIO PIN 0 (works for rtl-sdr.com v3 dongles)]\r\n\tfilename (a '-' dumps samples to stdout)\r\n\t (omitting the filename also uses stdout)\r\n\r\nExperimental options:\r\n\t[-w window (default: rectangle)]\r\n\t (hamming, blackman, blackman-harris, hann-poisson, bartlett, youssef)\r\n\t[-c crop_percent (default: 0%, recommended: 20%-50%)]\r\n\t (discards data at the edges, 100% discards everything)\r\n\t (has no effect for bins larger than 1MHz)\r\n\t[-F fir_size (default: disabled)]\r\n\t (enables low-leakage downsample filter,\r\n\t  fir_size can be 0 or 9.  0 has bad roll off,\r\n\t  try with '-c 50%')\r\n\t[-P enables peak hold (default: off)]\r\n\t[-D enable direct sampling (default: off)]\r\n\t[-O enable offset tuning (default: off)]\r\n\r\nCSV FFT output columns:\r\n\tdate, time, Hz low, Hz high, Hz step, samples, dbm, dbm, ...\r\n\r\nExamples:\r\n\trtl_power -f 88M:108M:125k fm_stations.csv\r\n\t (creates 160 bins across the FM band,\r\n\t  individual stations should be visible)\r\n\trtl_power -f 100M:1G:1M -i 5m -1 survey.csv\r\n\t (a five minute low res scan of nearly everything)\r\n\trtl_power -f ... -i 15m -1 log.csv\r\n\t (integrate for 15 minutes and exit afterwards)\r\n\trtl_power -f ... -e 1h | gzip &gt; log.csv.gz\r\n\t (collect data for one hour and compress it on the fly)\r\n\r\nConvert CSV to a waterfall graphic with:\r\n\t http:\/\/kmkeen.com\/tmp\/heatmap.py.txt\r\n<\/pre>\n<p>Das Python Script gibt es auf <a href=\"https:\/\/github.com\/keenerd\/rtl-sdr-misc\/tree\/master\/heatmap\" rel=\"noopener\" target=\"_blank\">GitHub<\/a>. Weiter Infos <a href=\"http:\/\/blog.wenzlaff.de\/?p=9565\" rel=\"noopener\" target=\"_blank\">hier<\/a> auf dem Block.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mit einem SDR kann man Frequenzen \u00fcberwachen. Mit rtl_power kann man dann CSV Dateien schreiben und diese dann mit einem Python Script in eine sch\u00f6ne \u00fcbersichtliche Wasserfall Grafik umwandeln. Da kann man dann leicht sehen was f\u00fcr Aktivit\u00e4t auf den jeweiligen Frequenzen los war. Hier in Hannover ist halt nicht so viel los. Und das &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/blog.wenzlaff.de\/?p=12531\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eSDR auf den Pi: Generieren von Wasserfall Diagrammen mit rtl_power und heatmap.py nicht nur f\u00fcr ACARS Frequenzen\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[220,1023,2752,3498,2713,7],"tags":[3003,612,3512,2489,2340,3128,512,1397,3129],"class_list":["post-12531","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-raspberry-pi","category-raspberry-pi-zero-w","category-sdr","category-statistik","category-tools","tag-acars","tag-diagramm","tag-frequenzen","tag-heatmap","tag-python","tag-rtl_power","tag-scanner","tag-script","tag-wasserfall"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/12531","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=12531"}],"version-history":[{"count":0,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/12531\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=12531"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=12531"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=12531"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}