我对 python 和 rtlsdr 的世界仍然很陌生,但是我正在使用 Raspberry Pi 进行一个项目,以便在听到无线电信号时基本上触发警告灯。
在高层次上,我的项目是使用连接到插入 Raspberry Pi 的 RTL-SDR 加密狗的 2 米无线电频段的外部天线。我有一个标准继电器连接到 GPIO 引脚,当它“听到”信号时会打开灯。
真的,我不在乎 99% 的输入信号。我只想知道什么时候有一个 147.3MHz 的载波,然后让 GPIO 开灯。而已。不多也不少。当然这可以简单地完成吗?我已经阅读了 scipy.signal.butter 带通滤波器,但我无法让它在这个频率下工作。
我的代码在下面,我欢迎任何改进建议,但理想情况下,我正在寻找一种方法让程序识别中心频率为 147.3MHz 的峰值,然后调用我的“warning_lights.py”脚本。
import RPi.GPIO as GPIO
from rtlsdr import *
from scipy import signal
import peakdetect
import datetime
import sys
import subprocess
def restart():
import subprocess
import time
time.sleep(120)
command = "/usr/bin/sudo /sbin/shutdown -r now"
process = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
output = process.communicate()[0]
print (output)
# configure SDR device and settings
sdr = RtlSdr()
sdr.sample_rate = 2.4e6 # Hz
sdr.center_freq = 147.3e6 # Hz
sdr.gain = 'auto' # Possible values are 0.0 0.9 1.4 2.7 3.7 7.7 8.7 12.5 14.4 15.7 16.6 19.7 20.7 22.9 25.4 28.0 29.7 32.8 33.8 36.4 37.2 38.6 40.2 42.1 43.4 43.9 44.5 48.0 49.6
num_samples = 1024*1024
procs = []
while True:
try:
samples = sdr.read_samples(num_samples)
power, psd_freq = psd(samples, NFFT=1024, Fs=sdr.sample_rate/1e6,
Fc=sdr.center_freq/1e6)
power_db = 10*np.log10(power)
maxima, minima = peakdetect.peakdetect(power_db, psd_freq, delta=1)
for mx in maxima:
if mx[0] == 147.3: #checking that peak was on 147.3 MHz
if mx[1] > (-15): #checking dBm of signal
try:
while proc.poll() is None:
proc.terminate()
except:
print("Warning lights not on. Turning them on.")
finally:
print(mx[1])
proc = subprocess.Popen([sys.executable, '/home/pi/scripts/warning_lights.py'])
procs.append(proc)
except:
restart()