使用GNURadio和RTL-SDR搭建FM广播接收机

通过GNURadio和RTL-SDR电视棒来学习通信原理,实现一个简单的FM广播接收机,系统环境为ubuntu14.04或16.04。

1.环境搭建
GNURadio是一款开源软件无线电平台,可以用来设计和仿真各种通信系统。

GNURadio的安装在可以通过以下命令一步完成wget http://www.sbrac.org/files/build-gnuradio && chmod a+x ./build-gnuradio && ./build-gnuradio ,耗时很长。也可自己一个个git clone再安装。

RTL-SDR是一款基于RTL2832U芯片的电视棒,原本是用来接收DVB-T电视广播信号的设备,不过被人发现它可以工作在特殊的模式下,也就是直接将内置ADC采样的无线信号通过USB接口发送到电脑上,这就可以作为一种廉价的软件无线电设备。淘宝40RMB左右。

...

2.FM解调原理

调频FM是一种模拟调制方式,FM信号公式为,

m(t)为调制信号,FM是载波相位偏移随调制信号的积分呈线性变化。当上式信号的最大瞬时相位偏移不是远小于pi/6时称为宽带调频WBFM,即FM广播使用的方式。

FM信号的解调有相干解调和非相干解调两种方法,WBFM只能使用非相干解调,WBFM解调即产生一个与输入调频信号的频率呈线性关系的信号,简称鉴频器。最直接的方法就是对调频信号的相位进行微分,即可获得调制信号。

为了更好的频谱利用率,现在多使用正交调制和解调的方法,即将信号分为同向信号I和正交信号Q分别调制,再加在一起发送出去,接收时将I/Q信号分离再解调处理。

软件无线电通过数字信号处理来实现无线信号的调制解调。在RTL-SDR中通过调谐芯片(R820T、E4000)将无线信号下变频至低中频信号,由RTL2832U中的ADC采样得到数字信号,再进行数字下变频得到基带信号,由USB传送给计算机。RTL-SDR得到的基带信号是I/Q信号交错排列的形式,计算机对基带信号进行分离得到两路信号即I/Q信号进行解调。

在计算机中把基带信号看作复数形式,即s(n)=I+jQ,来进行运算。在离散域,序列的差分就相当于连续域的微分,FM正交解调的算法如下图,

...

3.FM广播接收机实现

RTL-SDR信号源由osmocom/gr-osmosdr模块提供,输出为复数形式。设置好信号源的中心频率和采样率,对来自信号源的信号通过抽取进行降采样,再经过低通滤波,只保留所要解调信号的频率范围,即调频信号的带宽,滤波器截止频率通过GUI Slider设置。滤波后的信号送入WBFM解调模块进行解调,输出即为音频信号,对音频信号进行滤波重采样等一系列处理后送入Audio Sink,GNURadio会自动通过音频驱动将音频信号送到计算机的音频输出,在扬声器就会发出FM广播的声音。还可以加上GUI FFT Sink观察广播信号的频谱。

使用GNURadio自带的WBFM Receive搭建FM接收机:

为了体现学习的目的,所以我们自己实现WBFM模块的功能,通过之前的FM正交解调理论,使用分立模块实现WBFM解调。

GNURadio自带Delay模块和Multiply Conjugate模块可以用于实现当前采样值乘上上一时刻的采样值的共轭,再通过arctan求取瞬时角度完成解调功能。在完成解调后可以对音频信号进行适当调理,经过去加重处理、滤波和重采样。

重新实现WBFM Receive模块搭建的FM接收机如下,部分模块需要自己实现:

部分模块核心代码如下,具体功能实现参考自带WBFM Receive模块,gnuradio自定义模块参考网上教程。 

namespace myblock {

    arctan::sptr
    arctan::make(float gain)
    {
      return gnuradio::get_initial_sptr
        (new arctan_impl(gain));
    }

    /*
     * The private constructor
     */
    arctan_impl::arctan_impl(float gain)
      : gr::sync_block("arctan",
              gr::io_signature::make(1, 1, sizeof(gr_complex)),
              gr::io_signature::make(1, 1, sizeof(float))),
	d_gain(gain)
    {}

    /*
     * Our virtual destructor.
     */
    arctan_impl::~arctan_impl()
    {
    }


    int
    arctan_impl::work (int noutput_items,
                       gr_vector_const_void_star &input_items,
                       gr_vector_void_star &output_items)
    {
      gr_complex *in = (gr_complex*)input_items[0];
      float *out = (float*)output_items[0];

      for(int i = 0; i < noutput_items; i++) {
        out[i] = d_gain * gr::fast_atan2f(imag(in[i]), real(in[i]));
      }

      // Tell runtime system how many output items we produced.
      return noutput_items;
    }

  } /* namespace myblock */

两种方案实现的结果都是相同的,需要注意的是初试采样频率在经过重采样后要和音频输出的采样率相等,不然听不到正常的声音。

程序运行如下图,可以从扬声器听到FM广播的声音,通过图形界面可以调节音量、频率、带宽。


reference:RTL-SDR FM Radio Receiver With GNU Radio Companion : 11 Steps - Instructables

  • 20
    点赞
  • 120
    收藏
    觉得还不错? 一键收藏
  • 27
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值