naj1024/pyspectrum
GitHub: naj1024/pyspectrum
一个基于Python的射频频谱分析工具,通过Web界面和SDR设备输入,实现RF信号的可视化、分析与监测。
Stars: 35 | Forks: 7
# 基于Python和WebUI的射频频谱分析器
* [功能](#features)
* [已知问题](#issues)
* [待办事项](#todo)
* [依赖项](#dependencies)
* [输入源](#input)
* [数据来源](#data-sources)
* [数据类型](#data-types)
* [安装说明](#installation)
* [Windows系统](#windows)
* [Linux系统](#linux---also-see-pi-install-examples)
* [完整安装示例](#a-complete-install)
* [Linux上的Soapy支持](#soapy-support-on-linux)
* [已测试设备/环境](#tested-with)
* [命令行示例](#command-line-examples)
* [调试指南](#debugging)
* [AD936x/Pluto晶振支持](#ad936x-pluto-xo-support)

这是一个编写Python程序的练习项目,后来扩展成了提供基于Web的用户界面。
FFT计算由Python库完成,因此速度并非最快。
如果你已经有SDR设备能配合其他工具使用,那么在安装好所需的Python依赖后,它应该就能工作了,嗯,理论上。
这个项目有点像《银河系漫游指南》里的基克里特一号飞船。
它能完成任务,但你可能不太想完全依赖它。
性能取决于你的机器配置以及支持的FFT库是如何编译的。
## 功能
* Python处理。
* Web JavaScript UI。
* 支持 rtlsdr, pluto, funcube, sdrplay (soapy), 音频, socket, 文件输入。
* 频谱以采样率进行计算。
* 适用于检测短促突发信号。
* 用于数据源和频谱分析的插件架构。
* 事件触发时保存快照文件,目前需手动触发。
* 可获取频谱数据而非原始样本(需要让maria工作)。
* 提供基于Web的UI,可用于对频谱进行测量。
* 处理进程可在没有Web客户端连接的情况下运行。
* 有助于了解如何使用Python从不同SDR设备获取样本。
## 已知问题
* 如果程序立即抛出异常,请检查依赖项。
* funcube在Windows下关闭时会抛出异常(我们在更改输入源时会执行此操作)。
* 处理时间不足导致丢样本。
* 一个实际的问题是很难判断样本是否被底层库丢弃。
任何超过约1 Msps的采样率都难以保证样本未在某处被丢弃。
Soapy接口可以检测到丢样本(溢出),但像ADALM-Pluto这样的数据源会静默丢弃样本。监控网络或USB传输速率会发现,速率并未随采样率提高而增加——这表明数据源正在丢弃样本。
## 备注
* 在树莓派5上运行效果相当不错。如果操作得当,可以同时运行桌面环境和网页浏览器。
* 树莓派4在无本地桌面的情况下可以工作。我在内存1GB的Pi4上测试过。运行本地桌面和浏览器会立即占用一个核心的100%利用率,并且交换空间会迅速耗尽,导致一切开始出现问题。请参阅docs目录中的说明和电子表格,以了解运行细节。
* “循环 %” 可用于检查运行是否正常。百分比超过100%通常表明存在问题。这个百分比预计会达到100%,因为它是主循环一圈的总时间。
* 更大的FFT尺寸可能有所帮助,因为它减少了数据复制次数,增加了对数据的实际操作。
* 支持SDRplay要么需要允许Python搜索系统路径以及虚拟环境,要么将相关的Python文件复制到环境中。如果系统安装了大量其他软件,允许系统搜索路径可能会导致版本冲突问题,使得运行速度非常缓慢。
## 待办事项
* 希望能试试hackrf输入,可惜手头没有 :(
* 自动检测和记录
## 依赖项
应安装以下Python模块。
可选模块提供特定功能。
建议将它们安装到虚拟环境中,以避免与系统安装的版本冲突。
```
Required:
numpy
websockets
matplotlib
Flask
flask_resful
Testing:
pytest
Optional:
scipy - another FFT library
pyfftw - another FFT library, faster above 8k size (for me)
pyadi-iio - pluto device
iio - pluto device
pyrtlsdr - rtlsdr devices
sounddevice - audio and funcube devices
soapysdr - soapy support
paho-mqtt - mqtt plugin (client)
hid - funcube control through usb hid, linux only?
sigmf - sigmf file support
```
## 输入
### 数据来源
* audio - 适用于测试,在Linux下需要安装 `sudo apt-get install libportaudio2`
* file - 支持wav和raw二进制格式,所有文件必须在快照目录中
* pluto (IP) - Analog Devices Pluto SDR及其兼容设备,70MHz至6GHz频段,前端开放
* rtlsdr - USB数据源
* rtltcp - 通过TCP的rtl
* socket - IQ样本流,你需要从下拉菜单中设置样本类型。
* funcube - Pro和Pro+作为音频设备,仅在Linux下支持HID控制
* soapy - 在Linux下支持SDRplay
* sweep - 一个提供扫描音调的测试源。也支持测试频谱输入。
### 数据类型
* 8位偏移二进制
* 8位二进制补码
* 16位二进制补码小端序 (x86)
* 16位二进制补码大端序
* 32位IEEE浮点小端序
* 32位IEEE浮点大端序
## 安装说明
### Windows系统
应与Linux安装类似,但
* 不支持funcube的HID控制(我们可以流式传输样本,但无法控制设备)。
* 不支持sdrplay,因为我们没有SoapySDR支持——不知道如何在Windows上安装。
### Linux系统 - 另请参阅树莓派安装示例
```
cd ~
git clone https://github.com/naj1024/pyspectrum.git
```
编辑requirements.txt以包含所需的输入源。
```
vi ./pyspectrum/src/requirements.txt
```
我使用pipenv创建虚拟环境。
```
pipenv shell
pip install -r ./pyspectrum/src/requirements.txt
```
运行,然后在浏览器中连接到localhost:8080
```
python3 ./pyspectrum/src/pyspectrum.py
```
## 完整安装示例
### 树莓派5
```
# 在 RP-5 上全新安装 bookworm(2024年1月)
$ sudo apt update
$ sudo apt upgrade
# Python 虚拟环境
$ sudo apt install pipenv
$ pipenv shell
(pi) pi@pi5:~ $ ctrl-d
exited from shell - just needed virtual env configured
# rtl-sdr 硬件支持(如果需要)
$ sudo apt install librtlsdr0
$ sudo apt install librtlsdr-dev
$ sudo apt install rtl-sdr
$ sudo usermod -a -G plugdev pi
# Pluto 硬件支持(如果需要)
$ sudo apt install libiio0 libiio-utils
# 音频硬件支持(如果需要)
$ sudo apt install libportaudio2
# 用于控制 funcube 设备的硬件支持(如果需要)
$ sudo apt install libhidapi-hidraw0 libhidapi-libusb0
# SDRplay API 支持(任何 Soapy 构建所需)
# 注意 API 版本可能导致问题,请获取所有内容的最新版本
## Down load SDRplay_RSP_API-Linux-xxxxxxx.run from https://www.sdrplay.com/api/
$ chmod +x SDRplay_RSP_API-Linux-3.14.1.run
$ sudo ./SDRplay_RSP_API-Linux-3.14.1.run
$ sudo systemctl status sdrplay
$ sudo systemctl enable sdrplay
# Soapy(因为发行版提供的 Soapy 不包含您的设备,此处提供了一些构建示例)
## dependancies for soapy build
$ sudo apt install cmake g++ libpython3-dev python3-numpy swig
## sdrplay base, required
$ cd ~
$ mkdir soapy
$ cd soapy
$ git clone https://github.com/pothosware/SoapySDR.git
$ cd SoapySDR
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install
$ sudo ldconfig
$ SoapySDRUtil --info # no modules found
## Soapy sdrplay module, if required
$ cd ~/soapy
$ git clone https://github.com/SDRplay/SoapySDRPlay.git
$ cd SoapySDRPlay
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install
$ sudo ldconfig
$ SoapySDRUtil --info # libsdrPlaySupport.so module found
## test how fast raw driver can go, change sample rate
$ SoapySDRUtil --rate=8e6 --direction=RX --args="driver=sdrplay"
## Soapy rtlsdr module, if required
$ cd ~/soapy
$ git clone https://github.com/pothosware/SoapyRTLSDR.git
$ cd SoapyRTLSDR
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install
$ SoapySDRUtil --info # librtlsdrSupport.so module found
## Soapy adalm pluto, if required
$ sudo apt install libiio-dev
$ cd ~/soapy
$ git clone https://github.com/pothosware/SoapyPlutoSDR
$ cd SoapyPlutoSDR
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install
## Soapy audio, if required - useful for testing if you have audio in
$ sudo apt install librtaudio-dev
$ cd ~/soapy
$ git clone https://github.com/pothosware/SoapyAudio
$ cd SoapyAudio
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install
# Soapy 支持
###########
# Either allow system search paths for the python environment for soapy
######
$ vi ~/.local/share/virtualenvs/pi-xxxxxx/pyvenv.cfg
# allow search on system packages as Soapy has installed them there
include-system-site-packages = true
###########
# Or copy the relevant file into our local environment
######
$ find /usr -name SoapySDR.py -ls
$ find /usr -name _SoapySDR.so -ls
# copy the files into your environment, pi-xxxxxx
cp /usr/local/lib/python3.11/dist-packages/SoapySDR.py \
/usr/local/lib/python3.11/dist-packages/_SoapySDR.so \
~/.local/share/virtualenvs/pi-xxxxxx//lib/python3.11/site-packages/
# 让库、规则、组等自行整理
$ sudo ldconfig
$ sudo reboot
# 以普通用户身份测试可用的 rtl-sdr 设备
$ rtl_test
# 克隆 pyspectrum 代码库
$ cd
$ git clone https://github.com/naj1024/pyspectrum.git
$ cd pyspectrum
$ git checkout flask
## install python requirements
$ cd
$ pipenv shell
$ cd pyspectrum/src
# edit for the features you require
$ vi requirements.txt
$ pip install -r ./requirements.txt
## Run the spectrum anlayser
$ python3 ./pyspectrum.py -vvv
web server port 8080
web socket port 8081
* Serving Flask app 'webUI.FlaskInterface'
* Debug mode: off
ctr-c
# check logs for errors
$ cat ./logs/SpectrumAnalyser.log
#############
# 替代 Soapy 驱动程序
# - 发行版提供
# - 无 SDRplay
#######
$ sudo apt install soapysdr-module-all
$ sudo apt install python3-soapysdr
$ vi ~/.local/share/virtualenvs/pi-xxxxxx/pyvenv.cfg
# allow search on system packages as Soapy has installed them there
include-system-site-packages = true
# 检查路径是否包含系统路径 python3/dist-packages
$ pi@pi5:~ $ pipenv shell
Launching subshell in virtual environment...
pi@pi5:~ $ . /home/pi/.local/share/virtualenvs/pi-xxxxxx/bin/activate
(pi) pi@pi5:~ $ python3.11 -c "import sys; print('\n'.join(sys.path))"
/usr/lib/python311.zip
/usr/lib/python3.11
/usr/lib/python3.11/lib-dynload
/home/pi/.local/share/virtualenvs/pi-xxxxxx/lib/python3.11/site-packages
/usr/local/lib/python3.11/dist-packages
/usr/lib/python3/dist-packages
/usr/lib/python3.11/dist-packages
(pi) pi@pi5:~ $ exit
```
# Linux上的Soapy支持
获取SoapySDR支持最简单的方法是从你的发行版仓库安装它。
然而,你的发行版可能未包含你需要的soapy驱动,关于从源代码构建,请参阅上文。
```
$ apt install python3-soapysdr
$ dpkg -L dpkg -L python3-soapysdr
```
然后,要么允许你的虚拟环境同时搜索系统路径(假设虚拟环境名为sid-xxxx)
```
$ vi ~/.local/share/virtualenvs/pi-xxxx/pyvenv.cfg
# allow search on system packages as Soapy has installed them there
include-system-site-packages = true
```
要么将相关文件复制到虚拟环境中
```
$ find /usr -name SoapySDR.py -ls
$ find /usr -name _SoapySDR.so -ls
$ cp /usr/local/lib/python3.11/dist-packages/SoapySDR.py \
/usr/local/lib/python3.11/dist-packages/_SoapySDR.so \
~/.local/share/virtualenvs/pi-xxxxxx//lib/python3.11/site-packages/
```
## 已测试设备/环境
```
Windows: audio, file, pluto, rtlsdr, rtltcp, socket, funcube
Linux : audio, file, pluto, rtlsdr, rtltcp, socket, funcube
soapy(audio, rtlsdr, sdrplay)
On windows make sure you have the correct rlibrtlsdr.dll for your python 32bit/64bit
```
## 命令行示例
### 来自PIPENV SHELL提示符:
```
pipenv shell
cd pyspectrum/src
python ./pyspectrum.py - Then goto http://127.0.0.1:8080 and configure the source
python ./pyspectrum.py -h - help
python ./pyspectrum.py -i? - list input sources that are available
python ./pyspectrum.py -vvv - max debug output in logs/SpectrumAnalyser.log
```
一些默认的输入选择,你通常通过Web界面进行选择:
```
python ./pyspectrum.py -ipluto:192.168.2.1 -c433.92e6 -s600e3 - pluto at 433MHz and 600ksps
python ./pyspectrum.py -ipluto:192.168.2.1 -c433.92e6 -s1e6
--plugin analysis:peak:threshold:12
--plugin report:mqtt:broker:192.168.0.101 - detect and log signals
python ./pyspectrum.py -ifile:test.wav -c433.92e6 - a test wav file
python ./pyspectrum.py -iaudio:1 -s48e3 -iaudio:1 - audio input
python ./pyspectrum.py -irtlsdr:kk -c433.92e6 -s1e6 - rtlsdr
SOAPY:
python ./src/pyspectrum.py -isoapy:audio -s48000 -c0 - soapy input
python ./src/pyspectrum.py -isoapy:sdrplay -s2e6 c433.92e6
```
## 调试指南
```
Some useful tools for testing things under linux, e.g. transfer rates.
top - process monitoring
iftop - network bandwidth monitoring
usbtop - USB bandwidth monitoring, needs usbmon kernel module installed
iostat - device monitoring
dstat - disk activity monitor
glances - monitoring tool
nmon - monitoring tool
```
## 额外的AD936x支持
我们可以通过在pyadi-iio安装后,将以下内容添加到ad936x.py文件中,来为Pluto添加ppm频率校正支持。你应该能在你的环境遍历的site-packages目录下的adi目录中找到ad936x.py文件。将这些代码插入到ad9364类定义中。
请查阅DataSource_pluto.py源文件以了解其他可以添加的功能。
```
@property
def xo_correction(self):
return self._get_iio_dev_attr("xo_correction")
@xo_correction.setter
def xo_correction(self, value):
self._set_iio_dev_attr_str("xo_correction", value)
```
标签:DNS解析, FFT 算法, Python 编程, SDR 支持, Web 界面, 信号处理, 实时数据采集, 射频技术, 开源项目, 插件架构, 数据流处理, 检测工具, 测量工具, 电子工程, 科学仪器, 软件定义无线电, 逆向工具, 通信系统, 音频分析, 频谱分析, 频谱测量