You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GNU Radio中暂停信号输出并实现1秒发送1秒停顿

在GNU Radio中实现信号暂停与定时循环传输

一、暂停信号输出的常用方法

  • 幅值置零法:在信号流中插入Multiply Const模块,将其常数参数绑定到可调节变量(比如通过GUI滑块控制)。暂停时把变量设为0,信号输出被置零;恢复时设为1即可。这种方法不中断流图运行,兼容性好。
  • 消息流控制法:如果是基于消息的传输(比如用Message Strobe/File Source输出消息),使用Message Gate模块开关消息传递。关闭闸门时暂停发送,打开后恢复。
  • 采样率控制法:给Throttle模块的采样率参数绑定变量,暂停时将采样率设为0,恢复时改回原采样率。注意部分模块对0采样率兼容性较差,优先推荐前两种方法。

二、实现1秒发送、1秒停顿的循环传输

针对你包含preamble、有效位、CRC32的固定二进制序列,推荐以下几种方案:

方案1:流图模块组合实现(无需代码)

  1. 生成固定序列:用Vector Source模块导入你的二进制数据(或File Source读取预存的二进制文件),勾选模块的"Repeat"选项实现循环输出。
  2. 时序控制:添加Periodic Clock模块,设置周期为2秒、占空比50%(即1秒高电平、1秒低电平),将其输出绑定到Multiply Const的常数变量上。
  3. 速率匹配:用Throttle模块调整采样率,确保二进制序列刚好在1秒内发送完毕。比如序列长度为N比特,采样率设为N,就能保证1秒发完一遍。

方案2:自定义Python Block精确控制

如果需要更灵活的时序,可编写简单的Python Block实现:

import time
from gnuradio import gr

class tx_cycle(gr.sync_block):
    def __init__(self, tx_data, sample_rate):
        gr.sync_block.__init__(self,
            name="tx_cycle",
            in_sig=None,
            out_sig=[gr.sizeof_char*1])
        self.tx_data = tx_data
        self.sample_rate = sample_rate
        self.data_len = len(tx_data)
        self.start_ts = time.time()

    def work(self, input_items, output_items):
        out = output_items[0]
        elapsed = (time.time() - self.start_ts) % 2

        if elapsed < 1:
            # 发送阶段:循环填充数据到输出
            for idx in range(len(out)):
                out[idx] = self.tx_data[(self.nitems_written(0) + idx) % self.data_len]
            return len(out)
        else:
            # 停顿阶段:输出0
            out[:] = 0
            return len(out)

将该Block添加到流图中,传入你的二进制序列和对应采样率,即可实现精准的1秒发送、1秒停顿循环。

方案3:消息流定时控制

如果用消息流传输:

  1. 将二进制序列打包为消息,用Message Strobe设置每隔2秒发送一次完整序列。
  2. 配合Timed Command模块,控制Message Gate在消息发送后关闭1秒,再自动打开,形成循环。

内容的提问来源于stack exchange,提问作者user19104274

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 10:40:33