【问题标题】:How to test source blocks in gnuradio如何在 gnuradio 中测试源代码块
【发布时间】:2016-04-24 09:41:01
【问题描述】:

我正在尝试在 gnuradio 中创建一个简单的源代码块。我已经使用 gr_modtool 创建了基本模块和块,但是每当我尝试运行测试时,它很快就会耗尽我所有的内存并且我的计算机开始滞后。更糟糕的是,测试失败了 "thread[thread-per-block[1]: ]: std::bad_alloc"

这是我的块(称为 csv):

import numpy
from gnuradio import gr

class csv(gr.sync_block):
    """
    docstring for block csv
    """
    def __init__(self, filename):
        gr.sync_block.__init__(self, name="csv",
                               in_sig=None,
                               out_sig=[numpy.float32])


    def work(self, input_items, output_items):
        out = output_items[0]
        out[:] = 0
        return len(output_items[0])

这是我用来测试的代码:

from gnuradio import gr, gr_unittest
from gnuradio import blocks
from csv import csv

import time

class qa_csv (gr_unittest.TestCase):

    def setUp (self):
        self.tb = gr.top_block ()

    def tearDown (self):
        self.tb = None

    def test_001_t (self):
        expected = [0.0]

        # set up fg
        c = csv(None)
        sink = blocks.vector_sink_f()
        self.tb.connect(c, sink)

        self.tb.run()

        # check data
        results = sink.data()
        self.assertFloatTuplesAlmostEqual(expected, results)

if __name__ == '__main__':
    gr_unittest.run(qa_csv, "qa_csv.xml")

谁能帮我找出哪里出错或指出正确的方向?

【问题讨论】:

    标签: python gnuradio


    【解决方案1】:

    两件事:

    默认情况下,流程图将一直运行,直到被告知停止。所以这就是为什么你的记忆被咀嚼了。 GNU Radio 正在抛出 std::bad_alloc,因为你一直在 vector_sink 中塞东西,最终它耗尽了 RAM。

    您需要停止流程图。有几种方法可以做到这一点:

    • 从块的work 函数返回WORK_DONE (-1)。这适用于当块有有限数量的数据要服务然后发出它完成的信号时。以vector_source 为例。

    • 使用head block,它将复制N个样本,然后为您返回WORK_DONE这对于单元测试很有用。

    最后一点:一旦你开始工作,你的测试仍然会失败(除非你请求 head 只复制 1 个样本),因为当你编写它时,你的源块将用零填充它的整个输出缓冲区调用时间:

    >>> import numpy as np
    >>> out = np.empty(10, dtype=float)
    >>> out[:] = 0
    >>> out
    array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])
    

    所以只要确保您的 expected 数组具有您从 head 请求的相同数量的样本:

    >>> from gnuradio import gr, blocks
    >>> n = 1000
    >>> head = blocks.head(gr.sizeof_float, n)
    >>> expected = np.zeros(n)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-29
      • 1970-01-01
      • 2014-09-16
      • 2013-03-12
      • 1970-01-01
      • 2017-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多