在GNU Radio

时间:2016-03-27 19:48:54

标签: gnuradio software-defined-radio

我一直在尝试使用带有USRP B210的GNU Radio来解调GFSK信号数月。不幸的是,我还没有在GNU Radio上找到一本不错的书,因此我的大多数参考文献都是基于一些随机网站,包括官方的GNU Radio页面。

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

偶然地,当我使用频率xlating fir滤波器将接收到的信号从USPR移位1000hz时,我能够得到非常好的输出,用于以40x采样的信号。这里是gnuradio的一些有趣行为的来源。我使用滑块来控制xlating滤波器的中心频率,以便能够将其从默认值(1000hz)更改为运行时期间的任何值。当我改变该值时,信号变得不太正常,即比特交换,随机字节添加等。当我滑回1000hz时,我期待信号恢复正常,这很奇怪。

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

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

[enter image description here]

1 个答案:

答案 0 :(得分:2)

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

  

不幸的是,我还没有在GNU Radio上找到一本不错的书呢

没有。 GNU Radio一直在快速发展,所以没有一个接近开发“核心”圈子的人有时间写这样的东西。

  

因此我的大多数参考文献都基于一些随机网站,包括官方GNU广播页面。

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

我将从这里引用GNU Radio术语,例如分层块连接等;如果您不理解所有这些,我建议您浏览official Guided Tutorials

  

GFSK demod块,显然除了源代码

之外没有任何文档

嗯,源代码中有一个文档注释,它由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 块。在数学上,它将获取输入信号,并将其转换为其相速度(即每个样本的“瞬时频率”,表示为采样率的倍数)。使用范围/时间接收器可视化输出!看起来是否正确,即您是否看到交替的“高”和“低”值,采用粗略的高斯脉冲形状?

如果是这种情况,请复制GRC中的Muller& Mueller时钟恢复模块(或者用新的,闪亮的PFB时钟恢复代替它,它可以更好地处理真实世界的信号);输出看起来是对的吗?

使用“抽取FIR”将输出速率降低samples_per_symbol;这仍然看起来像你的原始比特流作为“软”值?如果是,二进制切片结果。