解调
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 来取得调制的信号,有兴趣的同学可自行尝试看看。
 
