1

几个月来,我一直在尝试使用带有 USRP B210 的 GNU Radio 解调 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 组。不幸的是,这些组伴随着一些随机字节,我不知道它们来自哪里[我的第一个猜测是噪音]。

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

谁能告诉我为什么会这样?我的流程图如下。随意指出我迄今为止忽略的错误。

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

[在此处输入图像描述]

4

1 回答 1

2

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

不幸的是,我什至没有找到一本关于 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; 这仍然看起来像您的原始比特流作为“软”值吗?如果是,则对结果进行二进制切片。

于 2016-03-28T19:29:33.180 回答