符号时间偏移模拟

信息处理 数字通讯 同步 软件定义无线电 符号计时
2022-01-30 13:15:18

过去,我为符号时序同步运行了许多模拟。我主要使用 GNU Radio。现在,我正在尝试在 C++ 中做同样的事情。为此,我需要一种将符号偏移量引入符号的方法。所以假设我有一个复杂的数组M采样率采集的样本N每个符号的样本。如何引入say的符号偏移量μ=100 ppm符号时间?伪代码、C++ 或 MATLAB 脚本就足够了。

2个回答

如果您假设接收器的时钟是完美的,那么您希望发送器每发送一次符号Ts±ε秒,在哪里Ts是根据接收器的符号周期。

这很容易通过在发射机中使用非常高的采样率来实现。让我们假设Ts=1你需要一个偏差±0.01. 这个偏差对应一个样本,如果采样间隔是0.01. 因此,使用采样率1/.01=100每个时间单位的样本,并让发送器每 99 个样本(对于较快的时钟)或每 101 个样本(对于较慢的时钟)发送一个新符号。然后,让接收器每 100 个样本采样一次,就完成了。

通过使采样率足够快,您可以轻松适应所需的任何延迟。使用这种方法,还可以轻松模拟发射器和/或接收器中的时变时钟漂移。

在实验室内的调制解调器前,要控制符号偏移,您可以将发射器和接收器与 10 MHz 参考同步,然后将符号率(或比特率或采样频率)移动所需 ppm 的增量。当然,如果速率是可编程的。

在 C++ 的仿真程序中实现符号偏移就是设计一个有理重采样器。我将按照以下方式进行。

我记住 x ppm 偏移量,它可以是 +/- x 偏移量。1,000,000 sps 的 100 ppm 是 1,000,100 sps 或 999,900 sps。

如果 ppm 为正,则为插值。如果 ppm 为负,则为抽取。

我将创建一个关联数组,表示理想采样率的时间瞬间。对于 1e6 sps,周期为 1 us:一张表,其中包含 1 us 2 us 3 us 4us 5us 等......与 M 个样本相关联的值

我将创建另一个数组来表示偏移采样率的时间点。在 100 ppm 时,它变为 1,000,100 sps,周期为 0.9999 us: 一张包含 0.999 us 1.998 us 2.997 us 3.996 us 等的表格 我将前一行中的周期四舍五入。确切地说应该是 1/1,000,100

有了新的时刻,现在是时候对 M 个样本进行插值或抽取,以获得与偏移时刻相关联的 M' 个样本。为此,有几种插值:

  • 线性
  • 抛物线
  • 立方体

Paul Bourke 的网站上的一篇文章“插值方法”提供了一些 C 代码来实现这些插值。使用之前的两个时间数组,可以计算他文章中描述的 mu。

我不知道是否有更有效的方法可以在计算机中实现它,但我在一个旧项目中这样做并且工作了。网站文章中的 Paul Breeuwsma 系数给出了良好的频谱结果。

对于负 ppm,可以使用相同的过程进行抽取。