如何修改Python编写的GNURadio单输出QA测试代码适配双异类型输出
如何调整GNURadio QA测试代码以测试复数和浮点型双输出模块?
我已编写一个具有1个输入、2个输出的GNURadio模块,目前正在用Python编写QA测试代码。以下是用于测试1输入1输出模块的代码,请问如何调整该代码以测试两种不同类型(复数和浮点型)的输出?
src_data = (0, 1, -2, 5.5, -0.5) expected_result = (0, 2, -4, 11, -1) src = blocks.vector_source_f (src_data) mult = multiply_py_ff (2) snk = blocks.vector_sink_f () self.tb.connect (src, mult) self.tb.connect (mult, snk) self.tb.run () result_data = snk.data () self.assertFloatTuplesAlmostEqual (expected_result, result_data, 6)
刚好做过类似的GNURadio模块测试,给你捋清楚怎么调整代码:
核心思路是分别处理两个输出端口,用对应数据类型的Sink接收结果,再用GNURadio QA框架提供的对应断言方法验证。假设你的模块输入是浮点型,第一个输出为浮点、第二个为复数(如果类型顺序反过来,调整端口索引就行),调整后的完整测试代码如下:
def test_my_dual_output_module(self): # 1. 准备测试数据与预期结果 src_data = (0, 1, -2, 5.5, -0.5) # 输入浮点数据 # 预期的浮点输出(根据你的模块功能自定义) expected_float_out = (0, 2, -4, 11, -1) # 预期的复数输出(根据你的模块功能自定义,比如转复数后加虚部1) expected_complex_out = (0+0j, 1+1j, -2+1j, 5.5+1j, -0.5+1j) # 2. 创建流图组件 src = blocks.vector_source_f(src_data) # 替换成你的双输出模块实例,比如 my_custom_module() dual_out_module = my_custom_module() # 对应类型的Sink:浮点用vector_sink_f,复数用vector_sink_c float_sink = blocks.vector_sink_f() complex_sink = blocks.vector_sink_c() # 3. 连接流图:指定模块的输出端口 self.tb.connect(src, dual_out_module) self.tb.connect(dual_out_module[0], float_sink) # 连接第一个输出端口(浮点) self.tb.connect(dual_out_module[1], complex_sink) # 连接第二个输出端口(复数) # 4. 运行流图并清理 self.tb.run() self.tb.stop() self.tb.wait() # 确保流图完全停止 # 5. 获取结果并验证 float_result = float_sink.data() complex_result = complex_sink.data() # 浮点结果用assertFloatTuplesAlmostEqual验证 self.assertFloatTuplesAlmostEqual(expected_float_out, float_result, 6) # 复数结果用GNURadio QA提供的assertComplexTuplesAlmostEqual验证 self.assertComplexTuplesAlmostEqual(expected_complex_out, complex_result, 6)
几个关键注意点:
- 模块的输出端口索引从0开始,如果你模块的第一个输出是复数、第二个是浮点,只需要调换
dual_out_module[0]和dual_out_module[1]对应的Sink即可 - 复数预期值可以用
x+yj的字面量形式,或者complex(x, y)函数创建 - 一定要调用
stop()和wait(),避免流图资源未释放导致后续测试出错 - 如果你的模块输入是复数类型,只需要把
vector_source_f换成vector_source_c,对应调整输入数据格式就行
内容的提问来源于stack exchange,提问作者Alex Rosa
相关产品推荐
相关产品推荐

