基于CORDIC算法的光相位检测及FPGA实现
3 算法校正
输入数据范围为[-1,1],将计算结果与真实结果比较,得到误差分布如图4所示。
由图4可见,在横坐标绝对值为0.6、0.8、0.9附近出现较大误差,最大误差达到10-1数量级。CORDIC算法使用的是一种数值计算逼近的思想,增减的步长值是离散的,为arctan(2i)。在横坐标绝对值为0.3、0.6、0.8、0.9附近,CORDIC计算存在“死区”。本文采用查找表和抛物线插值校正,在误差值较大的区间[c1,c3],令:
在前端数据处理中判断输入值是否在需要校正的区间,若在则进行抛物线插值校正。用少量查找表存储校正区间端点的反正弦值和分母的比值。选用FPGA为32 bit,在其中设计乘法运算时,乘数和被乘数最高为16 bit才不会使数据溢出。在所有抛物线插值校正系数中,区间[0.95,0.96]上抛物线插值校正的一次项系数最大为22.108 9。因此选择高5位为整数位,低11位为小数位进行运算。
4 实验与仿真
CORDIC程序流程图如图5所示,初始化之后,先判断输入值c是否在需要校正的区间。若是,则进入抛物线插值校正运算;否则进行CORDIC运算,使x0=1/An,y0=0,z0=0。CORDIC运算计算出一个小数的反正弦值需要24个时钟周期,为了保证流水线的机能,当输入值c在需要校正的区间时,插值计算后的数据在CORDIC运算模块中直接传输。计算出反正弦值后,判断输入值c的符号位,如果是0,则c为正数,反正弦值也为正数;如果是1,则c为负数,反正弦值也为负数。
仿真软件采用ModelSim SE PLUS 6.2b。输入的c值范围为[-1,1],存放在ModelSim的测试激励文件中。处理一个数据需要24个时钟周期,之后每个周期都能输出一个数据,如图6所示。
将仿真后的数据导入Matlab得到反正弦仿真曲线,如图7(a)所示,并与理想值对比,得到如图7(b)所示误差曲线,CORDIC计算部分弧度值精度达到10-4数量级,经过校正的部分,误差从10-1数量级降到10-4数量级。
本设计采用流水线结构,提高了数据吞吐率。仿真实验表明,光相位的误差精度达到10-4数量级,精度较高,且具有较高的运算速度,适合大数据量高速处理。
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)