在运行中交换GR处理块?

时间:2013-08-26 18:37:46

标签: gnuradio

我想知道是否可以停止处理图表,将其中一个块与另一个块交换相同数量的输入/输出通道和数据类型,然后重新启动它,而不会拆除整个图形?例如:

MAX = 10000

class my_top_block(gr.top_block):
  def __init__(self, peak_hold=80):
    gr.top_block.__init__(self)
    self.sample_rate = 10e3
    self.s = gr.noise_source_f (gr.GR_UNIFORM, MAX)
    u = foo.peak_fv (MAX, peak_hold)
    self.connect(s, u)
    self.v = foo.wait_vv ()
    self.connect(u, v)
    self.t = gr.null_sink (4 * 1024)
    self.connect(v, t)

  def set_peak_record(self, record, peak_hold=80):
    self.stop()
    if record == True: 
      u = foo.peak_record_fv (MAX, peak_hold)
    else: 
      u = foo.peak_fv (MAX, peak_hold)
    self.connect(self.s, u) 
    self.connect(u, self.v) 
    self.start()

这有点人为,但我希望它能说明我的问题。谢谢!

2 个答案:

答案 0 :(得分:3)

听起来你需要在gr-basic中使用Stream Selector块:

http://lists.gnu.org/archive/html/discuss-gnuradio/2011-11/msg00228.html

将来,我认为您会发现GNURadio邮件列表是寻求GNURadio帮助的更好媒介。所有的开发人员都非常活跃在邮件列表中,但据我所知,只有我和其他几个人监控Stack Overflow的GNURadio问题=)

https://lists.gnu.org/mailman/listinfo/discuss-gnuradio

干杯,

答案 1 :(得分:1)

,您可以随意重新排列流程图,我编写的代码就像您展示的那样。为了使更改生效,您必须要做的就是在self.lock()之前加上self.unlock()。 (注意锁定/解锁对不能嵌套。)我不记得停止和启动是否具有相同的效果。

我遇到了很多特定于块的怪癖,例如:

  • hier_block2.disconnect_all打破了块的输入和输出,但单个disconnect工作正常。Now fixed.
  • 在Mac OS X上,audio.sourceaudio.sink在首次重启或解锁后停止工作。 (Being fixed.
  • blocks.throttle的计时器连续运行(所以如果你把它取出一段时间然后把它放回去,它会跑得太快直到它赶上来。)

然而,这些都可以解决,它们是特定块实现的问题,而不是重新配置流程图的基本概念。我还没有遇到任何重新配置​​一般所固有的问题。

(很可能HokieTux的答案中提及的stream_selector对于它可以处理的案例更快更可靠,但我觉得我应该报告任意重新配置是一种选择。)