C++ 中的 SDR DVB-T2 接收器

软件定义无线电是一种取代金属加工(实际上对健康有益)的编程方法。 SDR 预示着美好的未来,其主要优点被认为是消除了无线电协议实施中的限制。 一个例子是 OFDM(正交频分复用)调制方法,该方法只能通过 SDR 方法实现。 但 SDR 还拥有另一个纯粹的工程机会——以最少的努力在任意点控制和可视化信号的能力。

有趣的通信标准之一是地面电视 DVB-T2。
为了什么? 当然,你可以简单地打开电视而不起床,但是那里绝对没有什么可看的,这不再是我的观点,而是医学事实。

说实话,DVB-T2 的设计具有非常广泛的功能,包括:

  • 室内应用
  • 从 QPSK 调制到 256QAM
  • 带宽从 1,7MHz 到 8MHz

我有使用SDR原理接收数字电视的经验。 DVB-T 标准属于著名的 GNURadio 项目。 DVB-T2 标准有一个 gr-dvbs2rx 块(全部用于相同的 GNURadio),但它需要初步的信号同步,并且它是鼓舞人心的(特别感谢 Ron Economos)。

我们有什么

ETSI EN 302 755 标准详细说明了传输,但没有详细说明接收。

该信号在空中播出,采样频率为 9,14285714285714285714 MHz,采用 COFDM 调制,具有 32768 个载波,频带为 8 MHZ。

建议以双倍采样频率(以免丢失任何东西)和中频更大带宽(超外差接收)接收此类信号,以消除直流(DC)偏移和本地振荡器的“泄漏” (LO)到接收器输入。 满足这些条件的设备对于单纯的好奇来说太昂贵了。

具有 10Msps 10bit 的 SdrPlay 或具有类似特性的 AirSpy 便宜得多。 这里不存在双倍采样频率的问题,并且只能通过直接转换(零中频)来完成接收。 因此(出于财务原因)我们转而支持“纯”SDR 的拥护者,并且硬件转换最少。

有必要解决两个问题:

  1. 同步。 找出准确的相位精确射频偏差和采样频率偏差。
  2. 向后重写 DVB-T2 标准。

第二个任务需要更多代码,但可以坚持不懈地解决,并且可以使用测试信号轻松验证。

测试信号可在 BBC 服务器 ftp://ftp.kw.bbc.co.uk/t2refs/ 上获取,并附有详细说明。

第一个问题的解决很大程度上取决于SDR设备的特性及其控制能力。 正如他们所说,使用推荐的频率控制功能并不成功,但阅读这些功能却提供了很多经验。 文档、编程、看电视剧、解决哲学问题……总之,放弃这个项目是不可能的。

对“纯粹的特别提款权”的信心只会越来越强烈。

我们按原样获取信号,将其插值为模拟信号,并取出一个离散信号,但与真实信号相似。

同步框图:

C++ 中的 SDR DVB-T2 接收器

这里一切都是按照教科书的。 接下来有点复杂。 需要计算偏差。 有很多文献和研究文章比较了不同方法的优缺点。 经典著作 - 这是“Michael Speth、Stefan Fechtel、Gunnar Fock、Heinrich Meyr,基于 OFDM 的宽带传输的最佳接收器设计 - 第 I 部分和第 II 部分”。 但我还没有遇到一个能够并且想要计数的工程师,因此使用了工程方法。 使用相同的同步方法,将失谐引入到测试信号中。 通过将不同的指标与已知偏差进行比较(他自己介绍了它们),选择了性能最好且易于实施的指标。 通过比较保护间隔及其重复部分来计算接收频率偏差。 接收频率的相位和采样频率是根据导频信号的相位偏差来估计的,这也用于 OFDM 信号的简单线性均衡器中。

均衡器特点:

C++ 中的 SDR DVB-T2 接收器

如果您知道 DVB-T2 帧何时开始,那么所有这些都会很好地发挥作用。 为此,在信号中发送前导码符号P1。 技术规范 ETSI TS 1 102 中描述了检测和解码 P831 符号的方法(还有许多对接收有用的建议)。

P1信号的自相关(帧开头的最高点):

C++ 中的 SDR DVB-T2 接收器

第一张图片(距活动图像仅剩六个月......):

C++ 中的 SDR DVB-T2 接收器

这就是我们了解什么是 IQ 不平衡、DC 偏移和 LO 泄漏的地方。 通常,对直接转换特有的这些失真的补偿是在 SDR 设备驱动程序中实现的。 因此,花了很长时间才明白:从友好的QAM64星座中剔除星星是补偿函数的工作。 我不得不关掉一切并写下我的自行车。

然后图片动了:

C++ 中的 SDR DVB-T2 接收器

DVB-T64 标准中具有特定星座旋转的 QAM2 调制:

C++ 中的 SDR DVB-T2 接收器

简而言之,这是将肉末再经过绞肉机的结果。 该标准规定了四种混合类型:

  • 比特交织
  • 信元交织(在编码块中混合信元)
  • 时间交织(也在编码块组中)
  • 频率交织(OFDM 符号中的频率混合)

结果,我们在输入处得到以下信号:

C++ 中的 SDR DVB-T2 接收器

所有这些都是为了编码信号的抗噪性而进行的斗争。

现在我们不仅可以看到信号本身及其形状,还可以看到服务信息。
有两个多厅影院在播出。 每个都有两个物理通道 (PLP)。

在第一个多路复用中注意到一个奇怪的地方 - 第一个 PLP 被标记为“多个”,这是合乎逻辑的,因为多路复用中存在多个 PLP,而第二个 PLP 被标记为“单个”,这是一个问题。
更有趣的是第二个多路复用中的第二个奇怪之处 - 所有节目都在第一个 PLP 中,但在第二个 PLP 中存在低速的未知性质的信号。 至少 VLC 播放器无法识别它,它可以识别大约 XNUMX 种视频格式和相同数量的音频。

该项目本身可以在这里找到.

创建该项目的目的是确定使用 SdrPlay(现在是 AirSpy)解码 DVB-T2 的可能性,因此这甚至不是 alpha 版本。

PS 当我艰难地写这篇文章时,我设法将 PlutoSDR 集成到项目中。

有人会立即说USB6输出处的IQ信号只有2.0Msps,但你至少需要9,2Msps,但这是一个单独的话题。

来源: habr.com

添加评论