[学习] NCO原理与误差分析

NCO原理与误差分析

NCO(数值控制振荡器)是直接数字频率合成(DDS)的核心组件,用于产生高精度、频率可编程的离散时间正弦/余弦信号。其数学原理基于相位累加和波形查找,主要涉及相位累加器、频率控制字和正弦查找表。

1.相位累加模型

设相位累加器位宽为NNN,频率控制字为MMM(整数),系统时钟频率为fclkf_{\text{clk}}fclk,时钟周期为Tclk=1/fclkT_{\text{clk}}=1/f_{\text{clk}}Tclk=1/fclk。相位累加器的递推方程为:
ϕn=(ϕn−1+M)mod  2N\phin = (\phin-1 + M) \mod 2^Nϕn=(ϕn−1+M)mod2N

其中ϕn\phinϕn表示第nnn个时钟周期的相位值(0≤ϕn<2N0 \leq \phin < 2^N0≤ϕn<2N)。

2.输出频率公式

相位累加器每2N/M2^N/M2N/M个时钟周期溢出一次,对应输出信号的一个完整周期。输出频率为:
fout=M2Nfclkf_{\text{out}} = \frac{M}{2^N} f_{\text{clk}}fout=2NMfclk

推导:相位增量Δϕ=M\Delta \phi = MΔϕ=M对应频率增量Δf=M2Nfclk\Delta f = \frac{M}{2^N} f_{\text{clk}}Δf=2NMfclk,因为相位范围000到2N2^N2N对应角度000到2π2\pi2π。

3.波形生成

取相位累加器的高AAA位作为正弦查找表地址,查找表存储一个周期的正弦离散样本:
Sk=sin⁡(2πk2A),k=0,1,...,2A−1Sk = \sin\left(2\pi \frac{k}{2^A}\right), \quad k = 0, 1, \dots, 2^A-1Sk=sin(2π2Ak),k=0,1,...,2A−1

输出信号为:
yn=S⌊ϕ\[n2N−A⌋]yn = S\left \\left\\lfloor \\frac{\\phi\[n}{2^{N-A}} \right\rfloor \right]yn=S⌊2N−Aϕ\[n⌋]

其中⌊⋅⌋\lfloor \cdot \rfloor⌊⋅⌋表示向下取整,等效于取ϕn\phinϕn的最高AAA位。

4.误差分析

相位量化误差

由于仅使用高AAA位寻址,低N−AN-AN−A位被截断,引入相位误差ϵϕ∈0,2N−A−1\epsilon_{\phi} \in 0, 2\^{N-A}-1ϵϕ∈0,2N−A−1。该误差在时域表现为相位抖动,导致输出频谱中出现杂散分量。

幅度量化误差

查找表存储的幅度值有限位宽(BBB位),引入幅度量化误差ϵamp\epsilon_{\text{amp}}ϵamp,信噪比(SNR)约为:
SNR≈6.02B+1.76dB\text{SNR} \approx 6.02B + 1.76 \quad \text{dB}SNR≈6.02B+1.76dB

杂散频率位置

相位截断导致的杂散频率分量位于:
fspur=∣K2N−Afclk±fout∣f_{\text{spur}} = \left| \frac{K}{2^{N-A}} f_{\text{clk}} \pm f_{\text{out}} \right|fspur= 2N−AKfclk±fout

其中KKK为整数,且K≠0K \neq 0K=0。

5.改进方法

  • 相位抖动注入:在累加前加入随机噪声,将杂散能量转化为基底噪声。
  • CORDIC算法:直接计算正弦值,避免查找表,但增加计算复杂度。
  • 增加位宽 :增大NNN和AAA可降低量化误差,但消耗更多硬件资源。

6.扩展应用

NCO可用于调制解调、频谱搬移、时钟生成等。结合正交输出,可生成复指数信号:
yIn=cos⁡(2πϕn2N),yQn=sin⁡(2πϕn2N)y_In = \cos(2\pi \frac{\phin}{2^N}), \quad y_Qn = \sin(2\pi \frac{\phin}{2^N})yIn=cos(2π2Nϕn),yQn=sin(2π2Nϕn)

实现正交上/下变频。

NCO的数学原理体现了数字信号处理中相位累加与波形合成的核心思想,通过数字控制实现精确的频率和相位可编程性。


研究学习不易,点赞易。
工作生活不易,收藏易,点收藏不迷茫 :)


相关推荐
狂奔蜗牛(bradley)9 小时前
拒绝SOEM黑盒!死磕EtherCAT主站:ARM+FPGA架构、DC同步与状态机修复等,50+篇实战开发文档全公开
arm开发·fpga开发·架构
XMAIPC_Robot12 小时前
CODESYS 实时控制 + RK182X 大模型算力扩展|RK3576 工业边缘控制器设计
人工智能·fpga开发·机器人·rk3588+fpga
女神下凡15 小时前
芯参谋(31):SPI NOR Flash 电路设计指南
arm开发·单片机·嵌入式硬件·fpga开发·设计规范
学习FPGA的电气小兴兴17 小时前
基于FPGA的CORDIC旋转模式实现sin和cos运算_采用EGo1板卡上板验证【FPGA数字信号处理第5讲】
fpga开发·信号处理·数字信号处理·verilog·cordic·ego1·fpga设计入门与提高
博览鸿蒙7 天前
FPGA开发使用的语言
fpga开发·fpga
明德扬7 天前
机器人多摄像头如何做FPGA多路视频聚合?
学习·fpga开发·fpga
JoYER_cc8 天前
FPGA 调试实录:LED 闪烁程序从踩坑到仿真验证的完整经验总结
fpga开发
ktd0078 天前
复旦微开发环境搭建流程备忘录
fpga开发
ERROR:998 天前
陈工,试试Agent开发FPGA
fpga开发
威嵌神州8 天前
复旦微 FMQL100TAI 开发 8 问:仿真器、系统、接口高频问题解答
人工智能·嵌入式硬件·fpga开发