这是一个关于 gnuradio(-companion) 的架构问题,由于我不确定如何首先解决这个问题,所以我首先描述了我想要实现的目标,然后我认为我会如何实现它。
问题
我使用 Ettus X310 SDR 实现了一种特殊形式的 RFID 阅读器:发射器发送一个 OOK/AM 调制(PIE 编码)请求,然后是一个纯正弦波。RFID 标签使用 FM0 中的 OOK/AM 调制或“米勒副载波”编码(差分曼彻斯特编码的一种形式)将其响应反向散射到该正弦波上。我想接收它的响应,将其转换为位(并形成一个 PDU),在 FIFO 中缓冲不同的响应并将它们发送以进行进一步处理。标签响应的属性是:
- 它是异步的。我不知道响应什么时候来,如果它来了,正确的采样时间是什么时候:我不能简单地过滤、采样、抽取信号并使用简单的切片器,因为我不知道采样点是什么。
- 响应进入非常小的“突发”(例如,100 位)。因此,我负担不起对位执行时序恢复并浪费它们(除了我以某种方式缓冲整个信号,我认为这不是这样做的方法)。
- 信号以 6 位(~8 位转换)的小前导(UHF RFID Gen2 前导)开始。这可能不足以恢复时间,但可以用于以某种方式识别响应的开始。
- 它使用提到的 FM0 编码,所以我有保证的每一位转换。出于这个原因,我不必对它们进行采样,但可以检测转换并将它们转换为位。我也不需要传统的时钟恢复(例如 M&M)。
我的想法
“普通” gnuradio 预处理将我带到接收到的过采样位:下变频、滤波;可能是一个使用低通滤波器减去平均值的切片器和一个比较器(请注意,即使这样也可能具有挑战性,因为低通滤波器在获得正确的平均值之前可能具有几位的大稳定时间)。
为了检测实际传输,我认为除了检测比本底噪声更高的信号电平的简单静噪之外我别无选择(这是真的还是有办法仅使用前导码来检测传输?)
一旦静噪块检测到传输,我可以使用微分器(或类似的)来获得边缘。但是我对这种“基带区域”和“比特/PDU”之间的转换的理解结束了:我需要一个异步触发的块(而不是以固定间隔采样)。在实际系统中,来自所述检测器的边沿可以作为触发器的时钟输入。但是,我看不到哪个标准的 gnuradio 块允许我这样做。
一旦进入“位域”,位(或 PDU)将以低得多的速率进行处理。然而,两个时钟域是交叉的:正常的基带采样率、检测转换的不规则速率以及读取位的速率。出于这个原因,我会寻找一个 FIFO 或移位寄存器,其中检测到的位以它们进入的任何边缘转换速率移入,并在另一侧以常规比特速率读出。
问题
在 gnuradio 中实现这个的正确架构/方法是什么?
我可以想象用我自己的块来实现它。但我想尽可能使用标准块,gnuradio-companion。如果否则不可能,或者如果它真的不是正确的方法,我只想将自己的块(特别是 C++)作为最后的手段。