Построение водопада диапазона используя SDR-приемник
Хорошо бы записывать историю водопада в течении дня, недели для последующего анализа. Для этого есть замечательная програмка 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
, что бы использовать уже существующие построители:
- rtl-gopow - мы его и будем использовать, так как он самый быстрый.
- heatmap.py
- flatten.py - Turn a 2D table into a 1D line. Useful for generating noise and RA plots.
- ViewRF - Spectrum analyzer for the Beaglebone Black.
- RTL_SDR_Wide_Spectrum_Analyzer - A frontend written in Gambas.
- GUI for rtl_power - Windows only. Saves beavers.
- RTL-SDR Panoramic Spectrum Analyzer - Windows only.
Я не будем подробно описывать, как устанавливать тулчейн для компиляции программы в 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.