过去,我为符号时序同步运行了许多模拟。我主要使用 GNU Radio。现在,我正在尝试在 C++ 中做同样的事情。为此,我需要一种将符号偏移量引入符号的方法。所以假设我有一个复杂的数组采样率采集的样本每个符号的样本。如何引入say的符号偏移量符号时间?伪代码、C++ 或 MATLAB 脚本就足够了。
符号时间偏移模拟
如果您假设接收器的时钟是完美的,那么您希望发送器每发送一次符号秒,在哪里是根据接收器的符号周期。
这很容易通过在发射机中使用非常高的采样率来实现。让我们假设你需要一个偏差. 这个偏差对应一个样本,如果采样间隔是. 因此,使用采样率每个时间单位的样本,并让发送器每 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,可以使用相同的过程进行抽取。