【问题标题】:GFSK demodulation with Xlating filter in GNU Radio使用 GNU Radio 中的 Xlating 滤波器进行 GFSK 解调
【发布时间】:2016-07-15 02:14:33
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: gnuradio software-defined-radio


    【解决方案1】:

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

    不幸的是,我什至没有找到一本关于 GNU Radio 的像样的书

    没有。 GNU Radio 发展迅速,因此与开发“核心”圈子关系密切的人都没有时间写出这样的东西。

    因此我的大部分参考资料都是基于一些随机网站,包括官方 GNU Radio 页面。

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

    我将从这里参考诸如分层块连接等GNU Radio术语;如果您不了解所有这些,我建议您通过official Guided Tutorials

    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;这仍然看起来像您的原始比特流作为“软”值吗?如果是,则对结果进行二进制切片。

    【讨论】:

    • @markus 我再次查看了 gfsk.py 源代码,以了解这些块是如何参数化的。您的最后一条评论表明 PFB 时钟恢复更擅长处理现实世界的信号,从而挽救了这一天。用 PFB 替换 M&M 块后,我能够恢复我的比特流。我用于 PFB 的参数与 GNU Radio Guided Tutorials tutorial #7 (gnuradio.org/redmine/projects/gnuradio/wiki/…) 中使用的参数相同。如果我想接收打包数据而不是 101010 的连续流,是否应该进行任何修改?
    • @MosesBrowneMwakyanjala 好吧,打包是一个更高层次的概念。我鼓励您查看 gnuradio/examples/digital/ofdm/rx_ofdm.grc(可能在 /usr/share/(local) 下);这是一个与 tx_ofdm.grc 中定义的分包器匹配的解包器。它可能会让您了解如何为您的数据构建解包器。基本上,您的符号流可能会包含一些序言?您可能只是与之相关,然后提取包含数据包长度的标头并编写“仅传递数据包有效负载”块。
    猜你喜欢
    • 2015-10-07
    • 2016-05-28
    • 2021-06-12
    • 2018-12-19
    • 2016-08-22
    • 2014-11-10
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多