目录
1.软件环境*
本文运行环境是Ubuntu 18.04 + UHD3.14.1 + Gnuradio3.8.2.0.
参考1安装Ubuntu 18.04,参考2安装UHD3.14.1,参考3:安装gnuradio3.8.2
查看版本号
uhd_find_devices
uhd_usrp_probe
gnuradio-config-info -v
注意
- 有Gnuradio3.7系列版本先卸载,语句依次为
cd gnuradio/build/
和sudo make uninstall
- 有需求卸载uhd,语句依次为
cd uhd/host/build/
和sudo make uninstall
- 下载gnuradio安装源码:https://www.gnuradio.org/releases/gnuradio/
- 下载gnuradio依赖库:wiki.gnuradio.org,
- Gnuradio3.8.2.0.安装时先安装依赖库再安装软件,依赖库具体的指令
sudo apt install git cmake g++ libboost-all-dev libgmp-dev swig python3-numpy python3-mako python3-sphinx python3-lxml doxygen libfftw3-dev libsdl1.2-dev libgsl-dev libqwt-qt5-dev libqt5opengl5-dev python3-pyqt5 liblog4cpp5-dev libzmq3-dev python3-yaml python3-click python3-click-plugins python3-zmq python3-scipy
- GNURadio3.8.2.0安装出现环境配置错误ModuleNotFoundError,打开
gedit $HOME/.bashrc
配置环境变量,文档最下方依此输入配置export PYTHONPATH=/usr/local/lib/python3/dist-packages:/usr/local/lib/python3.6/dist-packages:$PYTHONPATH
和export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
,终端输入gnuradio-companion
打开gnuradio软件
2.简介
2.1.OOT模块(Out-Of-Tree Module)
OOT模块是指Gnuradio中并不包含的模块资源,用户根据需求自己定义来制作。编写OOT模块的方法多种,推荐采用gr_modtool工具(安装Gnuradio时默认已安装)。4
2.2.大纲
创建自定义 C++ 模块并在流程图中使用它:
- 使用 gr_modtool 创建新的 C++ 块
- 修改 C++ .h 和 .cc 代码,以便块正常工作
- 修改 YAML 文件,以便可以在 GRC 中读取它
- 在流程图中安装并运行模块
主要指令
1.gr_modtool newmod ootzir
2.cd gr-ootzir/
3.ls
4.gr_modtool add addzir
5.sync
6.cpp
7.xx
8.
9.n
10.n
11.gedit lib/addzir_impl.cc
12.gedit grc/ootzir_addzir.block.yml
13.rm -rf build/
14.mkdir build
15.cd build
16.cmake ..
17.make
18.sudo make install
19.sudo ldconfig
20.gnuradio-companion
注意:前后块名称和代码内容存在不一致,是因为多次调试导致,取合适自己的名字即可
3.内容
3.1.创建gr_modtool目录
打开终端并导航到用于编写软件的相应目录,例如主目录:
cd $HOME
GNU Radio 附带了 gr_modtool,这是一种用于创建树外 (OOT) 模块的软件工具。OOT 模块可以看作是自定义 GNU Radio 模块的集合。使用 gr_modtool 创建名为 customModule 的 OOT 模块:
gr_modtool newmod customModule
创建目录 gr-customModule,其中包含 OOT 模块的所有框架代码,但它还没有任何块。移动到 gr-customModule 目录:
cd gr-customModule
列出 OOT 模块中的所有文件和目录:
ls
最终展示结果如下:
3.2.创建 OOT 块
添加一个名为 multDivSelect 的新块:
gr_modtool add multDivSelect
将显示块的类型:
输入 sync 作为块类型,因为我们正在制作的块将在输出端口上为它从输入端口消耗的每个项目生成相同数量的输出项目。有关可用不同块类型的详细信息,请参阅块类型。5
Enter block type: sync
输入 cpp 作为语言:
Language (python/cpp): cpp
Language: C++
Block/code identifier: multDivSelect
输入版权所有者的名称或组织(可能没有):
Please specify the copyright holder: YourName
OOT 块允许 gnuradio-companion 用户指定一个选择器值,该值在 C++ 级别是一个布尔值(真/假)。要实现这一点,我们需要输入如下所示的 C++ 表达式,该表达式声明默认值为 true 的选择器变量作为 OOT 块的参数:
Enter valid argument list, including default arguments:
bool selector=true
选择是否需要 QA 代码:
Add Python QA code? [Y/n] n
Add C++ QA code? [Y/n] n
然后将创建或修改多个文件:
Adding file 'lib/multDivSelect_impl.h'...
Adding file 'lib/multDivSelect_impl.cc'...
Adding file 'include/gnuradio/customModule/multDivSelect.h'...
Adding file 'python/customModule/bindings/docstrings/multDivSelect_pydoc_template.h'...
Adding file 'python/customModule/bindings/multDivSelect_python.cc'...
Adding file 'grc/customModule_multDivSelect.block.yml'...
Editing grc/CMakeLists.txt...
最终展示结果如下:
3.3.修改 C++ impl.h 标头
许多文件是自动生成的包装代码,不需要修改。但是,multDivSelect_impl.h 和 multDivSelect_impl.cc 文件定义了块的操作,必须进行修改。使用文本编辑器打开文件:
gedit lib/multDivSelect_impl.h
显示以下代码:
创建一个布尔值私有成员_selector,该成员将保存 selector 参数的值:
class multDivSelect_impl : public multDivSelect
{
private:
bool _selector;
结果显示如下:
按 CTRL + S 保存文件
3.4.修改C++ impl.cc 文件
需要修改 .cc 文件以定义块的所需操作。使用文本编辑器打开文件:
gedit lib/multDivSelect_impl.cc
删除编译指示消息并定义要gr_complex的输入和输出类型:
using input_type = gr_complex;
using output_type = gr_complex;
更新为两个输入,并使用 multDivSelector_impl.h 中定义的私有成员_selector存储选择器参数的值:
/*
* The private constructor
*/
multDivSelect_impl::multDivSelect_impl(bool selector)
: gr::sync_block("multDivSelect",
gr::io_signature::make(
2 /* min inputs */, 2 /* max inputs */, sizeof(input_type)),
gr::io_signature::make(
1 /* min outputs */, 1 /*max outputs */, sizeof(output_type)))
{
_selector = selector;
}
结果显示如下:
通过删除 pragma 消息来修改 work() 函数,定义对应于两个输入端口的变量 in0 和 in1,如果 _selector 为 true,则将两个输入相乘,如果 _selector 为 false,则将它们除以:
int multDivSelect_impl::work(int noutput_items,
gr_vector_const_void_star& input_items,
gr_vector_void_star& output_items)
{
auto in0 = static_cast<const input_type*>(input_items[0]);
auto in1 = static_cast<const input_type*>(input_items[1]);
auto out = static_cast<output_type*>(output_items[0]);
for (int index = 0; index < noutput_items; index++) {
if (_selector) { out[index] = in0[index] * in1[index]; }
else{ out[index] = in0[index] / in1[index]; }
}
// Tell runtime system how many output items we produced.
return noutput_items;
}
结果显示如下:
按 CTRL + S 保存文件
3.5.修改 YAML .yml文件
gnuradio-companion 使用 YAML(另一种标记语言)格式的文件来了解我们的 OOT 块以及如何调用它。有关此类文件的更多信息,可以在 YAML GRC6页面中找到。
使用文本编辑器打开我们区块的 YAML 文件:
gedit grc/customModule_multDivSelect.block.yml
更新输入端口和输出端口定义:
inputs:
- label: in0
domain: stream
dtype: complex
- label: in1
domain: stream
dtype: complex
outputs:
- label: out0
domain: stream
dtype: complex
结果显示如下:
按 CTRL + S 保存文件
3.6.编译和安装块
该块需要编译和安装。确保您位于 gr-customModule 目录中:
cd your-path/gr-customModule
如果 build/ 目录已存在,请将其删除:
rm -rf build/
创建构建目录:
mkdir build
进入构建目录:
cd build
运行 cmake 以构建 makefile:
cmake ..
编译模块:
make
安装模块:
sudo make install
某些文件被列为“最新”,因为它们对应于在使用 gr-modtool 创建 Python OOT 教程中创建的 addSubSelect 块。现在,与 multDivSelect 对应的所有文件都安装到 /usr/local/ 中。
运行 ldconfig 以更新 customModule 库的链接:
sudo ldconfig
3.7.在流程图中使用自定义模块
运作软件后,右侧有oot模块可用,拖拽到工程框图页面