问题描述
我对 gnuradio 块中的环形缓冲区的工作方式有些困惑。
我使用的是采样率为 20Msps 的 UHD:USRP 源块。
我相信每个块都有一个输入缓冲区和一个输出缓冲区,它们被送入下一个块。 在我的流程图中,这是否意味着 USRP 源块以 20Msps 的速率从硬件提取数据,而缓冲区将包含 20Msamples?
所有块中的输出和输入缓冲区编号默认为 0。 那么 USRP Source 和后续块的缓冲区看起来如何?
在 Stream to Vector 之后,它会变成只有 64 个样本吗?
解决方法
事实并非如此。源将以 20MSPS 采样并将样本放入源模块的输出缓冲区。每个缓冲区在溢出之前都有一个最大大小。
在每个块的代码中有一个名为forecast() 的函数,它告诉GNU Radio 调度器它需要多少输入样本来产生一定数量的输出样本。调度程序然后确定何时有足够的样本让块产生输出。如果输入和输出缓冲区上有足够的空间,调度程序会调用阻塞 work() 函数,然后在输入处进行必要的信号处理并产生输出。输入缓冲区的样本数和输出缓冲区的空间永远不会恒定。
因此在流到向量块的示例中,输入可能有 4096 个样本。检查这一点并在输出中生成 64 个向量是块的工作。
GNU radio 更喜欢一个块在每次调用工作函数时处理尽可能多的数据,因为在块之间移动样本是一项代价高昂的操作。
有一些例外,例如标记的流块,但对于大多数块,这是基本思想。