从零开始USRP+GNURADIO系列(基础入门篇和C++自定义模块)

从零开始USRP+GNRRADIO系列(基础入门篇)

文章目录

  • 从零开始USRP+GNRRADIO系列(基础入门篇)
    • usrp简介
    • 创建第一个usrp图
    • C++自定义模块

usrp简介

通用软件无线电外设(USRP)是由Ettus Research及其母公司National Instruments设计和销售的一系列软件定义无线电。 USRP产品系列由Matt Ettus领导的团队开发,旨在成为一个相对便宜的软件无线电硬件平台,并且常用于研究实验室,大学和业余爱好者。
大多数USRP通过高速链路连接到主机,基于主机的软件用它来控制USRP硬件和发送/接收数据。一些USRP型号还将主机的一般功能与嵌入式处理器集成在一起,使USRP设备能够以独立的方式运行。
USRP系列专为可访问性而设计,许多产品都是开源硬件。选择的USRP型号的电路板原理图可免费下载; 所有USRP产品均由开源UHD驱动程序控制,该驱动程序是免费的开源软件。USRP通常与GNU Radio软件套件一起使用,以创建复杂的软件定义无线电系统。
在这里插入图片描述
下图非常形象的展示了整个SDR的发射过程,PC和USRP之间用USB链接,PC端运行SDR程序,将数据传输给USRP,经过数字域处理后DAC给模拟域发送出去。
在这里插入图片描述
USRP系列型号一览图:
在这里插入图片描述
后面的章节都将是通过usrpB210进行展开,使用的开发环境是GNU Radio ,
GNU Radio是一个免费的开源软件开发工具包,它提供信号处理模块来实现软件无线电。它可以与现成的低成本外部 RF 硬件一起使用来创建软件定义的无线电,或者用于纯仿真环境。它广泛用于业余爱好者、学术和商业环境,以支持无线通信研究和现实世界的无线电系统。
安装过程就不在此处陈述了,安装包和安装流程链接
链接:https://pan.baidu.com/s/1x3bMr-xdBDhEnUm_QPpcNg
提取码:eh5r

创建第一个usrp图

GNU Radio包含了许多通信组件模块,是一个可以用来研发无线通信系统的集成工具库。在本文中,我们将介绍如何使用GRC(gnuradio-companion的简写,GNU Radio的图形化界面编程工具,类似于simulink)来创建不同的通信程序。
安装完gnuradio后,在linux命令行输入

sudo gnuradio-companion

界面如下,下图是一个简单的环回电路,就是自发自收在这里插入图片描述
定义了全局变量samp_rate=32k,右上角可调节的变量frq=[0-1M]。
signal source即是信号源,采样率32k,正弦波。两个正弦波相乘,通过USRP的TX/RX端口发送出去(上变频到5G)。
下面则是USRP的RX2端口接收(从5G下变频),用QT GUI Time Sink(时域示波器),QTGUI Sink(综合各种显示器件的组件)来显示结果。

USRP Sink的配置界面
在这里插入图片描述
其中比较重要的参数,
Input Type:输入数据类型
Device Address:设备地址是一个分隔字符串,用于定位系统上的UHD设备。如果留空,将使用找到的第一个UHD设备。
在这里插入图片描述
Clock Rate [Hz]:定义usrp的时钟频率,一般默认。
Num Channels:选择此多USRP配置中的通道总数(输入通道数量)。例如:4个主板,每个板2个通道=总共8个通道。
Sample Rate:采样率。

在这里插入图片描述
RF OPTIONS中,
Chx Center Frequency:中心频率是RF链的总频率(即上变频的载波频率)
Chx Gain Value:当使用默认的“绝对”增益类型时,增益值介于0和USRP的最大增益之间(通常在70到90之间)。当使用“归一化”增益类型时,它将始终为0.0到1.0,其中1.0将映射到所使用的USRP的最大增益。
Chx Antenna:发射的天线
Chx Bandwidth:USRP的抗锯齿滤波器使用的带宽。要使用默认带宽筛选器设置,该值应为零。
USRP SOURCE中的配置类似,基本一样。

C++自定义模块

这一部分建议先看完GRC Boulogeorgos实例程序分析后再回过来看这个,就会清楚一些。
这里要用到gr_modtool工具来帮助创建框架,不用担心,这个一般安装了gnuradio就会带有这个。
使用指令

gr_modtool newmod test1 

创建一个名字为test1的框架,会产生如下的文件。
在这里插入图片描述
gr-mysource中有多个子目录。其中:
1)用C/C++写的程序都将放在lib文件夹中,而C/C++的头文件放在include文件夹中(如果它们是接口),或者放在lib文件夹中(如果它们只在编译时用到,在安装之后用不到,如*_impl.h文件)。
2)用python写的程序都将放在python文件夹中,包括未安装的测试单元和已安装的python模块。
3)虽然GNU Radio的模块是用C++写的,但这些模块可以在python中调用,这是通过SWIG(the simplified wrapper and interface generator)的帮助。SWIG的相关文件放在swig文件夹中。
4)如果想让自定义模块在GNU Radio图形界面(GRC)中也是可用的,就需要在grc文件夹中添加.xml描述文件。
5)在docs文件夹中包含一些说明,可以使用Doxygen和Sphinx从C++文件和python文件中提取文件的说明。
6)在apps文件夹中包含一些完整的已安装到系统的应用程序(包括在GRC中执行或单独执行的文件)。
7)examples文件夹用来保存例子,供其他开发者查看模块如何使用。
这个构建系统还带来了一些其它独立的包,比如Cmakelist.txt文件(存在于每一个子目录中)和cmake的文件夹。

然后上面创建的test1文件夹中输入指令

gr_modtool add -t general -l cpp test1_1

添加一个新的模块。建议不要C++ QAcode,可能带来未知bug。
在这里插入图片描述
然后需要修改lib文件夹中的test1_1_impl.cc,如果.cc中添加了其他的函数则需要再.h中声明。
在这里插入图片描述
图中带<>的是需要修改的,修改后的代码如下参考

namespace gr {
  namespace test1 {

    test1_1::sptr
    test1_1::make( )
    {
      return gnuradio::get_initial_sptr
        (new test1_1_impl());
    }


    /*
     * The private constructor
     */
    test1_1_impl::test1_1_impl( )
      : gr::block("test1_1",
              gr::io_signature::make(<+MIN_IN+>, <+MAX_IN+>, sizeof(<+ITYPE+>)),
              gr::io_signature::make(<+MIN_OUT+>, <+MAX_OUT+>, sizeof(<+OTYPE+>)))
    {}

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

    void
    test1_1_impl::forecast (int noutput_items, gr_vector_int &ninput_items_required)
    {
      /* <+forecast+> e.g. ninput_items_required[0] = noutput_items */
    }

    int
    test1_1_impl::general_work (int noutput_items,
                       gr_vector_int &ninput_items,
                       gr_vector_const_void_star &input_items,
                       gr_vector_void_star &output_items)
    {
      const <+ITYPE+> *in = (const <+ITYPE+> *) input_items[0];
      <+OTYPE+> *out = (<+OTYPE+> *) output_items[0];

      // Do <+signal processing+>
      // Tell runtime system how many input items we consumed on
      // each input stream.
      consume_each (noutput_items);

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

  } /* namespace test1 */
} /* namespace gr */


写.cc文件的时候可以参考类似的官方写好的文件进行修改,就不用完全自己来写。

还有要修改python文件夹中的qa_test1.py文件,这个代码相当于测试.cc代码正确性。当然不写也是可以生成的。参考如下图在这里插入图片描述
然后返回上一级,创建一个build文件夹并进入,
1.输入指令cmake …/
2.输入指令make
3.输入指令make test
4.返回上一级,输入指令gr_modtool makexml test1 让工具自动生成XML文件,将block添加到GRC中。
5.回到build目录中更新文件库,即输入指令 make install。
就可以在grc界面右侧找到自己的组件了。

基础篇至此结束

  • 11
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: GNU Radio是一个开源的软件无线电平台,可以用于设计和实现各种无线通信系统。USRP(Universal Software Radio Peripheral)则是GNU Radio的硬件平台,是一系列开源的软件定义无线电设备。 对于GNu Radio和USRP的入门教程,以下是一些建议。 首先,你可以了解GNU Radio的基本概念和工作原理。可以通过阅读官方文档、教程、书籍等来获取这些基础知识。 其次,你可以学习如何使用GNU Radio进行无线通信系统的设计和仿真。可以通过参考一些案例研究和示例代码,了解如何使用GNU Radio进行信号处理、调制解调、多址技术等。 然后,你可以开始学习如何使用USRP设备。首先了解USRP的硬件结构和特性,然后学习如何配置和连接USRP设备。可以通过官方文档和教程来学习如何使用USRP设备进行无线信号的接收和发射。 最后,你可以尝试使用GNU Radio和USRP来实现一些简单的无线通信系统。可以尝试使用GNu Radio和USRP进行无线数据传输、频谱分析、调频广播接收等实验。 总的来说,学习GNU Radio和USRP需要一定的无线通信和信号处理的基础知识,同时也需要一些实践经验。通过阅读官方文档、教程等,同时结合实际操作和实验,你将能够逐渐掌握GNU Radio和USRP的使用。 ### 回答2: GNURadioUSRP是软件定义无线电开发的两个重要工具。GNURadio是一个开源的软件开发工具包,用于搭建软件定义无线电系统。而USRP(Universal Software Radio Peripheral)是一款通用的软件无线电外设,可以用于接收和发送无线电信号。 要学习GNURadioUSRP,首先需要了解软件定义无线电的基本原理和概念。可以通过阅读有关软件定义无线电的入门资料,了解它是如何工作的,以及它的应用领域和优势。 其次,可以通过学习GNURadio的使用方法来入门。可以查阅GNURadio的官方文档或教程,学习如何安装和配置GNURadio,以及如何使用它来搭建无线电系统。可以尝试一些基本的示例项目,如接收和解调FM广播信号。 接下来,可以学习USRP的使用方法。可以查阅USRP的官方文档或教程,学习如何连接和配置USRP设备。可以尝试使用USRP接收和发送无线电信号,如接收和解码数字电视信号。 在学习过程中,可以逐步深入了解GNURadioUSRP的高级功能和应用。可以学习如何使用GNURadioUSRP进行信号处理和调试,如频谱分析和信号录制。可以学习如何使用GNURadioUSRP进行通信系统的仿真和测试。 另外,可以加入相关的软件定义无线电社区或论坛,与其他开发者交流和分享经验。这样可以获取更多关于GNURadioUSRP的学习资源和实践经验。 总结来说,学习GNURadioUSRP需要一定的理论基础和实践经验。通过学习官方文档和教程,参与社区交流,不断实践和探索,可以逐步掌握GNURadioUSRP的使用方法和技巧,从而深入了解和应用软件定义无线电技术。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值