FSK 分析:只找到一个频率

信息处理 声音的 解调 fsk
2022-02-24 06:05:24

我试图编写这个软件作为我业余无线电和 SDR 爱好的一部分,用于分析各种两级 FSK 信号。我对 DSP 很陌生,但到目前为止,我一直在学习有关此主题的更多信息。我的长期想法是尝试自动检测任意信号中的标记和空间频率以及波特率(也许这太天真了——我不知道)。

现在,我正在尝试使用已知信号、已知标记和空间频率以及已知波特率使该软件正常工作。我已经使用来自紧急警报系统、Bell 103 甚至纯正弦波等来源的样本对其进行了测试,以确保我的频率检测算法(非常基本的过零检测)正常工作。2600 Hz

当我对纯正弦波样本进行测试时,我得到了的频率,因此我至少对自己检测到一个特定频率的能力有些信心。但是,当我使用两级 FSK 样本时,我永远无法提取标记和空间频率。2600 Hz2600 Hz

我现在使用的是一个滑动窗口,它从样本的开头开始并沿着样本移动,改变窗口的起始位置和窗口的总长度,试图找到一个好的合身。但无论如何,我从来没有看到标记或空间频率(实际上,有时我会在两个频率之一上获得一些接近读数,但从不会两者都读)。

如果您想亲自看看并给我一些指示(不是双关语),项目非常小。Cli为现在项目中的代码量道歉。我已经将我非常有信心的代码放入了他们自己的类和接口后面,但我的“正在进行中的”代码目前只是生活在Main()命令行接口的方法中。

简而言之,这是我当前的“窗口算法”:

  1. 从位于示例的窗口开始0 ms
  2. 从一个相当最小值的窗口长度开始
  3. 计算当前窗口中的零交叉以确定该窗口中信号的频率
  4. 输出有关窗口的各种信息及其包含的频率
  5. 增加窗口长度并重复直到窗口长度达到最大值(可能为增量——所有这些都易于配置)110 ms0.251.0 ms
  6. 一旦达到最大窗口长度,重置为最小窗口长度,稍微增加窗口位置,并再次重复变化的窗口长度频率样本
  7. 重复此操作,直到达到最大窗口位置

这是运行软件的屏幕截图,它能够准确地检测到两个 FSK 频率之一,但不能准确检测到另一个:

截屏

编辑 1:原来我的样本不好。当我查看频谱图时,我只看到一个频率峰值,而 2 级 FSK 频谱应该有两个峰值。我找到了另一个示例,现在我的窗口算法工作得更好了。

截屏

编辑 2:仍然使用相同的算法,但现在使用新样本和对软件的一些非常小的调整,至少成功地解码了这个 NWR/NOAA SAME 信号的第一个重要数量。您可以非常清楚地看到开头重复的 1010 1011 序言。

截屏

编辑 3:重构了很多代码并清理了 Cli 项目,使其实际上只是一个命令行界面。

1个回答

您可以通过将接收到的信号与其自身的延迟版本相乘,然后是一个低通滤波器来制作一个非常简单的鉴频器。调整延迟以设置鉴别器的频率范围。这是因为乘法器后跟一个低通滤波器是一个相位检测器(将两个具有相同频率和不同相位的正弦曲线相乘,您将得到频率的总和和差:总和是用低通滤波器滤除的加倍频率通过滤波器,不同的是相位)。相位的变化与时间的变化是频率,因此信号与自身延迟版本的低通滤波乘积将与该特定间隔上的频率成比例。根据您的符号率选择低通滤波器和延迟。

或者,您可以制作一个带有两个通带滤波器的调谐鉴别器,并将您的信号馈入每个通带滤波器的输入。滤波器的带宽取决于您的符号率。用幅度检测器跟随每个滤波器,并从另一个中减去一个检测器输出。减法器的输出将是您解调的 FSK。