【GNURadio RTL-SDR】双RTL-SDR信号源的FM调频广播接收机

    技术2022-07-10  158

    文章目录

    1. 前言2. 实验过程2.1 制作流图2.2 RTL-SDR的设备参数


    1. 前言

    两个RTL-SDR的dongle“电视棒”,芯片 RTL2832U + R820T ,淘宝50左右那种能收FM和我国DTMB频段,想都接到同一台电脑去用软件无线电(GNURadio)的方式收多个FM调频广播信号。

    2. 实验过程

    在谷歌搜了不少类似内容,没有标准答案,加上受到了这里的复制粘贴的启发: 软件无线电-它如何工作? 第4部分 中的 多频道接收 部分(单独一个RTL-SDR信号源) 按照刚开始用GNURadio的时候作为实验用的简单宽带FM收音机(找不到图出处,能正常收听):

    RTL-SDR Source :把RTL-SDR设备(电视棒)作为接收信号的设备,可设置接收频率、各种增益等参数QT GUI SInk : 类似示波器,也可以砍掉该模块,不影响FM广播接收机工作QT GUI Chooser(samp_rate):采样率,单选按钮组合,一般选2MQT GUI Range(RF_GAIN):射频增益的值的调整,横向拖动框QT GUI Range(freq):接收频率的值的调整,横向拖动框QT GUI Range(volume):播放接收到的广播信号的音量的值的调整,横向拖动框,一般是1Audio Sink 模块,在电脑上播放接收到的广播信号。Wav File Sink 模块,将接收到的广播信号录制为WAV文件,采样率48KHz。

    在GNURadio运行,看GNU的控制台的输出:能正常接收FM广播频率

    #0 Realtek RTL2838UHIDIR SN: 00000001 Found Rafael Micro R820T tuner [R82XX] PLL not locked! Exact sample rate is: 2000000.052982 Hz

    2.1 制作流图

    直接复制粘贴出来第二个RTL-SDR信号源的接收信号处理模块路线: 把射频增益RF_GAIN变成固定值(variable)37.2; 采样率samp_rate变为固定值(variable)2e6(2M); 独立出来两个接收频率:freq_1 和 freq_2,都有横向的滚动条可以改变值; 于是: 运行界面:够简单,只有两个频率可以调

    电脑插上两个电视棒,在GNURadio运行这个流图,发现只能听见一个频率, 查看GNURadio控制台打印:

    Using device #0 Generic RTL2832U OEM usb_open error -3 Please fix the device permissions, e.g. by installing the udev rules file rtl-sdr.rules FATAL: Failed to open rtlsdr device. Trying to fill up 1 missing channel(s) with null source(s). This is being done to prevent the application from crashing due to gnuradio bug #528.

    使用设备 #0 Generic RTL2832U OEM USB打开错误?是不是读取rtlsdr设备失败? 试图用空的信号源去填充一个丢失的频道,防止本应用因为gnuradio的bug而导致崩溃。

    2.2 RTL-SDR的设备参数

    去翻看模块 RTL-SDR Source 的说明文档,双击模块 RTL-SDR Source - Document: 这里有个设备参数 Device Arguments :

    Device Arguments: The device argument is a comma delimited string used to locate devices on your system. Device arguments for multiple devices may be given by separating them with a space. Use the device id or name/serial (if applicable) to specify a certain device or list of devices. If left blank, the first device found will be used.

    黑体字关键:设备参数字符串用于定位系统中的RTL-SDR设备。同时使用多个RTL-SDR设备时,要填入设备ID或设备名称/序列号,来保证一个确认的设备,或一个设备表。若 Device Arguments 留空不填,则默认使用第一个找到的设备。

    此段下面的Examples例子里,发现 rtl=0 和 rtl=1 这些:

    rtl=serial_number ... rtl=0[,rtl_xtal=28.8e6][,tuner_xtal=28.8e6] ... rtl=1[,buffers=32][,buflen=N*512] ... rtl=2[,direct_samp=0|1|2][,offset_tune=0|1][,bias=0|1] ...

    回头看单个RTL-SDR信号源的流图的运行GNU控制台输出:

    Using device #0 Realtek RTL2838UHIDIR SN: 00000001 Found Rafael Micro R820T tuner

    设备标识符/标志从0开始咯?0-based?

    于是: 在第一个 RTL-SDR Source模块 的 Device Arguments 栏写入:rtl=0 在第二个 RTL-SDR Source模块 的 Device Arguments 栏写入:rtl=1 运行,正常,能听到两个频率的声音了! 此时GNU控制台输出:

    gr-osmosdr c653754d (0.1.5git) gnuradio 3.7.12.0 built-in source types: file osmosdr fcd rtl rtl_tcp uhd hackrf bladerf airspy redpitaya gr-osmosdr c653754d (0.1.5git) gnuradio 3.7.12.0 built-in source types: file osmosdr fcd rtl rtl_tcp uhd hackrf bladerf airspy redpitaya Using device #1 Realtek RTL2838UHIDIR SN: 00000001 Found Rafael Micro R820T tuner [R82XX] PLL not locked! Exact sample rate is: 2000000.052982 Hz [R82XX] PLL not locked! gr-osmosdr c653754d (0.1.5git) gnuradio 3.7.12.0 built-in source types: file osmosdr fcd rtl rtl_tcp uhd hackrf bladerf airspy redpitaya Using device #0 Realtek RTL2838UHIDIR SN: 00000001 Found Rafael Micro R820T tuner [R82XX] PLL not locked! Exact sample rate is: 2000000.052982 Hz [R82XX] PLL not locked! INFO: Audio sink arch: windows INFO: Audio sink arch: windows gr::pagesize: no info; setting pagesize = 4096

    注意这两句:

    Using device #0 Realtek RTL2838UHIDIR SN: 00000001 和 Using device #1 Realtek RTL2838UHIDIR SN: 00000001

    说明读取接上的设备 #0 和 #1 正确,我们填入的设备参数OK。

    另: 继续实验,在其中一个 RTL-SDR Source 换成填入参数 rtl=2 的话,GNU控制台:

    FATAL: Wrong rtlsdr device index given.

    说是给错了RTL-SDR设备的标志索引,于是只能听见一个频率的声音,正确。

    Processed: 0.012, SQL: 9