CORDIC算法的优化方法与流程

文档序号:12595471阅读:550来源:国知局
CORDIC算法的优化方法与流程

本发明属于数字处理技术领域,特别是涉及一种CORDIC算法的优化方法。



背景技术:

坐标旋转数字式计算机(Coordinate Rotation Digital Computer)算法,是J.D.Volder1于1959年首次提出。在上个世纪五十年代,在大型实际计算机中的实行移位相加受到了当时技术的限制,所以使用CORDIC变得非常必要。到了七十年代,Hewlett Packard和其他公司出产了手持式计算器,许多计算器使用内部一个CORDIC单元来计算所有的三角函数。随着八十年代高速乘法器与带有大存储量的通用处理器的出现,CORDIC算法变得无关紧要了。然而在二十一世纪的今天,对于FPGA来说,CORDIC一定是DSP应用中(诸如多输入多输出(MIMO),波束形成以其他自适应系统)计算三角函数的备选技术。

CORDIC算法的基本思想是通过一系列固定的、与运算基数相关的角度不断偏摆以逼近所需的旋转角度。为了扩展可解决的基本函数个数,1971年J.Walther提出了统一CORDIC算法(The Unified Cordic Algorithms),把圆周旋转、双曲旋转和直线旋转统一到同一个迭代方程里,因此可以通过选择不同的m值(如图1 CORDIC算法的操作模式m所示)来实现多种不同的计算功能,设计通用的CORDIC芯片。

CORDIC算法可计算的函数包括乘、除、平方根、正弦、余弦、反正切、向量旋转(即复数乘法)、坐标转换、指数运算以及FFT、DHT、DFT、DCT、DST等技术函数。通常完成这些变换通过两类方法:第一类是专用硬件电路或专用数字信号处理器,通常采用比较或查表的方法,这类方法一般来说运算结构精度低、芯片面积大,更为关键的是设计的灵活性差;第二类则采用软件编程的方法,由于这些变换均是非线性变换,完成一次运算需要运行较多的程序,运算速度较低。上述两种方法在精度、速度、简单性和效率方面都不能兼顾,难以满足现代高速实时信号处理的要求。相比之下,CORDIC算法很好地兼顾了这几方面,非常适合FPGA的实现。对于传统的硬件算法设计中既耗时又占用面积大的乘、除等基本数学函数运算,CORDIC算法将其分解成为一些简单的且在硬件中容易实现的基本算法,如加法、移位等,使得这些算法在硬件上可以很好的实现。此外,该算法是一种规则化的算法,它满足了硬件对算法的模块化、规则化的要求,因此CORDIC算法可以充分发挥硬件的优势,利用硬件的资源,从而实现硬件与算法相结合的一种优化方法。

目前CORDIC算法存在的主要问题:(1)CORDIC算法主要可通过迭代结构和流水线结构来实现。迭代结构使用一个算法单元,将输出反馈到输入反复迭代计算。这种结构节省计算资源,可以实现可调算法精度,但是运行速度慢;流水线结构是将迭代结构展开采用n个算法单元,这将大大提高系统速度,每增加一次迭代精度提高一位,理论上可以通过增加迭代次数无限制提高精度,但是精度受流水线级数的限制,要提高精度必须增加流水线级数,而随着流水线级数的增加,系统面积成指数级增长。(2)CORDIC算法在每一级迭代中都需要在表ROM中取出事先预存好的arctan(2-i)值。但是随着运算字长的扩大,ROM表的容量成指数增长,系统所占资源急剧加大,每次访问ROM表也会降低系统速度。(3)传统CORDIC算法的旋转角度覆盖的角度只有-99.88°~99.88°,为了确保算法收敛,其所有旋转角度之和必须大于实际需要旋转的角度,因此无法覆盖整个周期0°≤θ≤360°。

由于CORDIC算法本身的局限性,曾提出过多种改进和优化措施,主要技术总结如下:(1)增加多次的迭代,使得算法旋转覆盖的角度范围达到一个完整的周期[0,2π]。(2)跳过不必要的旋转。跳过输入相位值中为0的位对应的旋转,减少了迭代次数,并且只有正向旋转。对于特殊角度,例如π/4,通过很少次数的旋转就己经达到该角度,即可不再进行后面的旋转。(3)用几位最高有效数字来决定旋转的方向。然而以上种技术主要针对CORDIC算法角度覆盖范围和运算速度方面的局限性对其进行改进,有效地优化了传统的CORDIC算法。但是,每种改进方法也同时引入了一些新的问题,例如方法1中校正因子为变量,很难确定其值;方法2不能显著的减少迭代次数方法;方法3能有效的减少迭代次数,但是会引起比例因子的变化。



技术实现要素:

鉴于以上所述现有技术的缺点,本发明的目的在于提供一种CORDIC算法的优化方法,用于解决现有技术中CORDIC算法的优化方法存在的不能显著减少迭代次数的问题,以及校正因子为变量、减少迭代次数的同时引起比例因子的变化而导致的计算精度不高的问题。

为实现上述目的及其他相关目的,本发明提供一种CORDIC算法的优化方法,所述CORDIC算法的优化方法包括以下步骤:

1)对输入角度值θ进行区间转换,以将所述输入角度值θ转换到第一象限[0,45°]区间;

2)根据公式对所述输入角度值θ进行编码,得到系数sn的二进制编码S=s0s1s2...sn;其中,系数sn为所述二进制编码S中第n位上的0或1;

3)依据所述二进制编码S中0的位数判断是否将所述二进制编码进行重新编码,并在需要重新编码时将所述二进制编码S进行重新编码;

4)依据公式进行迭代运算,其中,sn为所述二进制编码S中第n位上的0或1,或为所述二进制编码S重新编码后第n位上的0或1。

作为本发明的CORDIC算法的优化方法的一种优选方案,步骤1)包括以下步骤:

1-1)将输入角度值θ转换到第一象限;

1-2)依据公式将所述输入角度值θ转换到第一象限[0,45°]区间。

作为本发明的CORDIC算法的优化方法的一种优选方案,步骤2)中,使用m位的ROM表存储其中,表示不小于的最小整数。

作为本发明的CORDIC算法的优化方法的一种优选方案,步骤3)中,依据所述二进制编码S中0的位数判断是否将所述二进制编码进行重新编码具体方法为:将所述二进制编码S中0的位数记为t,当时不需要将所述二进制编码S进行重新编码,当时将所述二进制编码S进行重新编码。

作为本发明的CORDIC算法的优化方法的一种优选方案,步骤3)中,将所述二进制编码S进行重新编码的方式为取所述二进制编码S的反码

作为本发明的CORDIC算法的优化方法的一种优选方案,步骤4)中,进行迭代运算之后还包括将迭代运算的结果进行修正的步骤。

作为本发明的CORDIC算法的优化方法的一种优选方案,将迭代运算的结果进行修正的具体方法为:将迭代运算的结果乘以一增益常数k进行修正,其中,

作为本发明的CORDIC算法的优化方法的一种优选方案,步骤4)中,Y0=0。

作为本发明的CORDIC算法的优化方法的一种优选方案,当步骤3)中需要将所述二进制编码S进行重新编码时,步骤4)之后还包括将步骤4)得到的结果进行调整的步骤,调整的具体方法为:记S0=111...11,与S0对应的输入角度值记为θ0,依据公式将步骤4)得到的结果进行调整。

如上所述,本发明的CORDIC算法的优化方法,具有以下有益效果:本发明的CORDIC算法的优化方法可以减少一半的迭代运算,节省近一半的运算单元,极大提升了运算速度,节省所需计算资源,对于DSP及FPGA应用具有重大意义;同时,本发明的CORDIC算法的优化方法优化后的计算结果具有较高的精确度。

附图说明

图1显示为现有技术中的CORDIC算法的操作模式图。

图2显示为本发明提供的CORDIC算法的优化方法的流程图。

具体实施方式

以下通过特定的具体实例说明本发明的实施方式,本领域技术人员可由本说明书所揭露的内容轻易地了解本发明的其他优点与功效。本发明还可以通过另外不同的具体实施方式加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本发明的精神下进行各种修饰或改变。

请参阅图2。需要说明的是,本实施例中所提供的图示仅以示意方式说明本发明的基本构想,虽图示中仅显示与本发明中有关的组件而非按照实际实施时的组件数目、形状及尺寸绘制,其实际实施时各组件的形态、数量及比例可为一种随意的改变,且其组件布局型态也可能更为复杂。

请参阅图1,本发明提供一种CORDIC算法的优化方法,所述CORDIC算法的优化方法包括以下步骤:

1)对输入角度值θ进行区间转换,以将所述输入角度值θ转换到第一象限[0,45°]区间;

2)根据公式对所述输入角度值θ进行编码,得到系数sn的二进制编码S=s0s1s2...sn;其中,系数sn为所述二进制编码S中第n位上的0或1;Δθ表示误差;

3)依据所述二进制编码S中0的位数判断是否将所述二进制编码进行重新编码,并在需要重新编码时将所述二进制编码S进行重新编码;

4)依据公式进行迭代运算,其中,sn为所述二进制编码S中第n位上的0或1,或为所述二进制编码S重新编码后第n位上的0或1。

作为示例,步骤1)包括以下步骤:

1-1)将输入角度值θ转换到第一象限;

1-2)依据公式将所述输入角度值θ转换到第一象限[0,45°]区间。

作为示例,步骤2)中,在对输入角度值θ进行迭代之前,用一组基和二进制编码S=s0s1s2...sn表示所述输入角度值θ;这里需要使用一个m位的ROM表存储这组基其中,表示不小于的最小整数。在所述二进制编码S中0的位数越多,输入角度值θ用越少的基表示,CORDIC算法后续所需迭代步骤减少的越多。考虑到最坏的情况此时迭代操作并没有减少,因此需要对所述二进制编码S进行优化以达到所述二进制编码S中“多0少1”。

作为示例,步骤3)中,依据所述二进制编码S中0的位数判断是否将所述二进制编码进行重新编码具体方法为:将所述二进制编码S中0的位数记为t,当时不需要将所述二进制编码S进行重新编码,当时将所述二进制编码S进行重新编码;即当所述二进制编码S中0的位数大于或等于总位数的一半时,则不需要将所述二进制编码S进行重新编码,当所述二进制编码S中的位数小于总位数的一半时,则需要将所述二进制编码S进行重新编码。

作为示例,将所述二进制编码S进行重新编码的方式为取所述二进制编码S的反码具体为:

其中,“=”表示赋值。由上式可推导出S中只要有[n/2]中个“0”([n/2]表示不小于n/2的最小整数)。

作为示例,步骤4)中,进行迭代运算之后还包括将迭代运算的结果进行修正的步骤。具体的,将迭代运算的结果进行修正的具体方法为:将迭代运算的结果乘以一增益常数k进行修正,其中,

作为示例,CORDIC算法主要用于计算三角函数、指数等超越函数,可通过设置不同的初始值来求解具体的函数,在一示例中,初始值设置为:Y0=0,输入所述输入角度值θ,可以求出Xn=cosθ,Yn=sinθ。

作为示例,当步骤3)中需要将所述二进制编码S进行重新编码时,本实施例中,将所述二进制编码S反码得到Xn、Yn是计算输入角度为的结果,因此,最后求出的步骤4)之后还包括将步骤4)得到的结果进行调整的步骤,调整的具体方法为:记S0=111...11,与S0对应的输入角度值记为θ0,依据公式将步骤4)得到的结果进行调整。在实际过程中,一旦计算精度确定,迭代次数n即可确定,S0和θ0也随之确定。依据CORDIC算法具体邱珏的函数和上述调整公式即可求出最后的精确值。以三角函数为例,有如下关系式:

式中cosθ0、sinθ0、exp(θ0)均可预先求出存入ROM表中,最后求解时直接调用即可。

本发明通过对输入角度值的区间转换、编码和重新编码以及最后的迭代运算,虽然增加了编码操作、序列检测以及存储系数的ROM表,但节省了一半左右的迭代运算,相较于传统的CORDIC采用流水线结构实现,每次迭代需要两次移位运算、一次查找表、三次加法运算,而随着计算精度提高和迭代次数增多,本发明的CORDIC算法的优化方法将会节省一半迭代运算,所节省总的计算资源也能趋于50%。

综上所述,本发明提供一种CORDIC算法的优化方法,所述CORDIC算法的优化方法包括以下步骤:1)对输入角度值θ进行区间转换,以将所述输入角度值θ转换到第一象限[0,45°]区间;2)根据公式对所述输入角度值θ进行编码,得到系数sn的二进制编码S=s0s1s2...sn;其中,系数sn为所述二进制编码S中第n位上的0或1;3)依据所述二进制编码S中0的位数判断是否将所述二进制编码进行重新编码,并在需要重新编码时将所述二进制编码S进行重新编码;4)依据公式进行迭代运算,其中,sn为所述二进制编码S中第n位上的0或1,或为所述二进制编码S重新编码后第n位上的0或1。本发明的CORDIC算法的优化方法可以减少一半的迭代运算,节省近一半的运算单元,极大提升了运算速度,节省所需计算资源,对于DSP及FPGA应用具有重大意义;同时,本发明的CORDIC算法的优化方法优化后的计算结果具有较高的精确度。

上述实施例仅例示性说明本发明的原理及其功效,而非用于限制本发明。任何熟悉此技术的人士皆可在不违背本发明的精神及范畴下,对上述实施例进行修饰或改变。因此,举凡所属技术领域中具有通常知识者在未脱离本发明所揭示的精神与技术思想下所完成的一切等效修饰或改变,仍应由本发明的权利要求所涵盖。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1