簡體   English   中英

如何使用 rtlsdr 作為源對特定頻率進行帶通濾波器?

[英]How can I do a bandpass filter for a specific frequency using rtlsdr as the source?

我對 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()

當您調諧到 147.3MHz 時,您從 SDR 中得到的並不是實際的無線電信號,因為它出現在輸入端。 SDR 將射頻信號的頻率降低到更容易處理和數字化的較低頻率。 結果,以 147.3MHz 為中心的原始信號部分下移至 0Hz,即所謂的“基帶”。 一定帶寬(在您的情況下為 2.4MHz)之外的所有內容都會被過濾掉。 因此,例如,如果在 148.3MHz 處有一個純正弦信號,這將在 SDR 的 output 中顯示為 1MHz 正弦信號。 考慮頻譜 plot 來可視化這一點非常有幫助: Wikipedia article on baseband

因此,如果有一個以 147.3MHz 為中心的無線電信號,您將不會在 SDR 的 output 中看到 147.3MHz,而是在 0Hz(由於 SDR 電路的頻率並不完全准確,因此有輕微的偏移) . 正如您提到的,這應該很容易使用 scipy 過濾。

還有另一個問題可能是一個問題。 大多數 SDR 在它們調諧到的頻率處產生一個小的頻率峰值(稱為“DC 尖峰”)。 在我的 RTL-SDR 中,我發現增益較低時會出現這種情況。 解決此問題的方法是調諧到您感興趣的信號帶寬之外的頻率(例如 147.5MHz 可以工作),然后補償處理中的這種變化。

結果,應該起作用的是:

# configure SDR device and settings
sdr = RtlSdr()
offset_freq = 200e3         # Hz
sdr.sample_rate = 2.4e6     # Hz
sdr.center_freq = 147.3e6 - offset_freq   # 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] == offset_freq:     #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()

圖像中沒有說明這一點,但您也可以從低於載波的任何頻率獲得信號中的負頻率。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM