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