如何在gnuradio中测试源块

时间:2016-01-19 03:14:21

标签: python gnuradio

我正在尝试在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")

任何人都可以帮我弄清楚我哪里出错了或者指出了我正确的方向吗?

1 个答案:

答案 0 :(得分:4)

有几件事:

默认情况下,流程图将一直运行,直到它被告知停止。所以这就是你的记忆被咀嚼的原因。 GNU Radio正在抛出std::bad_alloc,因为你在vector_sink中继续填充内容并最终耗尽RAM。

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

  • 从块的WORK_DONE函数返回work( - 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)