我一直在尝试使用带有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)
答案 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
;这仍然看起来像你的原始比特流作为“软”值?如果是,二进制切片结果。