哪种数字调制方案适合通过 PC 声卡的输出传输数字数据

信息处理 解调 数字通信 嵌入式系统
2021-12-23 20:47:05

我需要输出一个数据流40 kbit/s或更快的计算机系统,其唯一可访问的输出外围设备是音频接口。这个接口有合理的规格,96 kHz采样率,与24-bit分辨率,但输出级是交流耦合的。只有一个输出通道可用。一个好的假设是它的行为就像一个带通滤波器4 Hz40 kHz通带小于1 dB衰减; 并且它有一个90 dB信噪比。我对发射器没有任何其他复杂性限制。

我不希望将发射器连接到接收器的电缆上出现额外的噪声/衰减。

接收器是一个嵌入式系统120 MHzCortex-M3 单片机。如有必要,可以假设类似的音频采集性能。一个额外的专用解调芯片(如果存在这样的低频)可能是一种选择。

  • 哪种数字调制方案适合这种情况?
  • 是否已经有代码库(软件定义的无线电库?)可以阻止我重新发明轮子?
  • 是否存在具有类似限制的现有应用程序,我可以从中寻找灵感?
1个回答

你在这里有一套很好的环境;你应该能够在没有太多麻烦的情况下实现你的目标。我在您的描述中看不到任何可以消除整个调制类别的内容(例如相移键控频移键控等)。选择合适格式的一些因素包括:

  • 所需的频谱效率(即相对于可用带宽您需要多少数据吞吐量)
  • 接收器的复杂性要求(通常是系统中最复杂的部分)
  • 您愿意为开发实施付出多少努力。
  • 特定于您的应用的其他情况(例如,如果您在一端或两端的计时精度较差、已知干扰或信道响应较差)

因此,为您的系统逐一勾选这些,我们可以提出一些指导方针:

  • 似乎您最大的限制是您的通道响应(受声卡的 DAC 限制)。如果您有 40 kHz 的可用单边带宽,那么您将被限制为略低于该值的符号率。对于至少每秒 40 千比特的目标数据速率,您将需要一些每个符号传输多个比特的方案。

  • 如果您的嵌入式平台没有加载太多其他功能,现代 120-MHz ARM 处理器应该能够轻松处理每秒数十千比特范围内的大多数任何格式的解调。

    我不确定您正在使用哪种型号,但许多最近的处理器提供了板载 ADC 与内存和中断子系统的非常紧密的集成,也许允许您(无需手动 CPU 干预)自动对指定的输入信号进行采样速率,将样本存储在板载内存中,并仅在特定大小的样本块可供处理时触发处理器中断。我知道一些 Atmel 设备至少提供了这种功能。过去我与他们取得了很好的成功。

  • 我假设这可能是某个更大系统的一个组件,因此您不想为了满足您的要求而构建非常复杂的东西。幸运的是,根据您所说的,我认为您应该能够非常简单地实现满足您要求的东西。我假设由于这两个设备连接在一起,您可能具有非常高的信噪比(40 dB 或更高),对于数字调制,通常测量为EbN0. 这让生活变得更加轻松,因为您可能可以完全跳过诸如纠错编码之类的附加功能(或者至少实现一个非常简单的方案,该方案可以捕获您在这样的 SNR 中所期望的非常罕见的错误)。

  • 至于特殊情况,对于这个系统,我不会期望太多。我希望 PC 端的振荡器精度非常好(至少由晶体控制,所以你在 <50 ppm 左右的范围内;如果使用其他更精确的源校准振荡器可能会更好)。嵌入的一面很可能是一样的;我假设您使用晶体振荡器作为时钟源。由于两端连接在一起,我假设你没有注意干扰。

因此,将所有这些组合成一个建议,我可能会以每秒 24 千符号的速度开始采用正交相移键控 (QPSK) 方法在每个符号 2 位的情况下,这会产生每秒 48 KB 的数据速率,这超出了您的要求。这个特定的速率使您的实施更容易一些;由于输出 DAC 以 96 kHz 运行,这导致每个符号 4 个样本(在每个符号时间以整数个样本运行总是更容易)。我可能会尝试设计嵌入式端,以便尽可能以相同的 96 kHz 速率进行采样;这避免了在资源匮乏的一端进行任何重新采样的需要。

为避免声卡 DAC 使用的 DC 陷波出现任何问题,您可以将 QPSK 信号调制到 24 kHz 的载波上。然后,调制信号的频谱在 DC 处会有一个零点,这将与您的陷波对齐。缺口有可能最终根本不是问题(特别是如果它真的像您建议的那样只有几赫兹宽)。在这种情况下,您可能会采用一种更简单的方案,该方案仅适用于基带,完全绕过载波调制。

QPSK 是一个不错的选择,因为它在发送器和接收器上都很简单。在您的 SNR 中,您可以使用更复杂的方案(如正交幅度调制 (QAM))来实现更高的频谱效率,但从接收器复杂性的角度来看,PSK 信号的恒定包络特性很有吸引力。需要注意的是,如果将来您确实需要每个符号更多的位,您可以转向更高阶的 PSK 星座,例如 8 或 16 PSK。然而,与 QAM 星座相比,从误码率性能的角度来看,这些都不是最佳的。

就库实现而言,我不知道您可以随意使用任何东西,尤其是对于嵌入式平台。您的接收器实现可能在某种程度上与硬件接口相关联。您可能能够为解调器所需的各种步骤找到一些现有的实现,但您至少需要调整您可能会发现在您的平台上运行良好的内容。如果您只是想查看许多不同通信信号处理操作的 C++ 实现,GNU Radio 项目是一个很好的地方,它甚至可能产生一个有用的框架来实现您的 PC 上的发射总而言之,您的接收者需要执行的高级步骤包括:

  • 如果使用非零载波频率:

    • 频率同步:定位和跟踪由于发射器和接收器之间的振荡器失配导致的载波频率偏移(在许多情况下,频率偏移将随着时间的推移大致保持不变)
    • 载波解调:将信号转换为基带,产生两个同相和正交 (I/Q) 信号(通常表示为复基带信号)。
  • 匹配滤波:将基带信号通过与发射器使用的脉冲形状匹配的滤波器(您可能会使用矩形脉冲)

  • 时序同步:定位和跟踪符号转换对应的时间;这可以通过以符号时间为模跟踪匹配滤波器输出中的峰值位置来完成

  • 位切片:将符号采样时间的匹配滤波器输出转换为硬位决策

  • 序列化:确保以正确的顺序写出每个符号的多个位!

这听起来可能是一个复杂的过程,但即使是为这样的简单情况构建一个实用的接收器也很有启发性。如果还有其他我遗漏的内容,请发表评论。