跳至主要內容

解调

Jia-Yin大约 2 分钟comm

处理基频信号

将上节中调制过的信号喂给一个 Virtual Sink, id=ooksignal。接下来我们增加一些模块,如下图所示:

其中添加模块的参数如下:

  • Virtual Source: id=ooksignal
  • Xlating FIR Filter:
    • Taps: firdes.low_pass(1, samp_rate, 40e3, 1e3)
    • Center Frequency: fstation-fcenter
  • Time Sink:
    • Number of Points=16384,
    • Y: -0.1~1.1
    • Trigger Mode: Auto
    • Trigger Level: 0.5
    • Trigger Delay: 0.0002

运行后会得到下图的结果:

这个结果应该不难理解,主要就是把要处理的基频信号截取出来,并且取其振幅再进行观察。

解调信号

接下来我们再添加几个模块,修改系统如下:

其中添加模块的参数如下:

  • Add Const: -0.25
  • Binary Slicer: N/A
  • Char To Float: default
  • Time Sink:
    • Number of Points=16384,
    • Y: -0.1~1.1,
    • Trigger Mode: Auto,
    • Trigger Level: 0.5,
    • Trigger Delay: 0.0002 -

上图中 Binary Slicer 是把收到的实数信号改成二元信号,其中正值输出为 1,负值输出为 0,且输出型态为 Byte。因此我们再加上一个 Char To Float 将其转换为浮点数。运行后会得到如下的结果:

比对上下两个信号,会发现完全一致,表示发送信号已经被解调回来了。

练习 2

  1. 实际上在上述的运行结果中,每个 0 和 1 的信号仍然持续了一定的宽度,所以仍不算是最原先的信号。请在系统中加上一个 Keep 1 in N 的模块,将重复的信号改成单一的信号;另外将后面的 Time Sink 的 Number of Points 改成小于 1024 的数,观察看是否可得到原先 Vector Source 的信号。
  2. (Optional) 实际上这边使用了 Virtual Sink 及 Virtual Source 当作发送及接收的端点。如果我们把 Virtual Sink 改成 Osmocom Sink,就可以把调制过的信号通过 SDR 发送出去;把 Virtual Source 改成 Osmocom Source,就可以通过 SDR 接收调制过的信号,这样就变成一个真正的传输系统,不过接收端可能因为延迟的缘故,接到的信号会是平移的版本。除此之外,我们也可以用 File Sink 把发送的调制信号录下来,然后用 File Source 来取得调制的信号,有兴趣的同学可自行尝试看看。