【问题标题】:GNURadio issues with timingGNURadio 时间问题
【发布时间】:2016-12-08 04:34:09
【问题描述】:

我无法让自定义块以高频率运行。

我想使用的模块将从外部无线电接收数据。

我正在使用 Ettus USRP 块从这个收音机流式传输数据,我可以在 QT Scope 上显示它。我可以将此模块的采样率设置为 15 MHz,并且在示波器上这似乎可以正常工作。

问题:

我尝试使用 gnuradio gr_modtool 制作一个简单的块,它接受 2 个浮点数作为输入并有 0 个输出。该块具有私有成员“timer”,一个 time_t,和“counter”,一个 int。在“工作”功能中,我的代码现在只是这样做:

const float *in_i = (const float *) input_items[0];
const float *in_q = (const float *) input_items[1];

if (count == 0){
    if (*in_i > 0.5){
        timer = clock();
        count = 30000;
    }
}else{
    count --;
    if(count == 0){
        timer = clock()-timer;
        printf("Count took %d clicks, or %f seconds\n",timer,(float)timer/CLOCKS_PER_SEC);
    }
}
  // Tell runtime system how many output items we produced.
  return 0;

但是,当我运行此代码时,它需要的时间比预期的要长。 对于 30000 个周期,完成需要 0.872970,而不是所需的 0.002 秒。由于使用 gr_modtool 生成的标准 gnuradio 块是一个同步块,并且该块的输入流来自 15 MHz USRP,我本来希望这个块以相同的频率运行。目前情况并非如此。

最终我的目标是能够在一段时间内存储数据流,并将其写入具有特定格式的文件(已经存在一个块来执行此操作,但是有某种错误阻止了该块和 USRP 阻止同时工作,所以我正在尝试自己编写。)。但是,除非我能跟上 15 MHz 的采样率,否则我会丢失数据。由于这个块相当简单,我希望它能够足够快地运行以跟上。但是,输入流模块能够从无线电中提取数据并以 15 MHz 的频率输出,所以我知道我的计算机可以做到。

我怎样才能让这个自定义块运行得更快,并跟上 15 MHz 的频率?(或者,我怎样才能让这个同步块在输入流频率下运行,因为它目前没有)

【问题讨论】:

    标签: c++ gnuradio


    【解决方案1】:

    您的块没有消耗任何样本。我假设您正在编写 sync_blockwork 函数,而不是 general_work),因此您的 生产 商品数量与 消费 商品数量相同.但正如你的源代码所说:

    // Tell runtime system how many output items we produced.
    return 0;
    

    换句话说,您的块告诉 GNU Radio 它没有使用 GNU Radio 提供的任何输入,也没有产生任何输出。这意味着 GNU Radio 无能为力。您必须返回您已生成的项目数,对于同步块,这是您消耗的项目数 - 即使您是一个接收器,输出流为零!

    【讨论】:

    • 其实我在写一个 sink 块,但是当你使用 gr_modtool 来做一个 sink 时,它继承自 "sync" 块。唯一的区别是输出的 io_signature 的最小和最大数字为 0。所以我没有退回任何物品,但我仍在消费。由于返回的默认值为 noutput_items,因此我输入 0,因为我没有输出流。
    • 如前所述,接收器应该是 sync_blcok 并且它必须返回您已消费的项目数。
    • 重复一遍:要让水槽消费,你必须“生产”。
    猜你喜欢
    • 2019-01-14
    • 2020-02-07
    • 2019-01-20
    • 2021-08-26
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    相关资源
    最近更新 更多