在解码 FSK 信号时避免直流尖峰

信息处理 fsk 格努拉迪奥
2022-02-17 20:27:28

我正在使用 GNU Radio 中的 Quadrature Demod 模块来解码 FSK 信号,但信号看起来很嘈杂。它有两个以广告频率为中心的明显峰值,但它们靠得很近,仅略高于中心的直流尖峰。

在我的第一次尝试中,我将 HackRF SDR 的基带频率设置为精确的传输中心频率,采样率为2 MHz. 然后我申请了30 kHz在对信号进行正交解调之前对信号进行低通滤波器。我得到的是空闲期间的近乎安静的信号和传输期间类似于数字数据的东西,但有点嘈杂。设置触发器并分离出单个数据包很容易,但很难识别这些位。数据包开始的屏幕截图如下:

以信号为中心的 FSK 解码

所以我决定尝试从中心频率捕获大约900 kHz并将数据乘以相应的复数信号以将其移回基带。现在信号在传输过程中远高于本底噪声,但是,我的正交解调器在空闲期间捕获了大量噪声。如果我在正确的时刻停止捕获,我可以看到看起来非常干净的数据信号,但幅度比周围的噪声要弱得多。

在偏移处捕获的 FSK

我如何获得两全其美,以便我可以干净地检测数据包并使用 GNU Radio 解码比特?

我上次测试的流程图:

FSK 解调流程图

1个回答

这看起来很不错:

很好的解调

我不 100% 同意您对此的措辞:

但是,我的正交解调器在空闲期间捕获了大量噪声。

好吧,正交解调器采用连续的样本并为您提供它们之间的相位超前。如果您只捕获静音,或者更准确地说,数据包之间的噪声,则每个样本的相位应该(至少在理论上)是绝对均匀随机的——因此,您的相位增加也应该是随机的。请记住:FM 解调(模拟或数字)信号的幅度与接收器处的原始信号功率不成比例(这就是 FM 的优点)

有不同的方法来解决这个问题;一个简单的方法是在 GNU Radio 中的“Power Squelch”块中(它确实做到了它们的名字所暗示的 - 只要信号的样本低于某个 |·|² 阈值,就确保信号被抑制)。您可以在正交解调之前添加一个。

另一种方法:“解调噪声”的平均值应为 0 - 因此,如果您对解调信号进行低通滤波,以便您仍然可以辨认出符号,但相位噪声引起的“跳跃”平均为 0,之后你可以有一个决定者说“好的,这是一个数据包中的 1 或 -1,或者这是一个属于数据包间时间的 0”。


评论:

  • 您可以使用“Rotator”块,而不是与复余弦相乘;应该快一点(在这些速率下根本不重要)。
  • 更舒适:您可以简单地用一个“Frequency Xlating FIR”替换您的低通滤波器、乘法器和余弦。使用“低通滤波器抽头”块来计算您想要的滤波器的抽头,并id在 xlating FIR 的“抽头”字段中使用该块的 。
  • 如评论中所述:我建议新设计使用 Qt 而不是 WX GUI,因为 WX 不再维护并且将在未来的版本中消失(即 GNU Radio 3.8)
  • 困难的部分可能是恢复符号的时间——看看 GNU Radio 提供的同步器。传统上,许多设计都使用了 Müller&Muller,但老实说,这是一种为在硬件而非软件中实现而设计的算法。参数化有点涉及,“PFB 时钟同步”应该表现得更好(事实上,它的工作方式与 M&M 类似,但在近似信号的导数方面要准确得多)
  • 正交解调器并不是唯一可以解码 FSK 的东西:尝试选择每个 FSK 频率的滤波器,然后是一个复数到 mag 平方和一个“最大”块。如果您在设计过滤器方面很聪明(即不要过度指定事物),那么在 PC 风格的硬件上,这在 CPU 上不一定比在 CPU 上更难arctan该正交解调必须这样做。