关于GNU Radio中gr-inspector的CSV数据保存及端口适配问题咨询
解决gr-inspector map_out端口数据保存为CSV的问题
核心数据类型说明
gr-inspector的map_out端口输出的是pmt::map类型(GNU Radio的多态键值对结构),这类数据通过消息流传递,不是普通采样数据流,所以Python块不能用普通流输入,得用消息端口接收。
Python块配置与代码实现
GRC里的Python块配置
- 添加Python块后,在端口设置里把输入类型改成
Message(不要选Stream),端口名可设为in。 - 在块的属性里,将
Callback设为处理消息的函数名,比如handle_pmt_map。
- 添加Python块后,在端口设置里把输入类型改成
Python代码实现
以下是可直接使用的示例代码,负责解析pmt map并写入CSV:import numpy as np import pmt import csv from gnuradio import gr class pmt_to_csv(gr.sync_block): def __init__(self, csv_filename="signal_data.csv"): gr.sync_block.__init__( self, name="PMT to CSV", in_sig=None, # 用消息端口,流输入设为None out_sig=None ) # 注册消息输入端口 self.message_port_register_in(pmt.intern("in")) self.set_msg_handler(pmt.intern("in"), self.handle_pmt_map) # 初始化CSV文件并写入表头 self.csv_file = open(csv_filename, 'a', newline='') self.writer = csv.writer(self.csv_file) # 表头根据gr-inspector实际输出的键调整,以下是常见字段 self.writer.writerow(["center_freq", "bandwidth", "snr", "signal_type"]) def handle_pmt_map(self, msg): # 将pmt消息转换为Python字典 pmt_map = pmt.to_python(msg) if isinstance(pmt_map, dict): # 提取目标字段,可根据实际输出调整 data_row = [ pmt_map.get("center_freq", ""), pmt_map.get("bandwidth", ""), pmt_map.get("snr", ""), pmt_map.get("signal_type", "") ] self.writer.writerow(data_row) # 强制刷新缓冲区,避免数据丢失 self.csv_file.flush() def stop(self): # 程序停止时关闭文件 self.csv_file.close() return True
注意事项
- 若不清楚gr-inspector输出的pmt map包含哪些键,可在
handle_pmt_map函数中添加print(pmt_map),运行后查看终端输出的键值对,再调整CSV表头和提取字段。 - 确保CSV文件路径有写入权限,避免报错。
- 测试时可先运行短流程,检查CSV文件是否正确生成数据。
内容的提问来源于stack exchange,提问作者Carmi
相关产品推荐
相关产品推荐

