基于Taylor级数近似补偿的改进数控振荡器实现
引言
数字控制振荡器 (NCO) 在软件无线电(SDR)通信系统中具有重要的作用,是软件无线电数字变频技术的必要组成部分,它的性能很大程度上决定着数字变频模块性能以及载波同步模块的同步效果。在软件无线电通信中,信号的处理往往都集中在离散数字域内进行,数据的传输速率和信号的质量都要非常高,这样就要求数字控制振荡器必须具有频率分辨率高、频率转换速度快、无杂散动态范围值(SFDR)高、频谱纯度高和生成的正、余弦信号保持良好的正交特性等特点。
数控振荡器主要由相位累加器、量化器、相位幅度转换电路等部分组成。相位累加器将相位按频率控制字的步长累加,累加结果与初始相位(即相位偏移)的和作为量化器的输入,量化器截取前M bits作为相位幅度转换电路的输入,最后,相位幅度转换电路根据相位值输出对应的正弦或余弦值。本文通过对传统CORDIC算法实现数控振荡器存在的问题进行分析,提出一种适用于软件无线电通信系统的数控振荡器实现新方法。该方法利用二阶泰勒(Taylor)级数近似和残余相角补偿的方法来解决CORDIC算法实现时的精度不够的缺陷,提高了数控振荡器的输出信号频谱的纯度;整个设计采用流水线结构从而可以保证系统的高速度,满足软件无线电系统的高速数据处理的要求;在相位累加器部分加入相角抖动模块来改善角度周期性截断误差所引起的杂散,进一步提高数控振荡器的无杂散动态值。
传统CORDIC算法实现
CORDIC(Coordinate Rotation Digital Computer)算法是由J.Voider等人在1959年提出的[1],它是基于向量旋转的算法,通过迭代方法实现对任意角度的向量旋转,这些迭代只需使用简单的移位和加减法操作,所有三角函数都可以通过向量旋转函数进行计算。CORDIC算法的基本迭代算式为:
用CORDIC算法实现数控振荡器存在精度不高的问题,它的杂散源主要有以下几部分:由于算法采用的算术精度有限对最终结果造成的误差,这部分误差是由尾数舍弃带来的截断误差,这部分误差是引起杂散的一个原因;N次旋转所得的累加角度与目标角度之间的残余相角误差所引起杂散;由于CORDIC算法的迭代级数有限,旋转产生的角度误差为周期信号,周期性误差同样会引起杂散。
由于传统CORDIC算法实现数控振荡器存在着不足,故本文在传统CORDIC算法的基础上,提出采用Taylor级数补偿CORDIC算法的改进数控振荡器实现方法。
基于Taylor级数近似补偿的改进实现数控振荡器
针对CORDIC算法在实现数控振荡器时存在的迭代残余角度误差、尾数舍入误差以及周期性误差的问题,本文提出了基于对这三部分误差补偿的改进实现方法。
周期性误差补偿
由于CORDIC算法的迭代级数有限,旋转产生的角度误差为周期信号,这样周期性误差会引起杂散,为了减少杂散,提高SFDR,在改进的数控振荡器中加入相位抖动模块。
相位抖动(Dither)的作用是在累加器输出加入随机信号,破坏累加相位的周期性。在累加器输出加入随机抖动信号,破坏累加相位的周期性,可以使数控振荡器输出端的杂散信号能够得到抑制。加入抖动模块可以提高SFDR值,但是杂散的抑制是以牺牲整个系统的基底误差(error floor)为代价的。杂散信号得到抑制的同时,信号的整个SNR会降低。因此抖动信号的幅度选取应合适。相位抖动范围太大会损失SFDR,太小时不能达到抑制杂散频率的效果[3]。相位抖动在实现时采用线性反馈移位寄存器(LFSR)生成伪随机信号序列,相位抖动模块输出的随机信号序列是[0,]范围内的随机值,其中,k为截断相位位宽。
迭代残余角度误差补偿
假设输入CORDIC模块的相角为,经过N次迭代后累加相角为,残余角度为:
这样就可以用公式7来补偿迭代残余角度误差引起的杂散,在方法实现时迭代残余角度误差补偿作为第一级补偿。
基于Taylor级数近似补偿的改进数控振荡器实现
在实现的时候,本文把CORDIC迭代后残余相角补偿作为第一级补偿模块,泰勒级数作为第二级补偿,同时为了降低CORDIC算法旋转产生的角度周期性误差,在设计数控振荡器时,在相位累加器部分引入了随机信号产生模块用来改善角度周期性误差所引起的杂散。基于改进CORDIC算法的数控振荡器的结构如图1所示,主要有相位累加器部分、随机信号产生模块、残余相角补偿模块、二阶泰勒级数补偿模块、正余弦值校正模块等部分组成,在整个结构的实现时采用了流水线结构,这样可以提高数控振荡器的计算速度。图1中灰色的部分是本文提出的对传统CORDIC算法实现的补偿部分。
二阶泰勒补偿实现的原理如下:假设相位累加器输出的相角 为N bits的,把相角 分成三部分,即N=j+k+2。由于CORDIC能计算相角的范围为[-99.9°, 99.9°]之间,这是由CORDIC算法本身所决定的,这样就必须通过三角关系把输入相角转换到[-99.9°, 99.9°]之间,本文利用输入相角的高两位来判断相角的转换。然后再把接下的(N-2)bits的数据分成j bits和k bits两部分,中间j bits作为CORDIC的输入相角 ,后k bits作为后续二阶泰勒补偿模块的输入数据。在这里并没有把整个(N-2)bits的角度 作为CORDIC的输入,而是只取了前j bits,这样就会很大程度的降低模块的占用资源,同时,减少输入数据的位宽就会减少迭代的次数。由于这样只取 的高 1位作为CORDIC的输入,这样产生的截断舍入误差会影响到整个数控振荡器的SFDR,为了补偿这部分的损失,本文采取二阶泰勒级数来补偿这部分损失,对于低k bits的角度(-)用来作为二阶泰勒级数补偿的输入相角。利用二阶泰勒级数补偿(公式8),可以计算出比较准确的正余弦值。
- 基于ML2035的简易正弦信号发生器(11-01)
- 基于DDS芯片AD9852的雷达回波模拟器设计(10-16)