我可以使用以下方法从 RTL-SDR 捕获信号:
from rtlsdr import *
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*log10(var(samples))
if decibel >= -10:
signals.append(samples)
i += 1
if i == 2:
break
如果我使用 Matplotlib 和 Seaborn 绘制信号,它们看起来像这样:

现在,我需要的是获得高于某个功率水平的所有峰值的坐标,例如,-20。
我发现了一个很有希望的各种Python 选项列表。但是,所有这些示例都使用了一个简单的 Numpy 数组,不同的算法可以轻松地使用它。
这是最好的尝试(因为我的猜测是我从 RTL-SDR 获得了一个复杂的信号,并且必须将其“转换”为具有实数值的数组?):
import numpy as np
import peakutils.peak
real_sig = np.real(signals[0])
indexes = peakutils.peak.indexes(real_sig, thres=-20.0/max(real_sig), min_dist=1)
print("Peaks are: %s" % (indexes))
将这几行添加到上面的脚本中,我确实得到了一些输出,但是,首先,功率水平 -20 以上的五个峰值的值太多了。其次,这些值在给定的上下文中没有多大意义。
那么,我需要进行哪些更改才能获得有意义的结果,例如“Peak 1 is at 433.22 MHz”?
理想情况下,我应该得到类似的坐标Peak 1: X = 433.22, Y = -18.0,但我想一旦我知道如何获得正确的 X 值,我就可以自己弄清楚。






