Octave 是 GNU Radio 的最流行的分析工具,因此 GNU Radio 软件包也包含它自身的一组脚本用于读取和语法分析输出。本文介绍如何使用 Octave 分析 GNU Radio 产生的数据, 并解决"error: 'read_complex_binary' undefined"这类错误信息!

1. 安装Octave

  在 Ubuntu 下使用如下命令安装 Octave

$ sudo apt-get install octave

  为了可以使用 GNURadio 的 Octave 脚本,你必须将 gnuradio 的路径添加了 Octave 的路径变量中。可以通过配置~/.octaverc文件完成。将gnuradio的路径命令添加到 .octaverc 文件中.具体方法为:

  1) 打开新终端(Ctrl + Alt + t)

$ gedit .octaverc

  2) 在.octaverc文件中输入如下, 根据gnuradio所在路径与版本自行修改, 然后保存退出即可.

addpath("/home/hao/software/gnuradio-3.7.5.1/gr-utils/octave")

  如果不执行上面的步骤, 在调用函数 read_complex_binary() 则会产生error:  error: 'read_complex_binary' undefined near line column

  从语法上分析 GNU Radio 的数据输出,最便捷的方法便是使用 GNU Radio 提供的脚本。如上安装指导所示,确保把 GNU Radio 的脚本的路径已经添加到 Octave 的路径中。这便可帮助读取那些被使用 gr.file_sink (大小、文件名) 顷倒到磁盘的数据。
下  面的方法函数是基于参数 size 的用在 gr.file_sink() 内的,它把文件名作为第一个参数、第二个参数是可选项,它表示了从文件中要读取的数量。

 read_complex_binary(): gr.sizeof_gr_complex
read_float_binary(): gr.sizeof_float
read_int_binary(): gr.sizeof_int
read_short_binary(): gr.sizeof_short
read_char_binary(): gr.sizeof_char

  比如:在 Python 脚本中,使用 gr.file_sink(gr.sizeof_gr_complex, "capture.dat") 获取了 64 位的复合数据如下:

c = read_complex_binary('capture.dat');

  从 USRP 直接能获取的数据是以 32 位复合数据形式存储的,而不是 64 位复合型 (gr.sizeof_gr_complex)。为了能读取此数据,首先,使用 read_short_binary()  然后将其分离进入 - a two dimensional vector 如下:

 d = read_short_binary(data);
c = split_vect(d, 2);

2. 安装gnuplot

  使用 Octave 来绘制数据,最简便的方法是使用 gnuplot。在 Ubuntu 上键入如下命令:

$ sudo apt-get install gnuplot gnuplot-doc

  在时间轴上的 I 和 Q,可如下分别地绘制各个元素:

plot([real(c), imag(c)])

  如下可生成一个 I/Q 曲线(x 表示 I, y 表示 Q):

plot(c)

3. 举例说明

  例子背景: LTE下行数据链路中, 每个帧1ms, 每个帧包含10个子帧, 每个子帧包含14个 OFDM 符号, 在3M带宽条件下, 其时频资源格为14 * 180的  std::vector <std::vector<gr_complex> > 类型. 在发端2天线, 收端2天线的LTE MOMI-OFDM无线通信系统中, 进行信道估计和插值后得到插值后的信道估计值, 或称信道特征矩阵. 其类型也为 std::vector <std::vector<gr_complex> > 使用如下C++程序, 将信道特征矩阵存入本地文件, 2×2 MIMO 可以得到4个信道特征矩阵(s00, s01, s10, s11):

 for (int i = ; i < d_channel_estimate_s00.size(); ++i)
{
dump_array("s00.dat", &d_channel_estimate_s00[i][], d_channel_estimate_s00[i].size());
}
for (int i = ; i < d_channel_estimate_s01.size(); ++i)
{
dump_array("s01.dat", &d_channel_estimate_s01[i][], d_channel_estimate_s01[i].size());
}
for (int i = ; i < d_channel_estimate_s10.size(); ++i)
{
dump_array("s10.dat", &d_channel_estimate_s10[i][], d_channel_estimate_s10[i].size());
}
for (int i = ; i < d_channel_estimate_s11.size(); ++i)
{
dump_array("s11.dat", &d_channel_estimate_s11[i][], d_channel_estimate_s11[i].size());
}

  其中dump_array()函数的定义如下:

 template <typename T>
static void dump_array(const char* filename, T* arr, int len)
{
std::string sname = filename;
FILE* f = fopen(sname.c_str(), "ab+");//"ab+"是可读可写追加方式的打开一个二进制文件
fwrite(arr, sizeof(T), len, f);//fwrite(buffer, size, count, fp);//从buffer地址读size*count个字节写到f文件中.
fclose(f);
}

  如果数据为 std::vector<gr_complex> 类型, 可以这样调用dump_array()函数

 dump_array("fd_user_data_subf_1tx1rx_before.dat", &fd_user_data[], fd_user_data.size());

  使用 Octave 对这4个信道特征矩阵(s00, s01, s10, s11)进行分析, 代码如下(文件名为test.m):

 a = read_complex_binary('s00.dat', );
plot(abs(a), 'b+');
title("");
figure; b = read_complex_binary('s01.dat', );
plot(abs(b), 'ro');
title("");
figure; c = read_complex_binary('s10.dat', );
plot(abs(c), 'g-');
title("");
figure; d = read_complex_binary('s11.dat', );
plot(abs(d), 'bo');
title("");

  运行程序:

$ octave
octave:> test

  注意: 如果没有把 gnuradio 的脚本的路径已经添加到 Octave 的路径中, 将会有如下提示错误

error: 'read_complex_binary' undefined near line  column 

4. 使用Octave画星座图:

以QPSK调制为例, 用前面所述的dump_array()函数, 将接收端均衡前后的数据存到文件里, 然后使用Octave处理数据, 程序如下:(文件名: plot_scatter.m)

 a  = read_complex_binary('before.dat', );
a1 = real(a);
a2 = imag(a);
scatter(a1, a2);
title("Before Equalization");
figure; b = read_complex_binary('after.dat', );
b1 = real(b);
b2 = imag(b);
scatter(b1, b2);
title("After Equalization");

运行结果如下, 左图为均衡前, 又图为均衡后

用Python作为Octave和Matlab之外的另一个选择
  很有可能你已经安装了一些Python的科学分析包,例如SciPy和NumPy (特别是Matplotlib)。利用这些工具,你可以使用Python来绘制或者分析数据。

本文地址:

http://www.cnblogs.com/moon1992/p/5717706.html

参考连接:

viewing data in octave

如何用Octave对GNURadio的数据进行分析

使用Octave分析GNU Radio的数据的更多相关文章

  1. [SDR] GNU Radio 系列教程(二) —— 绘制第一个信号分析流程图

    目录 1.前言 2.启动 GNU Radio 3.新增块 4.运行 本文视频 参考链接 1.前言 本文将介绍如何在 GNU Radio 中创建和运行第一个流程图. 2.启动 GNU Radio GNU ...

  2. GNU Radio 入门培训

    1. GNU Radio介绍 1.1 什么是GNU Radio GNU Radio是一个完全开源的软件无线电结构平台,它可以用来设计和仿真,也可以用来连接真实的无线电系统.GNU Radio是一个高度 ...

  3. [SDR] GNU Radio 系列教程(一) —— 什么是 GNU Radio

    目录 1.GNU Radio 是什么 2.我为什么要用 GNU Radio 3.数字信号处理 3.1 一点信号理论 3.2 将数字信号处理应用于无线电传输 4.基于流程图的模块化数字信号处理方法 本文 ...

  4. GNU Radio: Overview of the GNU Radio Scheduler

    Scetion 1: The Flowgraph The flowgraph moves data from sources into sinks. 一个流图由多个模块组成,其中一般包括信源(Sour ...

  5. GNU Radio: Synchronization and MIMO Capability with USRP Devices

    Application Note Synchronization and MIMO Capability with USRP Devices Ettus Research Introduction S ...

  6. GNU Radio: USRP2 and N2x0 Series

    Comparative features list 相对性能清单 Hardware Capabilities: 1 transceiver card slot External PPS referen ...

  7. GNU Radio在SDR领域的应用

    1 Software Defined Radio 软件无线电(Software Defined Radio,SDR)是一种实现无线通信的新概念和体制.其中以往只能在硬件中实现的组件(例如混频器,滤波器 ...

  8. 【译】GNU Radio How to write a block 【如何开发用户模块及编写功能块】

    本文讲解如何在GNU Radio中添加用户开发的信号处理模块,译文如有不当之处可参考原文地址:http://gnuradio.microembedded.com/outoftreemodules Ou ...

  9. GNU Radio Radar Toolbox

    GNU Radio Radar Toolbox Install guide Change to any folder in your home directory and enter followin ...

随机推荐

  1. 初识async函数

    为什么会出现async函数 首先从大的方面来说,出现async函数时为了解决JS编程中的异步操作,再往具体说就是为了对以往异步编程方法的一种改进,也有人说仅仅只是Generator 函数的语法糖,这个 ...

  2. MBProgressHUD基础用法

    MBProgressHUD版本号:0.9.2以前用MBProgressHUD用得挺好的,基本上 - (void)showAnimated:(BOOL)animated whileExecutingBl ...

  3. C++面向对象高级编程(八)模板

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 这节课主要讲模板的使用,之前我们谈到过函数模板与类模板 (C++面向对象高级编程(四)基础篇)这里不再说明 1.成员模板 成员模板:参数为tem ...

  4. Win10启动盘制作工具

    Rufus https://rufus.akeo.ie/ http://www.iplaysoft.com/windows-10-udisk-install.html

  5. js函数的伪重载

    这也是今天写东西是遇到的一个问题,导致我联想起了函数重载的问题. 在javascript中是没有函数重载机制的,对于用惯了java开发的同学可能就表示吃惊了,我屮艸芔茻,函数 没有重载?那怎么搞?!! ...

  6. Xcode 9 俩个你必须知道的新功能

    Xcode 9 beta 版已经可以下载了,不知道大家伙对这个新版本开发工具看法如何,最近我费了一番周折终于体验了一把,升级系统,下载Xcode,验证安装扒拉扒拉什么的,几乎搞了我一天,我做开发使用的 ...

  7. 解决tensorflow的Session Exception问题

    Exception ignored in: <bound method BaseSession.__del__ of <tensorflow.python.client.session.S ...

  8. windows cmd 命令行 —— 进程与服务

    1. 进程查看与操作 tasklist tskill pid 2. 服务查看与操作 net start net stop

  9. vue 之node.js 02

    文档 铺垫 以前网页制作web1.0 如今是web2.0-->交互式操作 前端工具 grunt gulp webpack :打包机 作用:将项目中的js,css,img,font,html等进行 ...

  10. 模仿QQ气泡聊天

    尝试了几种方案,想模仿QQ的气泡聊天,总是不尽如意.网上倒是大把的Android和Html的例子,Delphi的没找着,只能自己试着折腾. 1. 用WebBrowser加载本地html,屡次折腾,失败 ...