在 GNU Radio 中使用 Xlating 滤波器进行 GFSK 解调

GFSK demodulation with Xlating filter in GNU Radio

几个月来,我一直在尝试使用 GNU Radio 和 USRP B210 解调 GFSK 信号。不幸的是,我什至没有找到一本像样的关于 GNU Radio 的书,因此我的大部分参考资料都是基于一些随机网站,包括官方 GNU Radio 页面。

GFSK 信号来自实验室的立方体卫星。此刻,它正在发送一个'10101010 ......'测试信号。使用的 GFSK 调制指数为 0.6667,数据速率为 9600 bps。如下图所示,我的流程图使用了 GFSK 解调块,它显然除了源代码外没有任何文档。灵敏度设置为 pi * modulation_index/samples_per_symbol。我记录了一些采样为 10x 20x 40x 80x 和 160x 波特率 (9600) 的文件。在这两个文件中,我都能够收到重复的 0x55 和 0xAA 组 expected.Unfortunately,这些组伴随着一些随机字节,我不知道它们来自哪里[我的第一个猜测是噪声].

当我对以 40 倍采样的信号使用频率平移 fir 滤波器将来自 USPR 的接收信号偏移 1000hz 时,我偶然得到了一个非常不错的输出。这是 gnuradio 的一些有趣行为出现的地方。我使用滑块来控制 xlating 滤波器的中心频率,以便能够在运行时将其从默认值 (1000hz) 更改为我想要的任何值。当我更改该值时,信号变得不那么好,即位交换、随机字节添加等。当我滑回 1000hz 时,我期待信号恢复正常,这很奇怪。

谁能告诉我为什么会这样?我的流程图如下。请随时指出我到目前为止忽略的错误。

xlating fir 过滤器抽头:firdes.low_pass_2(1,samp_rate,cut_off,xlating_bw,xlating_attn)

首先:不,我无法解释滑动时的奇怪行为。然而,改变频率偏移肯定会导致要解码的信号出现较大的频率跳跃(毕竟这就是你这样做的原因),负责恢复时序的结构不会喜欢这样;这是意料之中的事。

Unfortunately, I haven't found even a single decent book on GNU Radio

有none。 GNU Radio 一直在快速发展,因此 none 接近开发 "core" 圈子的人有时间写这样的东西。

and hence most of my references are based on some random websites including the official GNU Radio page.

好吧,官方 GNU Radio 网站当然不是随机的,而是正确的去处!

我将从这里参考 GNU Radio 术语,例如 hierarchical blockconnection 等;如果您不理解所有这些,我建议您阅读 official Guided Tutorials!

the GFSK demod block, which apparently doesnt have any documentation except its source code

好吧,源代码中有一个文档注释,它确实被 Sphynx 提取了;但是,该文档在 GRC 中不可见。我们需要努力解决这个问题!

但是,文档注释非常冗长:

Hierarchical block for Gaussian Minimum Shift Key (GFSK)
demodulation.

The input is the complex modulated signal at baseband.
The output is a stream of bits packed 1 bit per byte (the LSB)

Args:
    samples_per_symbol: samples per baud (integer)
    verbose: Print information about modulator? (bool)
    log: Print modualtion data to files? (bool)

Clock recovery parameters.  These all have reasonble defaults.

Args:
    gain_mu: controls rate of mu adjustment (float)
    mu: fractional delay [0.0, 1.0] (float)
    omega_relative_limit: sets max variation in omega (float, typically 0.000200 (200 ppm))
    freq_error: bit rate error as a fraction
    float: 

基本上,您可以完全调整分层块中包含的定时恢复和FM解调器的参数。

现在,显然,到目前为止,这对您来说并不奏效!我认为您应该继续在 GRC 图中重新创建层次流:

阅读相同的来源,您会发现

    self.connect(self, self.fmdemod, self.clock_recovery, self.slicer, self)

这意味着:

作为gfsk_demod的层级块,

  • 将它的输入端口连接到 fmdemod
  • 的输入
  • fmdemod的输出连接到clock_recovery的输入,然后
  • 获取时钟恢复块的输出并将其转换为离散数(使用 slicer)。

在源代码中的几行代码中,您会发现这些是如何参数化的。

我建议您先将 RX 信号馈入 "stock" Quadrature Demod 模块。从数学上讲,这将获取输入信号,并将其转换为其相速度(即每个样本的 "momentaneous frequency",表示为采样率的倍数)。使用 scope/time 接收器可视化输出!它看起来是否正确,即您是否看到交替的 "high" 和 "low" 值,大致呈高斯脉冲形状?

如果是这种情况,请在 GRC 中复制 Muller&Mueller 时钟恢复块(或将其替换为新的、闪亮的 PFB 时钟恢复,它可以更好地处理真实世界的信号);输出看起来正确吗?

使用"decimating FIR"降低输出率samples_per_symbol;这仍然像 "soft" 值那样的原始比特流吗?如果是,则对结果进行二进制切片。