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. Emacs Helm: 使用关键字搜索、获取、执行任何东西

    Helm 是一个emacs的软件包,定义了一个通用框架,交互式地.动态缩减式地使用关键字选择.获取.执行任何东西.比如: 执行emacs 命令 打开文件 查看man文档 执行grep操作 执行apt命 ...

  2. HDU 4734 F(x) ★(数位DP)

    题意 一个整数 (AnAn-1An-2 ... A2A1), 定义 F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1,求[0..B]内有多少 ...

  3. iOS-如何写好一个UITableView

    如何写好一个UITableView 字数5787 阅读3745 评论25 喜欢69 本文是直播分享的简单文字整理,直播共分为上.下两部分.第一部分:优酷 Or YouTube,第二部分:优酷 Demo ...

  4. [转载]Java生成Word文档

    在开发文档系统或办公系统的过程中,有时候我们需要导出word文档.在网上发现了一个用PageOffice生成word文件的功能,就将这块拿出来和大家分享. 生成word文件与我们编辑word文档本质上 ...

  5. 转载:【Oracle 集群】RAC知识图文详细教程(二)--Oracle 集群概念及原理

    文章导航 集群概念介绍(一) ORACLE集群概念和原理(二) RAC 工作原理和相关组件(三) 缓存融合技术(四) RAC 特殊问题和实战经验(五) ORACLE 11 G版本2 RAC在LINUX ...

  6. LeetCode OJ:Gas Station(加油站问题)

    There are N gas stations along a circular route, where the amount of gas at station i is gas[i]. You ...

  7. iOS实现程序长时间未操作退出

    大部分银行客户端都有这样的需求,在用户一定时间内未操作,即认定为token失效,但未操作是任何判定的呢?我的想法是用户未进行任何touch时间,原理就是监听runloop事件.我们需要进行的操作是创建 ...

  8. EasyPlayer RTSP Windows(with ActiveX/OCX插件)播放器支持H.265播放与抓图功能

    EasyPlayer作为业界一款比较优秀的RTSP播放器,一直深受用户的好评,经过了近3年的开发和迭代,从一开始的简单PC版本的RTSP播放功能,到如今支持PC(支持ocx插件).Android.iO ...

  9. JMter压力测试

    一. 压力测试场景设置 一般我们在做压力测试的时候,分单场景和混合场景,单场景也就是咱们压测单个接口的时候,多场景也就是有业务流程的情况下,比如说一个购物流程,那么这样的场景就是混合场景,就是有多个接 ...

  10. 理解Scala中的Extractor

    引言 最近抱着<Programming in Scala>(英文第二版)在死啃Scala.在阅读第26章Extractor时,偶然在Stack Overflow上搜到一个帖子<Sca ...