首先:不,我无法解释滑动时的奇怪行为。但是,改变频偏肯定会导致要解码的信号出现较大的频率跳变(毕竟这就是你这样做的原因),而负责恢复时序的结构不会这样;这是意料之中的。
不幸的是,我什至没有找到一本关于 GNU Radio 的像样的书
空无一人。GNU Radio 一直在迅速发展,因此与开发“核心”圈子关系密切的人都没有时间写出这样的东西。
因此,我的大部分参考资料都是基于一些随机网站,包括官方 GNU Radio 页面。
好吧,官方 GNU Radio 网站当然不是随机的,而是正确的去处!
我将从这里参考 GNU Radio 术语,例如分层块、连接等;如果您不了解所有这些,我建议您阅读官方指导教程!
GFSK 解调块,除了源代码外,它显然没有任何文档
好吧,源代码中有一个文档注释,它确实被 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 信号输入到“库存”正交解调模块。从数学上讲,这将获取输入信号,并将其转换为其相速度(即每个样本的“瞬时频率”,表示为采样率的倍数)。使用范围/时间接收器可视化输出!它看起来是否正确,即您是否看到交替的“高”和“低”值,大致呈高斯脉冲形状?
如果是这种情况,请在 GRC 中复制 Muller&Mueller 时钟恢复模块(或用新的、闪亮的 PFB 时钟恢复替换它,它可以更好地处理真实世界的信号);输出看起来正确吗?
使用“抽取 FIR”将输出速率降低samples_per_symbol
; 这仍然看起来像您的原始比特流作为“软”值吗?如果是,则对结果进行二进制切片。