使用Octave分析GNU Radio的数据
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
参考连接:
使用Octave分析GNU Radio的数据的更多相关文章
- [SDR] GNU Radio 系列教程(二) —— 绘制第一个信号分析流程图
目录 1.前言 2.启动 GNU Radio 3.新增块 4.运行 本文视频 参考链接 1.前言 本文将介绍如何在 GNU Radio 中创建和运行第一个流程图. 2.启动 GNU Radio GNU ...
- GNU Radio 入门培训
1. GNU Radio介绍 1.1 什么是GNU Radio GNU Radio是一个完全开源的软件无线电结构平台,它可以用来设计和仿真,也可以用来连接真实的无线电系统.GNU Radio是一个高度 ...
- [SDR] GNU Radio 系列教程(一) —— 什么是 GNU Radio
目录 1.GNU Radio 是什么 2.我为什么要用 GNU Radio 3.数字信号处理 3.1 一点信号理论 3.2 将数字信号处理应用于无线电传输 4.基于流程图的模块化数字信号处理方法 本文 ...
- GNU Radio: Overview of the GNU Radio Scheduler
Scetion 1: The Flowgraph The flowgraph moves data from sources into sinks. 一个流图由多个模块组成,其中一般包括信源(Sour ...
- GNU Radio: Synchronization and MIMO Capability with USRP Devices
Application Note Synchronization and MIMO Capability with USRP Devices Ettus Research Introduction S ...
- GNU Radio: USRP2 and N2x0 Series
Comparative features list 相对性能清单 Hardware Capabilities: 1 transceiver card slot External PPS referen ...
- GNU Radio在SDR领域的应用
1 Software Defined Radio 软件无线电(Software Defined Radio,SDR)是一种实现无线通信的新概念和体制.其中以往只能在硬件中实现的组件(例如混频器,滤波器 ...
- 【译】GNU Radio How to write a block 【如何开发用户模块及编写功能块】
本文讲解如何在GNU Radio中添加用户开发的信号处理模块,译文如有不当之处可参考原文地址:http://gnuradio.microembedded.com/outoftreemodules Ou ...
- GNU Radio Radar Toolbox
GNU Radio Radar Toolbox Install guide Change to any folder in your home directory and enter followin ...
随机推荐
- CodeForces 297A Parity Game (脑补题)
题意 一个01串,可以有两种操作:①在末尾添加parity(a):②删除开头的一个字符.其中parity(a),当串中1的个数为奇数时为1,偶数时为0.问某个01串是否可以通过若干操作变成另一个01串 ...
- cookie和localstorage sessionStorage的概念、区别、使用场景
本文分为三大板块: 1 webStorage的概念 2 cookie/localStorage/sessionStorage的介绍 3 三者之间的共同点和区别 **所有代码引用均来自 作者:OBKor ...
- js 倒计时 时间戳
功能:传入一个截止时间(unix时间戳),显示倒计时 因为unix时间戳,并不等于js 的new Date().getTime()得到的那一串毫秒数,所以要在JS中使用unix时间戳,必须先转换一下u ...
- 海康威视 嵌入到web页面相关问题
因项目上面需求,接触到了海康威视的设备,要把他嵌入到web页面中,所以就开始了爬坑之路 刚开始不知道如何把设备的页面嵌入到项目的web页面中,直到我遇见了他——“WEB3.0控件开发包V1.0.9_C ...
- Falsk项目cookie中的 csrf_token 和表单中的 csrf_token实现
Flask中请求体的请求开启CSRF保护可以按以下配置 from flask_wtf.csrf import CSRFProtect app.config.from_object(Config) CS ...
- Hibernate常见配置详细解释
<!--标准的XML文件的起始行,version='1.0'表明XML的版本,encoding='gb2312'表明XML文件的编码方式--> <?xml version='1. ...
- Linux:网络配置
网络配置 1.网卡配置 vim /etc/sysconfig/network-scripts/ifcfg-eth0 1DEVICE=eth0 2 HWADDR=00:0C:29:93:41:2B 3 ...
- 基于AMBA总线的SPI协议IP核的设计与验证
https://wenku.baidu.com/view/9542213131126edb6f1a1048.html?mark_pay_doc=2&mark_rec_page=1&ma ...
- 随想录(kgdb的基本原理)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 在linux kernel调试的时候,有一种很方便的调试方法,那就是kgdb.kgdb的本质,就 ...
- 重学CPP
LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt After install ...