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) ![屏幕截图](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/1b914f1d21232157.png) 这是一个编写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 界面, 信号处理, 实时数据采集, 射频技术, 开源项目, 插件架构, 数据流处理, 检测工具, 测量工具, 电子工程, 科学仪器, 软件定义无线电, 逆向工具, 通信系统, 音频分析, 频谱分析, 频谱测量