Хорошо бы записывать историю водопада в течении дня, недели для последующего анализа. Для этого есть замечательная програмка rtl_power от Kyle Keen. Но есть загвоздка, для работы rtl_power нужен отдельный sdr-приемник. Тут к нам на помощь приходит OpenWebRX. Мы просто создаем еще одно tcp соединение через NetCat и тянем поток сырых данных для обработки.

Обрабатывать данные будем все так же с помощью csdr, у которого есть специальные опции для обработки FFT.

csdr fft_cc <fft_size> <out_of_every_n_samples> 
csdr logaveragepower_cf <add_db> <fft_size> <avgnumber>
csdr fft_exchange_sides_ff <fft_size>

Вначале я использовал fft_size = 4096 и получались картинки 4096px X 44000px, которые практически невозможно было открывать в браузере. Пример водопада за 30 минут при занчении 4096, вес картинки 3.2Mb. По этому пока остановился на числе 1024. Число обязательно должно быть 2 в степени. Параметр out_of_every_n_samples отвечает за то сколько семплов будет пропущено перед следующей выдачей данных. Не очень понимаю, как правильно его высчитывать но при значениях fft_cc 1024 109226 разрещение картинки получается 1.4khz в 2 секунды на один пиксель. То есть по вертикале 5 пикселей ранвно 10 секундам, чего на мой взглад хватит для обзора и файл не будет получаться слишком уж длинный.

В итоге у мена получилась следующая команда, которая раз в 2 секунды выстреливает цифрами децибел отвечающих за один пиксель.

nc -v 127.0.0.1 4951 | csdr convert_u8_f | csdr fft_cc 1024 109226 | csdr logaveragepower_cf -80 1024 40 | csdr fft_exchange_sides_ff 1024 | csdr dump_f

Можно было бы написать программу которая по этим данным строила водопад и т.д., но решено было сделать поточный коверт данных в формат данных rtl_power, что бы использовать уже существующие построители:

Я не будем подробно описывать, как устанавливать тулчейн для компиляции программы в Go этого добра в инете хватает.

Привожу программу на Go которая принимает в pipe значения из csdr и преобразовывает их в формат rtl_power.
Пусть имя файла будет csdr2heatmap.go

package main

import (
    "bufio"
    "fmt"
    "os"
    "time"
)

func main() {
    startFreq := 144000000
    endFreq := 146000000
    samples := 1024

    buf := make([]string, 0, samples)
    scanner := bufio.NewScanner(os.Stdin)
    scanner.Split(bufio.ScanWords)

    count := 0
    for scanner.Scan() {
        count++
        value := scanner.Text()
        buf = append(buf, value)
        if count%samples == 0 {
            fmt.Print(time.Now().Format("2006-01-02, 15:04:05, "))
            fmt.Printf("%d, %d, %d, %d, ", startFreq, endFreq, samples, samples)
            for i := range buf {
                fmt.Print(buf[i])
                if i < samples-1 {
                    fmt.Print(", ")
                }
            }
            fmt.Println("")
            buf = buf[:0]
        }
    }

}

Компилируем. go build csdr2heatmap.go Ну а дальше запускаем запись данных в csv файл

nc -v 127.0.0.1 4951 | csdr convert_u8_f | csdr fft_cc 1024 109226 | csdr logaveragepower_cf -80 1024 40 | csdr fft_exchange_sides_ff 1024 | csdr dump_f | ./csdr2heatmap  >> /tmp/data.csv

Строим PNG-файл с помощью программы rtl-gopow. Скачиваем файл под нужную операционную систему. В Linux я разместил программу в домашней папке ~/bin/gopow

Я использую следующие параметры:

/home/ruslan/bin/gopow -i /tmp/data.csv --min-power "-67.0"  -f "png" -o /var/www/waterfalls/today.png --verbose

Ну а для переодичной перерисовки картинки используем crontab

*/10 * * * *  /home/ruslan/bin/gopow -i /tmp/data.csv --min-power "-65.0"  -f "png" -o /var/www/waterfalls/today.png

Наблюдать полученный результат можно по ссылке ur5zhf.com/images/waterfalls/20171012.png

Не стоит забывать что файл /tmp/data.csv при таких параметрах вырастает до 400мБайт. И его нужно обнулять в полночь, например добавление м в crontab следующей строчки

0 0 * * *    echo '' > /tmp/data.csv

Так же можно настроить ротацию данных и хранить историю за предыдущие дни с помощью программы logrotate.