NCO 是一个循环计数器,可以无限期地运行,但在其他方面与您建议的类似,因为您需要递增 n 来设置输出速率。它基本上是一个完整周期中所有值的查找表,并在溢出时“换行”,以便输出连续周期而没有不连续性。
我认为 NCO 非常适合您尝试做的事情;鉴于它的简单性,它能够无限期地运行并及时跟踪自己的位置,它的量化噪声水平可以设置为你需要的值,它是定点实现(没有乘数)以及它能够改变你的频率根据需要“即时”相量。我认为这与您描述的替代方法的区别在于,这种方法效率不高(考虑到浮点中所需的乘法和可能的实现,而无需仔细映射和缩放,在这种情况下,您不妨走 NCO 路径) .
多一点理论可以帮助您了解 NCO 的所有优点(和简单性)。
首先,参考下图了解基本 NCO 架构: 数字频率控制字 (FCW) 将计数率设置为扩展的精密累加器(计数器),然后可以选择添加用于相位调制的相位控制字 (PCW)累加器的输出。然后将该总和的最重要位用作指向查找表 (LUT) 的地址指针,该查找表 (LUT) 保存正弦波的一个完整周期的值(您也可以想象有两个用于正弦和余弦的指针以启用复杂的 I 和 Q 输出)。


现在查看下面带有数学视图的相同框图,这有助于进一步了解 NCO 的操作。累加器(计数器)是积分器的数字对应物(如果您没有立即看到,想象一下将所有 1 发送到计数器中,输出将是一个斜坡:1,2,3,4,...正如您所期望的积分器输出在其输入处具有恒定电平)。输入 FCW 只是一个数字信号,可以改变时间(正如您所寻找的),是一个代表频率与时间的波形。您可以输入的每个数字字的频率值我稍后会详细说明,但现在知道它在任何给定时间的值与输出频率成正比。f=dϕ/dt ; 频率是相位的导数,因此相位是频率的积分。)由于我们对累加器的 FCW 输入是频率量的数字表示,而累加器是数字积分器,那么累加器输出端的值表示相位与时间的关系(这就是为什么如果需要,我们可以在此时使用 PCW 添加相位偏移)并且累加器从 0 计数到 2,溢出时翻转。π
由于累加器输出表示随时间变化的相位,并且我们想要生成正弦输出(),因此我们可以简单地使用 LUT 来执行三角函数。(注意:如果您有很多额外的循环但没有内存,则可以使用其他计算角度正弦的技术,特别是 CORDIC 算法)。漂亮吧?那么现在我们如何决定设计 NCO 的细节,以及当我们丢失相位字中所有最不重要的位时会发生什么?继续阅读!sin(θ)

首先,累加器设置频率分辨率,通常使用扩展精度累加器,根据应用通常使用 24、32 或 48 位。这很容易看出,首先想象FCW =1:累加器将逐个遍历每个值,这意味着指向LUT的地址指针也会逐个遍历存储的正弦波中的每个值,因此正弦波输出将以最慢的速率,并且该速率将由以下公式中的“步长”给出。为什么步长?因为然后想象设置 FCW = 2,计数器现在将按 2 计数,因此在翻转之前以两倍的速度运行(并且在翻转时计数器必须继续计数,这就是 NCO 将继续输出所需正弦波的原因不确定),输入 FCW = 3,它会以 3 倍的速度计算,等等。因此,
Fout=FCWfclock2accumsize
因此,无论我们决定为 LUT 使用多少位,输出频率都严格由该公式设置,仅此而已。

现在简要解释相位截断和主要考虑因素:相位截断是当我们决定只使用累加器输出的最高有效位发送到 LUT 时,我们正在截断相位字(向下舍入)。要理解这一点的含义,首先考虑下图,如果我们没有任何相位截断会发生什么(意味着一个非常非常大的查找表,或者如果累加器很小,则非常粗略的频率步长)。这张图片显示的是,在所示特定频率下包含完美正弦模拟源(无相位噪声)的不可能实现,使用完美的 100 MHz 时钟和完美的 12 位 A/D 转换器进行采样,将产生相同的结果NCO 输出,使用嘈杂的 100 MHz 时钟。fstep将如此精确,输出处的量化噪声是唯一的噪声源(您可以通过设置输出字宽来控制)。您可以看到如果您想象没有相位截断的不同情况,查找表将在所需的任何给定时间点提供准确的输出(仅限于使用 FCW 的量化频率选择,但步长可以非常小大型蓄电池)。波形将非常平滑,没有任何跳跃或打嗝,换句话说,纯净。

所以这很好,考虑带有 32 位累加器和 LUT 的 12 位输出的示例;提供非常精细的频率分辨率和出色的频谱纯度(每增加一个输出宽度的位,提高 6 dB)......直到达到内存要求!这里存在考虑相位截断的动机。

相位截断
通过相位截断,显着降低了内存需求,但代价是增加了额外的噪声源(相位噪声)。如果噪声被很好地理解并且可以计划为远低于任何给定的要求(作为需要内存的交易),我们将看到什么。
还要提到内存优化只需要四分之一周期,因为周期的剩余部分可以从第一个四分之一周期推导出来。还有许多其他内存优化,例如值之间的插值(最常见),并且不加解释地提及,Hutchison 算法和 Sunderland 算法,以及前面提到的 Cordic Rotator。
来自相位截断的相位噪声模式本身将是相位与时间的锯齿函数,表示缺失的截断值。由此,SNR 与相位截断的有用关系如下图所示。这里 SNR 是所需正弦波输出的功率相对于由于相位截断而导致的所有杂散输出的功率。该公式适用于小角度标准适用时(当时)并且来自锯齿函数的 rms 值(或等效于均匀分布的标准偏差),即sin(θ)≈θD12√其中 D 是斜坡的峰间高度或分布的宽度。该公式与来自 LUT 的数字化信号的量化噪声贡献相结合(使用类似的公式:6 dB/位 + 1.76 dB 也来自我们的因子,因为量化噪声可以建模为均匀分布! ),以解决 NCO 中的所有噪声源。要使用这个公式,公式中的位数是发送到 NCO 的位数(未截断的相位位数)。(√12)

最后,我们可能对无杂散动态范围 (SFDR) 感兴趣,它是相对于我们的输出信号的最强杂散的功率电平(与 SNR 中所有杂散的总功率相反)。由于相位截断,最强杂散的功率仅为 6.02 dB/bit,其中 bit 又是发送到 LUT 的位数。(这可以通过对代表我们的相位误差的斜坡模式进行傅里叶变换来得出,同样适用于小角度近似)。所有杂散都是基波输出频率的整数谐波,其中许多将在我们实现的第一个奈奎斯特区进行数字折叠,如下图所示。与图表不同,二次谐波不一定是最强的杂散,但有助于说明杂散和 SFDR 的概念。

抖动
抖动是添加少量噪声的过程(例如,使用 LFSR 发生器作为 PCW 输入),这将以 SNR 为代价来提高 SFDR。总噪声功率增加(由于我们额外的附加噪声),但在此过程中可以显着降低杂散水平。