You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取RTL-SDR捕获的复杂信号中特定阈值以上峰值的坐标?

嘿,我来帮你搞定提取信号峰值坐标的问题!先从你的RTL-SDR信号捕获代码入手,一步步完成绘图和峰值检测的环节。

1. 完善信号捕获代码(补充依赖)

你的捕获代码里用到了对数计算和方差函数,得先导入numpy才能正常运行,我把代码补全一下:

from rtlsdr import RtlSdr
import numpy as np

i = 0
signals = []
sdr = RtlSdr()
sdr.sample_rate = 2.8e6
sdr.center_freq = 434.42e6
sdr.gain = 25

while True:
    samples = sdr.read_samples(1024*1024)
    decibel = 10 * np.log10(np.var(samples))
    if decibel >= -10:
        signals.append(samples)
        i += 1
        if i == 2:
            break
sdr.close()  # 记得关闭SDR设备,避免资源占用
2. 用Matplotlib + Seaborn绘制信号频谱

通常我们会绘制信号的频谱图来观察峰值,这里用FFT将时域信号转换为频域,再结合Matplotlib和Seaborn绘图:

import matplotlib.pyplot as plt
import seaborn as sns

# 设置绘图风格
sns.set_style("darkgrid")

# 处理第一个捕获到的信号(你也可以循环处理多个)
sample = signals[0]
sample_rate = sdr.sample_rate
center_freq = sdr.center_freq

# 计算FFT并转换为分贝
fft_data = np.fft.fft(sample)
fft_freq = np.fft.fftfreq(len(fft_data), 1/sample_rate) + center_freq
fft_db = 10 * np.log10(np.abs(fft_data) / len(fft_data))

# 绘制频谱图
plt.figure(figsize=(12, 6))
plt.plot(fft_freq, fft_db)
plt.xlabel("Frequency (Hz)")
plt.ylabel("Amplitude (dB)")
plt.title("RTL-SDR Signal Spectrum")
plt.xlim(center_freq - sample_rate/2, center_freq + sample_rate/2)  # 显示完整带宽
plt.show()
3. 提取高于特定阈值的峰值坐标

要获取峰值坐标,我们可以用scipy.signal.find_peaks函数,它能精准定位符合条件的峰值。步骤如下:

3.1 安装scipy(如果还没装)

如果你的环境里没有scipy,先执行安装命令:

pip install scipy

3.2 峰值检测代码

from scipy.signal import find_peaks

# 设置你的阈值(比如设为-20 dB,你可以根据实际情况调整)
threshold = -20

# 找到所有高于阈值的峰值
# height参数设置峰值的最低高度,distance可以设置峰值之间的最小距离(避免相邻小峰值)
peaks, properties = find_peaks(fft_db, height=threshold, distance=100)

# 获取峰值对应的频率(x坐标)和分贝值(y坐标)
peak_freqs = fft_freq[peaks]
peak_dbs = properties["peak_heights"]

# 打印峰值坐标
print("高于阈值的峰值坐标:")
for freq, db in zip(peak_freqs, peak_dbs):
    print(f"频率: {freq:.2f} Hz,幅度: {db:.2f} dB")

# 也可以在图上标记峰值
plt.figure(figsize=(12, 6))
plt.plot(fft_freq, fft_db)
plt.scatter(peak_freqs, peak_dbs, color="red", marker="x", label="Peaks")
plt.xlabel("Frequency (Hz)")
plt.ylabel("Amplitude (dB)")
plt.title("RTL-SDR Signal Spectrum with Peaks Marked")
plt.xlim(center_freq - sample_rate/2, center_freq + sample_rate/2)
plt.legend()
plt.show()

关键说明:

  • find_peaks的height参数就是你要设置的阈值,只有高于这个值的峰值会被检测到。
  • distance参数可以过滤掉距离过近的小峰值,避免误检,你可以根据信号情况调整这个数值。
  • 最终得到的peak_freqs是峰值对应的频率(x轴坐标),peak_dbs是对应的幅度(y轴坐标),完全符合你的需求。

内容的提问来源于stack exchange,提问作者ci7i2en4

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:12:01