zoukankan      html  css  js  c++  java
  • 使用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 1 column 3 

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

    1 read_complex_binary(): gr.sizeof_gr_complex
    2 read_float_binary(): gr.sizeof_float
    3 read_int_binary(): gr.sizeof_int
    4 read_short_binary(): gr.sizeof_short
    5 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 如下:

    1 d = read_short_binary(data);
    2 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):

     1 for (int i = 0; i < d_channel_estimate_s00.size(); ++i)
     2 {
     3     dump_array("s00.dat", &d_channel_estimate_s00[i][0], d_channel_estimate_s00[i].size());
     4 }
     5 for (int i = 0; i < d_channel_estimate_s01.size(); ++i)
     6 {
     7     dump_array("s01.dat", &d_channel_estimate_s01[i][0], d_channel_estimate_s01[i].size());
     8 }
     9 for (int i = 0; i < d_channel_estimate_s10.size(); ++i)
    10 {
    11     dump_array("s10.dat", &d_channel_estimate_s10[i][0], d_channel_estimate_s10[i].size());
    12 }
    13 for (int i = 0; i < d_channel_estimate_s11.size(); ++i)
    14 {
    15     dump_array("s11.dat", &d_channel_estimate_s11[i][0], d_channel_estimate_s11[i].size());
    16 }

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

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

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

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

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

     1 a = read_complex_binary('s00.dat', 10000);
     2 plot(abs(a), 'b+');
     3 title("00");
     4 figure;
     5 
     6 b = read_complex_binary('s01.dat', 10000);
     7 plot(abs(b), 'ro');
     8 title("01");
     9 figure;
    10 
    11 c = read_complex_binary('s10.dat', 10000);
    12 plot(abs(c), 'g-');
    13 title("10");
    14 figure;
    15 
    16 d = read_complex_binary('s11.dat', 10000);
    17 plot(abs(d), 'bo');
    18 title("11");

      运行程序:

    $ octave
    octave:1> test

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

    error: 'read_complex_binary' undefined near line 1 column 3

    4. 使用Octave画星座图:

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

     1 a  = read_complex_binary('before.dat', 10000);
     2 a1 = real(a);
     3 a2 = imag(a);
     4 scatter(a1, a2);
     5 title("Before Equalization");
     6 figure;
     7 
     8 b  = read_complex_binary('after.dat', 10000);
     9 b1 = real(b);
    10 b2 = imag(b);
    11 scatter(b1, b2);
    12 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的数据进行分析

  • 相关阅读:
    【linux】linux根文件系统制作
    【linux】UBUNTU 12.04下傻瓜式简单安装arm-linux-gcc等gnu arm toolchain交叉编译工具
    【linux】内核编译
    【linux】内核源代码下载与阅读
    Jmeter实践
    常用sql 2018.08.31
    接口用例、实践参考
    UTF自动化测试工具
    MySql 中IFNULL、ISNULL、NULLIF用法(数据库判空)
    Mysql中FIND_IN_SET()和IN区别简析
  • 原文地址:https://www.cnblogs.com/moon1992/p/5717706.html
Copyright © 2011-2022 走看看