使用GRC开发交互式项目 - Part 1
当我开始使用GRC来开发Nutaq demonstration projects到时候,我发现GRC是一个快速、易用的开发环境。在GRC中,你可以用用户输入的组件去快速实现一个信号检测的GUI。可是,我想,这几乎是一个线性的工作流程:源模块->处理模块->仿真模块,而没有反馈机制。虽然用户可以在GUI中查看时域频域和动态改变项目的参数,但是这种反馈机制的确实限制了其应用范围。
如果我直接用python去写一个应用,我可以用任何我需要用的算法,但是我喜欢基于模型的GRC环境。GRC让你很容易理解一个设计,而非通过阅读上百行的代码。
另一种开发自己定制blocks的方法是使用更多复杂的算法或者整合状态机到我的数据流中。这种方式更加吸引人。但是免不了需要写数行代码,这个导致GRC不能不言自明。
最近,我发现Measurement Tools中probe block的存在。用这些模块,数据流可以被转化为变量。一旦你能拿到这些变量,你可以用算法和数学方式去应用反馈到项目参数中去。这正是我在寻找的。
Probe blocks
Probe Signal
Probe Signal block将数据流转化成一个变量中。为了获取当前数据流的值,必须调用其level函数。这个函数是异步于数据流的,它仅仅可以检测当前数据流的值,而非每一个采样点。其他blocks如Probe Signal Vector可以轮询一个向量流的值,Probe Rate可以轮询一个数据流的平均吞吐量。
在一个Python项目中,the Probe Signal的level函数需需要被执行去获取当前值。
val = self.probe.level()
因为在GRC中这个函数不能直接被调用,所以Function Probe block需要使用
Function Probe
这个Function Probe block用来以某一速率调用另一个
GNU Radio Companion
- 目标
- 用标准的模块或库创建流图
- 学习调试流图
- 理解GNU Radio中的采样和throttle
- 学习使用文档理解模块的功能
- 学习前提
- git的基本知识
- GNU Radio 3.7.4或者更新版本
- Tutorial 1
2.1. 建立教程
开始之前,我解释一些如何规划整个教程。Github上的教程包括了所有的图片、grc文件和模块文件。我们可以参考这些文件,但是为了学习和增长经验,我们需要自己去时间。所以,我建立俩个文件夹,一个存放专门存放solutions,另外一个专门存放work:
/home/user/gnuradio/tutorials/solutions
/home/user/gnuradio/tutorials/work
2.1.1 克隆仓库
开始之前,我们需要克隆仓库。首先,打开终端并切到solutions目录。克隆仓库到本地。
$ git clone https://github.com/gnuradio/gr-tutorial
2.1.2 安装模块
在被克隆的仓库中,我们运行以下命令,编译安装solutions
mkdir build
cd build
cmake ..
make -j8
sudo make install
sudo ldconfig
如果我们想要自己去做这些教程,我们可以卸载这些模块。
sudo make uninstall
sudo ldconfig
2.2 了解GRC
我们在Tutorial1中已经知道GNU Radio是一个工具的集合,可以用来开发软件无线电。在这个教程中,我们将要探索如何使用GRC(GNU Radio的图形化工具)。GRC允许我们图形化创建Python文件,而不是单单使用命令和代码。
在终端(ubuntu:ctrl+alt+t)中打开gnuradio-companion,让我们开始GRC的学习之旅。
$ gnuradio-comp
其实么,不准备翻译这个的,因为确实这一节废话比较多,但是呢,为了完整性,所以还是花了点时间稍微翻译了一下。所以不细致的地方勿喷。
GNU Radio和Software Radio的介绍
什么GNU Radio?
GNU Radio是一个能够使用户独立设计、仿真、部署高性能的无线电系统。它是一个高度模块化、面向流程图的架构。这让我们可以可容易理解处理过程,并用来解决复杂的信号处理问题。
GNU Radio目前已经有许多方面的应用,比如音频处理、移动通信、卫星追踪、雷达系统、GSM、DRM等等。
它自身并不需要特定硬件平台的支持。它也不为特定的无线电通信标准(例如,802.11,ZigBee,LTE等)提供开箱即用的应用,但是它可以(并且已经被)用于开发基本上任何频带限制通信标准。(这段来着谷歌翻译)
为何需要GNU Radio?
以前,开发无线通讯设备时,工程师不得不开发特定的芯片来编码或者解码特定的发射信号,还要给这些东西debug
Software-Defined Radio(SDR),即软件无线电,采取模拟信号处理,并且在屋物理和经济可行的情况下,将其移动到计算机上处理无线电信号。
当然,你可以在从头开始编写的程序中使用计算机连接的无线电设备,根据需要连接算法以及自己移入和移出数据。但这很快变得麻烦:为什么要重新实现标准过滤器?为什么你必须关心数据在不同处理块之间如何移动?使用高度优化和对等处理的实现方式不是比自己写更好吗?你又如何使你的程序在多核架构上运行流畅,但在嵌入式设备上也同样运行良好并消耗很少的功率?
GNU Radio是专用于为商用计算机写信号处理程序的框架。GNURadio提供了许多可复用的模块和标准算法库,并对大量通用平台进行了高度优化,因此其具有很高的扩展性。它还自带了许多例子,以供新手开始学习。
数字信号处理
作为一个软件框架,GNU Radio致力于数字化信号,使用通用计算机来实现通信功能。
一个小小的信号理论
数字信号处理需要处理的信号是数字的。但是什么是数字信号。为了更好的理解,让我们看一个普通的信号场景:用一个手机记录声音。
物理上,人说话会产生一个声信号。在
最近在学校做GNU Radio,因为毕设要用到这个,所以在阅读官网教程的时候,因为个人英文水平虽然可以阅读英文文档,但是读完之后却很难组织起一个架构,所以还是决定翻译一下。一来,练习自己的英文。二来,整理自己的思路
目前还在更新中。翻译完一篇文档,会更新到这里来。至于我翻译的是哪里,对照官网一看便知晓啦。当然了,得自备梯子啦。
The tutorials:
大概俩年前在linux(redhat)开发过arm上的驱动,开发断断续续持续了一年的时间。从去年11月份之后就很少再接触linux上的东西了,最近准备系统看一下基础的一些东西(计划三天),然后开始学习安全方面的东西。方便忘记的时候查看。
- 用户组 和 用户权限关系
- 创建新用户
sudo adduser <username>
- 删除用户
sudo deluser <username>
su -l <username>
切换用户groups <username>
查看用户属于哪个用户组- 只有root和sudo组用户才能给其他非sudo用户添加到sudo组
- 比如
sudo usermod -G sudo <username>
- 比如
- 创建新用户
- 文件权限
ls -a
查看所有文件(包括隐藏文件)ls -l
查看文件权限、大小、用户、用户组等信息- drw-rwx-rwx,第一个位表示文件类型(
file <filename>
),剩下九位,分成三组,对应着用户、用户组、其他用户组的权限信息。 chmod <三个数字>
改变权限chmod <u><g><o> <-|+> <rwx>
直接操作对应项
- 创建属于自己的命令
- 像系统命令那样使用,需要将命令所在的路径添加到当前shell进程的$PATH中去,
echo PATH=$PATH:<directory of custom commands>
,然后就可以任意目录下调用自定义命令 - 但是每次关闭启动shell之后,都需要进行这样的操作太麻烦,因此需要往
/home/<username>/.zshrc
中写入PATH的配置,如下echo "PATH=$PATH:<directory of custom commands> >> .zshrc
,这样每次启动shell,都会执行.zshrc中的代码,也就执行了$PATH中写入命令行所在目录的操作。不同的shell的配置文件不一样 - 修改完.zshrc这样的配置,可以
source .zshrc
来让其立即生效,source
的别名时.
,因此也可以写成. ./.zshrc
,注意区分
- 像系统命令那样使用,需要将命令所在的路径添加到当前shell进程的$PATH中去,
- 查找文件
- 主要是
find
命令,可以使用find -name - find还有其他比较强大的模式,用到的时候在看看
- 主要是