GNU Radio 中的块类型
Block types in GNU Radio
我仍在学习 GNU Radio,我对信号处理块类型的理解有些困难。我知道如果我创建一个块,假设输入和输出 4 个样本中有 2 个样本,它将是 2 的插值器。
但是现在,我想创建一个将成为成帧器的块。因此,它将有两个输入和一个输出。该块将从第一个输入接收 n
个样本,然后从第二个输入获取 m
个输入并附加到从输入第一个接收到的样本,然后输出它们。在这种情况下,我的样本应该是字节。
请问这种情况如何处理?我这样走的路对吗?有人知道如何处理这种情况吗?
您的情况(输入 0 和输入 1 与输出具有不同的相对速率)不在 GNU sync_block
/interpolator
/decimator
"templates" 的范围内Radio有,所以你要用通用的block方式。
假设您熟悉 gr_modtool
¹,您可以使用它来添加诸如 interpolator
(相对比率 >1)、decimators
(<1)和 sync
(=1) 个方块:
-t BLOCK_TYPE, --block-type=BLOCK_TYPE
One of sink, source, sync, decimator, interpolator,
general, tagged_stream, hier, noblock.
还要注意 general
类型。使用它,您可以实现一个对输入和输出之间的关系没有任何限制的块。也就是说
- 您将不得不从输入中手动
consume()
项,因为您从输入中获取的项数不能再通过输出项数得出,并且
- 您将必须实施一个
forecast
方法来告诉 GNU Radio 调度程序对于给定的输出您需要多少项目。
gr_modtool
会给你一个存根,你只需要添加正确的代码!
¹ 如果您不是:它在 GNU Radio Guided Tutorials 的第 3 部分左右介绍,我认为您可以快速而有趣地阅读它。
考虑到这个问题是 4 年前提出的,并且从那时起 GNU Radio 发生了很多变化,我想补充一下现在可以使用 Patterned Interleaver 来解决这个问题块。
patterned_interleaver_image
此块的工作方式如下:它在左侧端口接收输入,并在右侧端口输出单个交错模式。因此,让我们想象一个具有 2 个输入 V1 和 V2 的块:
V1 = [0,1,0,0,1,1]
V2 = [1,1,1,0,1,0]
假设我们希望输出是 V1 的前 2 位,然后是 V2 的前 2 位,然后是 V1 的后 2 位,然后是 V2 的后 2 位,依此类推...即,我们希望输出为
Vo = [0,1,1,1,0,0,1,0,1,1,1,0].
为了实现这一点,我们转到 Patterned Interleaver 块的属性,如下所示:
patterned_interleaver_properties
Pattern 字段允许我们控制输入端口中的位交错的顺序。默认情况下,它们在 [0,0,1,1] 中,这意味着该块将从输入端口 0 获取 2 位,然后从输入端口 1 获取 2 位。相应的输出将是
[0,1,1,1,0,0,1,0,1,1,1,0],
即V1的前2位,V2的前2位,V1的后2位,依此类推
让我们再看一个例子。如果模式字段设置为 [0,0,1,1,1,0],则输出将是来自输入端口 0 的 2 位,然后是来自输入端口 1 的 3 位,然后是来自输入端口 0 的 1 位。在输出我们将获得 [0,1,1,1,1,0,0,1,0,1,0,0].
最后,Pattern 字段也用于确定输入端口的数量。如果 Pattern 字段是 [0,0,1,2],我们将看到另一个输入端口被添加到块中。
patterned_interleaver_3_inputs
我仍在学习 GNU Radio,我对信号处理块类型的理解有些困难。我知道如果我创建一个块,假设输入和输出 4 个样本中有 2 个样本,它将是 2 的插值器。
但是现在,我想创建一个将成为成帧器的块。因此,它将有两个输入和一个输出。该块将从第一个输入接收 n
个样本,然后从第二个输入获取 m
个输入并附加到从输入第一个接收到的样本,然后输出它们。在这种情况下,我的样本应该是字节。
请问这种情况如何处理?我这样走的路对吗?有人知道如何处理这种情况吗?
您的情况(输入 0 和输入 1 与输出具有不同的相对速率)不在 GNU sync_block
/interpolator
/decimator
"templates" 的范围内Radio有,所以你要用通用的block方式。
假设您熟悉 gr_modtool
¹,您可以使用它来添加诸如 interpolator
(相对比率 >1)、decimators
(<1)和 sync
(=1) 个方块:
-t BLOCK_TYPE, --block-type=BLOCK_TYPE
One of sink, source, sync, decimator, interpolator,
general, tagged_stream, hier, noblock.
还要注意 general
类型。使用它,您可以实现一个对输入和输出之间的关系没有任何限制的块。也就是说
- 您将不得不从输入中手动
consume()
项,因为您从输入中获取的项数不能再通过输出项数得出,并且 - 您将必须实施一个
forecast
方法来告诉 GNU Radio 调度程序对于给定的输出您需要多少项目。
gr_modtool
会给你一个存根,你只需要添加正确的代码!
¹ 如果您不是:它在 GNU Radio Guided Tutorials 的第 3 部分左右介绍,我认为您可以快速而有趣地阅读它。
考虑到这个问题是 4 年前提出的,并且从那时起 GNU Radio 发生了很多变化,我想补充一下现在可以使用 Patterned Interleaver 来解决这个问题块。
patterned_interleaver_image
此块的工作方式如下:它在左侧端口接收输入,并在右侧端口输出单个交错模式。因此,让我们想象一个具有 2 个输入 V1 和 V2 的块:
V1 = [0,1,0,0,1,1]
V2 = [1,1,1,0,1,0]
假设我们希望输出是 V1 的前 2 位,然后是 V2 的前 2 位,然后是 V1 的后 2 位,然后是 V2 的后 2 位,依此类推...即,我们希望输出为
Vo = [0,1,1,1,0,0,1,0,1,1,1,0].
为了实现这一点,我们转到 Patterned Interleaver 块的属性,如下所示:
patterned_interleaver_properties
Pattern 字段允许我们控制输入端口中的位交错的顺序。默认情况下,它们在 [0,0,1,1] 中,这意味着该块将从输入端口 0 获取 2 位,然后从输入端口 1 获取 2 位。相应的输出将是
[0,1,1,1,0,0,1,0,1,1,1,0],
即V1的前2位,V2的前2位,V1的后2位,依此类推
让我们再看一个例子。如果模式字段设置为 [0,0,1,1,1,0],则输出将是来自输入端口 0 的 2 位,然后是来自输入端口 1 的 3 位,然后是来自输入端口 0 的 1 位。在输出我们将获得 [0,1,1,1,1,0,0,1,0,1,0,0].
最后,Pattern 字段也用于确定输入端口的数量。如果 Pattern 字段是 [0,0,1,2],我们将看到另一个输入端口被添加到块中。
patterned_interleaver_3_inputs