MENU

用 USRP B210 扫描周围的频率使用情况

April 5, 2026 • Nico的日常生活阅读设置

sudo apt-get install rx-tools soapysdr-module-uhd

sudo apt install git cmake build-essential libsoapysdr-dev

手动编译安装 rx-tools Ubuntu似乎在源里面有

git clone https://github.com/rxseger/rx_tools.git
cd rx_tools
mkdir build && cd build
cmake ..
make

sudo make install
sudo ldconfig

rx_power -d driver=uhd -f 1805M:1880M:100k -g 40 -i 10 -e 10s output.csv

数据图形化

sudo apt install python3-matplotlib

nano plot_spectrum.py

然后把下面python代码填进去

import csv
import matplotlib.pyplot as plt
from collections import defaultdict

# 用于存储每个频点的所有信号强度记录
data = defaultdict(list)

print("正在读取 output.csv ...")
with open('output.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader:
        if len(row) < 7: 
            continue
        # 解析 rx_power 的 CSV 格式
        hz_low = float(row[2])
        hz_step = float(row[4])
        # 提取所有的 dBm 值
        dbms = [float(x) for x in row[6:] if x.strip()]

        for i, dbm in enumerate(dbms):
            freq_mhz = (hz_low + i * hz_step) / 1e6  # 转换为 MHz
            data[freq_mhz].append(dbm)

if not data:
    print("错误:CSV 文件中没有找到有效数据!")
    exit()

# 计算每个频点的平均信号强度
print("正在计算平均信号强度并绘图 ...")
freqs = sorted(data.keys())
avg_powers = [sum(data[f]) / len(data[f]) for f in freqs]

# 开始画图
plt.figure(figsize=(12, 6))
plt.plot(freqs, avg_powers, color='blue', linewidth=1)
plt.fill_between(freqs, avg_powers, min(avg_powers)-5, color='blue', alpha=0.3)

plt.title('Spectrum Scan Result (USRP B210)')
plt.xlabel('Frequency (MHz)')
plt.ylabel('Average Power (dBm)')
plt.grid(True, linestyle='--', alpha=0.7)
plt.tight_layout()

# 保存为图片
plt.savefig('spectrum.png', dpi=150)
print("✅ 成功!图表已保存为 spectrum.png")

运行即可生成

python3 plot_spectrum.py
Leave a Comment