【发布时间】:2023-03-25 07:06:02
【问题描述】:
我正在为同事开发的 GNU Radio 应用程序开发 Web 前端。
我有一个 TCP 客户端连接到两个 TCP Sink 块的输出,并且数据编码与我预期的不一样。
一个TCP Sink 发送复数数据,另一个发送浮点数据。
我在客户端通过将每个 4 字节块读取为 float32 值来解码数据。服务器和客户端都是 little-endian 系统,但我也尝试了字节交换(使用 GNU Radio Endian Swap 块并在客户端手动),但数据仍然不正确。其实更糟糕的是,确认没有字节顺序不匹配。
当我在 GNU Radio Companion 中使用适当的 GUI 元素执行流程图时,图表看起来是正确的。数据值按预期显示在 0 到 10 之间。
但是,在客户端解码的值通常在 0.00xxxxx 左右,并且该图看起来像噪音,而不是在 GNU Radio 中显示的简单音调。如果我通过乘以 1000 手动缩放数据,它看起来仍然像噪音。
我将描述 GNU Radio 中的 pre-D 路径,因为它更短,但我在 post-D 路径上看到了同样的问题,其中添加了 WBFM Receive 和 Rational Resampler,然后是 @987654327 @ 块,然后是 TCP Sink 块发送浮点数据。
File Source (Output Type: complex, vector length: 1) =>
Throttle (vector length: 1) =>
Low Pass Filter (FIR Type: Complex->Complex (Decimating)) =>
Throttle (vector length: 1) =>
TCP Sink (input type: complex, vector length: 1).
这似乎是指定流参数的正确方法(如果我做出与流项目不匹配的更改,确实 Companion 会显示错误),但我无法在流的另一端正确解码数据.
【问题讨论】:
-
你为什么使用
throttle块,为什么还要使用两个? Throttle 对您的信号完全没有。它只会减慢处理速度。您永远不应该将它们中的两个放在同一个示例路径中。 -
所以:首先是坏消息:GNU Radio 正在为 3.8 版本做准备,并且 TCP 接收器已被弃用并将被删除。所以你最好完全避免这些,特别是因为它们在很多方面都非常可怕(如果你邮寄讨论-gnuradio 邮件列表,我可以解释)。
-
但是:我不认为这是这里的问题。您的抽取因子是多少?
-
我通常建议切换到 GNU Radio 中更强大的 ZeroMQ 网络接收器,并在您的客户端中使用 ZeroMQ;它负责整个打包的事情,我认为这可能是这里的问题。
-
不,ZMQ 做 ZMQ,但老实说,PUB/SUB 或 REP/REQ(如果您的客户想要扮演“请求”数据的角色)并不过分——ZMQ 相当苗条,并且基本上只处理从 a 获取的数据,因此您不必弄乱 recv()/send() 处理。是的,整个接受的事情是这段代码的混乱之一(也是,它是 GRC 代码库的一部分,等等)
标签: tcp gnuradio gnuradio-companion