技术领域
[0001] 本申请涉及芯片技术领域,特别是涉及一种CORDIC算法芯片。
相关背景技术
[0002] 在如今的数字通信领域中,CORDIC算法(Coordinate Rotation Digital Computer,坐标旋转数字算法)有着广泛应用。DDS(Direct Digital Synthesizer,直接数字频率合成器)、FFT(Fast Fourier Transform,快速傅里叶变换)、复乘计算等都可将CORDIC算法电路作为基本组件。
[0003] CORDIC算法的基本原理是将输入向量通过多次迭代,逐次逼近所需旋转角度,得到最终的向量。免缩放CORDIC算法对CORDIC算法的公式进行了进一步简化,省略了CORDIC算法最后与缩放因子做乘法的步骤,使得电路更加简化。
[0004] 但是,由于免缩放CORDIC算法在较大的角度值上精确度较差,故而在目标角度值较大时需要使用较小的角度逐渐旋转逼近目标角度值。在最差的情况下需要旋转32次,也即进行32次迭代才能逼近目标角度值,导致电路消耗加法器资源较多。
具体实施方式
[0045] 为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
[0046] 首先对CORDIC算法和免缩放CORDIC算法(又称SF CORDIC算法,scaling‑free coordinate rotation digital computer)进行介绍。CORDIC算法是一种通过加法和移位就可以进行复杂函数运算的适用于硬件的算法。下面以其旋转操作进行说明。将一个笛卡尔坐标系中的向量 旋转 角度后得到的向量 可以表示为:
[0047]
[0048] 用矩阵乘法可以表示为:
[0049]
[0050] 提取公因式 得到:
[0051]
[0052] 如果 ,那么将 旋转 角度就相当于先将 旋转 角度得到 ,再将 旋转 角度得到 :
[0053]
[0054] 也即:
[0055]
[0056] 所以如果 ,那么:
[0057]
[0058] 令 为正好使得 的角度(例如 , ;, ),并且使得所有需要旋转的角度 都被表示成多个
或者 之和(这样将向量旋转 角度即相当于向 的方向进行旋转,将向量旋转 角度即相当于向 的反方向进行旋转):
[0059]
[0060] 其中 ,是 的总数(因为 从0开始起算,所以是累加到 )。由于正切函数是奇函数,所以 ,上述公式变为:
[0061]
[0062] 因为在硬件中将某一二进制数乘以 即相当于将该二进制数中的全部位向右移‑2i位(例如十进制中的12在二进制中为1100,12×2 =3,3在二进制中为0011,可见将1100与‑2
2 相乘就相当于将其在第3位上的1移至第1位,将在第2位上的1移至第0位),因此上述公式中的右半部分通过移位和加法即可实现。但是上述公式中的左半部分 仍需要较为复杂的操作才能够计算。SF CORDIC算法解决的就是如何在计算中省略这一部分(也称缩放因子)的问题。
[0063] SF CORDIC算法的原理为,如果能够直接找到一些足够小的 值,使得 和也能被表达为 的形式,那么就不需要将 以公因数的形式提取出来,而且在旋转的时候总能找到足够小的 来向 的方向旋转以逼近 ,也就不需要将向量向 的反方向进行旋转。这样计算时就既不用考虑 也不需要考虑缩放因子的问题,大大简化CORDIC算法的计算操作。
[0064] 将目标定为找到 ,使得 (这里的 是弧度值)。考虑到的泰勒展开为:
[0065]
[0066] 那么若需要使得 ,就需要后面的 ……这些展开项全部近似于0。将 代入上述公式得到:
[0067]
[0068] 因为后面的展开项是越来越小的,所以使得最大的 近似于0就等于后面的展开项都会近似于0,使得 。考虑到 ,则有:
[0069]
[0070] 然后,由于在二进制中将一个总共只有N位的二进制数向右移超过N位就相当于使得该二进制数变为0,所以只要使得 就可以使得 。比如,在用16位二进制数表示弧度值的情况下,若要让 ,那么 。
[0071] 类似的,由于 的泰勒展开为:
[0072]
[0073] 因为 近似于0,且 ,所以 及后面的展开项也近似于0。考虑到,再代入 , 可以化简为 。
[0074] 所以上述CORDIC算法的公式可以简化为:
[0075]
[0076] 在 时,有:
[0077]
[0078] 这样就可以仅通过移位和加法运算来得到 的值,同时不需要考虑传统CORDIC算法里的缩放因子,大大简化电路。
[0079] 不过,由于使用SF CORDIC算法有一个 的条件,也即在N是16的情况下 最大是 ,表达成角度值就是 ,而被旋转的角度 又需要被表示为多个的和,所以如果想让SF CORDIC算法处理较大的角度值,那么就需要用数十个甚至上百个旋转电路才能将向量旋转角度 。为解决这个问题,可以采用多种方式对 角进行处理,其中一种方式就是将需要旋转的 角缩放至 的范围内,那么由于 ,将可以应用SF CORDIC算法的最大角度值 最多旋转32次就可以得到角度 。不过,这种方式仍然需要最多32个旋转电路,造成电路资源浪费较多。
[0080] 基于此,本申请实施例提出了一种新型的CORDIC算法芯片来解决上述问题。
[0081] 在一个实施例中,如图1所示,提供了一种CORDIC算法芯片1,芯片1 包括第一迭代模块10和第二迭代模块20,第一迭代模块10包括至少一个迭代单元100,第一迭代模块10用于接收目标向量及待旋转角度向量,根据待旋转角度向量在各目标位数上的取值,从各迭代单元中确定目标迭代单元,并通过各目标迭代单元对目标向量进行旋转处理,得到中间向量,其中,目标位数的个数与待旋转角度向量的长度正相关。第二迭代模块20用于对中间向量进行旋转处理,得到目标向量的输出向量。
[0082] 本申请实施例中,目标向量是需要被进行旋转的向量,待旋转角度向量是目标向量需要旋转的角度 的二进制向量表示。有多种将 记为二进制的方式。比如,由于在SF CORDIC算法中旋转的角度以 为最小单位,所以此处可以使得 的待旋转角度向量中的第i位代表弧度值 ,以使得 的待旋转角度向量表征以多个 之和对 的近似:比如在 是20°=0.349066rad的情况下,可以使得 的待旋转角度向量为0101101000011010,该待旋转角度向量表征的弧度值就是
,与0.349066rad近
似。
[0083] 目标位数至少包括其代表的弧度值不能作为SF CORDIC算法中的 的位数。也即目标位数至少应当满足以下条件:3与目标位数与1的和的乘积与以2为底6的对数之和,小于或者等于待旋转角度向量的总位数;换言之,目标位数小于或者等于第一参数与3的比值与1的差,其中第一参数是待旋转角度向量的总位数与以2为底6的对数的差。如公式(一)所示:
[0084] 公式(一)
[0085] 其中,i是目标位数,N是待旋转角度向量的总位数,因此目标位数的数量和待旋转角度向量的长度正相关。
[0086] 可以通过第一迭代模块10将目标向量旋转上述目标位数所代表的弧度值,然后将旋转后得到的中间向量输入第二迭代模块20,第二迭代模块就可以使用SF CORDIC算法或任意一种改进后的SF CORDIC算法对中间向量进行处理。
[0087] 第一迭代模块10中的各迭代单元100可以分别具有其对应的目标操作和目标弧度值,目标操作表征对输入迭代单元100的向量与目标弧度值的正弦值相乘、或者对输入迭代单元100的向量与目标弧度值的余弦值相乘。可以将目标操作表征与目标弧度值的正弦值相乘的迭代单元100记为正弦迭代单元100(也即在输入向量为 ,目标弧度值为 的情况下,正弦迭代单元输出的是 ),目标操作表征与目标弧度值的余弦值相乘的迭代单元100记为余弦迭代单元100(也即在输入向量为 ,目标弧度值为 的情况下,余弦迭代单元输出的是 )。
[0088] 根据待旋转角度向量在各目标位数上的取值,可以得到待旋转角度向量通过各目标位数表征的弧度值,也即各目标位数对应的弧度值。在采用前述第i位代表弧度值的记法的情况下,待旋转角度向量通过各目标位数表征的弧度值就是为1的各目标位数代表的弧度值之和。以前述16位的待旋转角度向量0101101000011010为例,由于在待旋转角度向量为16位时。在采用其他角度的二进制记法的情况下,可以相应地根据各目标位数的取值得出待旋转角度向量通过各目标位数表征的弧度值。
[0089] 可以根据待旋转角度向量通过各目标位数表征的弧度值和各迭代单元100对应的目标弧度值,从各迭代单元100中确定目标迭代单元。比如可以先从各目标弧度值中确定第一目标弧度值,以使得各第一目标弧度值的和近似于弧度值,然后将各第一目标弧度值对应的迭代单元100作为目标迭代单元。比如,以上述16位的待旋转角度向量0101101000011010为例,由于通过公式(一)可知在N=16时i应当小于或者等于3,因此各目标位数应当是3、2、1、0,待旋转角度向量通过各目标位数表征的弧度值就是。假设各目标弧度值分别是0.3、
0.2、0.1、0.05和0.025,那么各第一目标弧度值就是0.3、0.1和0.025,可以将这三个第一目标弧度值对应的迭代单元100作为目标迭代单元。
[0090] 需要说明的是,由于CORDIC算法的基础迭代公式是 和,因此每个目标弧度值都应有其对应的正弦迭代单元和余弦迭代
单元,这样在确定目标迭代单元的时候就可以把第一目标弧度值对应的正弦迭代单元和余弦迭代单元一起作为目标迭代单元,以通过上述CORDIC算法的基础旋转公式计算旋转后的向量。仍以上述示例为例,在确定目标迭代单元时应当将对应0.3弧度值的正弦迭代单元及余弦迭代单元、对应0.1弧度值的正弦迭代单元及余弦迭代单元和对应0.025弧度值的正弦迭代单元及余弦迭代单元,共计6个迭代单元作为目标迭代单元。
[0091] 迭代单元100可以是直接通过查表得到其对应的目标弧度值的正弦值或正切值的单元,也可以是通过其他方式(如通过泰勒展开求解其对应的目标弧度值的正弦值或正切值)的单元,本申请实施例对此不作具体限定。通过各目标迭代单元对目标向量顺序进行处理后,可以得到中间向量,第二迭代模块再通过任意一种实现SF CORDIC算法的方式对中间向量进行处理,即可得到目标向量旋转后的输出向量。
[0092] 本申请实施例提供的CORDIC算法芯片,使得第一迭代模块包括至少一个迭代单元,每一个迭代单元对应一个可以较大的目标弧度值,进而根据待旋转角度向量各目标位数对应的弧度值和各迭代单元对应的目标弧度值,确定需要使用的目标迭代单元,因此可以直接通过各目标迭代单元较大的目标弧度值对弧度值进行近似,无需使用SF CORDIC算法中较小的角度进行多次旋转来近似该弧度值。在第一迭代模块对目标向量进行旋转处理后,再将处理得到的中间向量输入至用于处理小角度旋转的第二迭代模块中即可得到目标向量。可以大大简化CORDIC算法芯片的电路结构。
[0093] 在一个实施例中,如图2所示,迭代单元100包括第一加法单元110与目标数量个移位单元120,第一加法单元110分别与各移位单元120连接,移位单元120用于对输入移位单元的数据进行移位处理,并输出进行移位处理后的数据。第一加法单元110用于对各移位单元120输出的数据进行加法处理和/或减法处理,并输出进行加法处理和/或减法处理后的数据。其中,目标数量是根据三角函数的泰勒展开形式、迭代单元对应的目标弧度值及待旋转角度向量的总位数确定的。
[0094] 本申请实施例中,由于迭代单元100输出的是 或者 ,且目标弧度值是一个固定值,所以 和 也是固定值,且这两个值可以通过多个移位单元的移位处理来模拟。通过移位单元近似各展开项,就可以将三角函数运算简化为简单的加减运算,以使得将迭代单元100的输入向量 分别输入至各移位单元中进行移位运算,再对移位结果进行加法运算或者减法运算,就可以得到 或者 的值。
[0095] 具体需要多少个移位单元来近似目标弧度值的正弦值与余弦值和目标弧度值相关。而且由于在移位单元的移位值超过 的总位数时,无论 是什么取值,经过移位后其均会变为0,所以移位值超过 的总位数的移位单元均是冗余的,故而移位单元的目标数量也和 的总位数相关。
[0096] 下面以正弦移位单元为例来说明如何设置各移位单元,以及如何确定移位单元的目标数量。这里以该移位单元的目标弧度值 进行说明, 。由于移位值只能是整数,所以需要将该值写为多个2的整数次方之和,这些2的整数次方之和与 或者 的精确值之间的差值应当小于预设阈值。比如在预设阈值是10的‑6次方的情况下, 。
[0097] 假设输入该移位单元的数据 只有8位,那么该数据在经过移位值为9、10、12、13、14的移位单元后均会变成0,所以这些移位单元可以被去除,剩余的移位单元是移位值为3、
4和7的移位单元。将这些移位单元对 的移位值相加,即可得到 的取值。
[0098] 本申请实施例提供的CORDIC算法芯片,通过移位单元来近似目标弧度值的正弦值和余弦值,可以使得每个迭代单元中仅包括简单的移位电路和加法电路,简化迭代单元的电路结构,进一步简化CORDIC算法芯片的电路结构。
[0099] 在一个实施例中,一个移位单元对应三角函数的泰勒展开形式中的一个展开项,且针对任一移位单元,移位单元的移位值是根据移位单元所在的迭代单元100对应的目标弧度值、及移位单元对应的展开项确定的。
[0100] 本申请实施例中,由于分别确定每个目标弧度值的正弦值及余弦值要分别使用哪些移位单元进行近似耗时较长,因此可以通过正弦函数和余弦函数的泰勒展开形式简化上述步骤。每个移位单元可以对应三角函数的泰勒展开形式中的一个展开项,且由于每个展开项的取值均与该移位单元所在的迭代单元100的目标弧度值相关,故而移位单元的移位值可以根据目标弧度值及其对应的展开项进行确定。
[0101] 示例性的,可以使得移位单元的移位值,等于其对应的展开项的除数对应的第一移位值、及该展开项对应的被除数的第二移位值之和(此处将向右移位记为正的移位值,将向左移位记为负的移位值)。第一移位值可以满足以下条件:2的第一移位值次方,是2的各整数次方中与该移位单元对应的展开项的除数差值最小的。第二移位值可以满足以下条件:2的负第二移位值次方,是2的各整数次方中与该移位单元对应的展开项的被除数差值最小的。
[0102] 以下以迭代单元100是正弦迭代单元进行说明。确定余弦迭代单元中各移位单元的移位值的原理与正弦迭代单元相同,将正弦函数的泰勒展开形式替换成余弦函数的泰勒展开形式即可,本申请实施例在此不再赘述。
[0103] 正弦函数的泰勒展开形式可参见公式(二):
[0104] 公式(二)
[0105] 因此如果移位单元对应的是第k个展开项(k从0开始起算),2的该移位单元的第一移位值次方应当尽可能接近第k个展开项的除数 ,将第一移位值记为i,则i应当满足在所有整数中, 最小。
[0106] 对上述条件还可以进一步进行简化:由于 ,而且2的x次方是一个单调递增函数,所以 最小就相当于i只可能取 的
向下取整值或者向上取整值,然后再分别计算在i的向上取整值和向下取整值中哪个更小,即可以得到第一移位值。以实际示例进行说明,在k是2时,
,i取6.9的向下取整值时为6,i取6.9的向上取整值时
为7,由于 ,因此可以使得第一移位值为7。
[0107] 第二移位值可以根据目标弧度值以及移位单元对应的展开项确定。在移位单元对应第k个展开项时,该展开项的被除数是 ,其中 是目标弧度值。将第二移位值记为j,则j应当满足在所有整数中, 最小。此处j的确定方式可以参照上述简化后的i的计算方式,本申请实施例在此不再赘述。
[0108] 考虑到计算 何时最小也较为复杂,因此可以进一步地首先计算2的哪一个整数次方与 的差值最小。将该整数记为m,则上式变为最小。可见在 时上述差值最小,因
此可以使得 ,以此简化j的计算流程。m的确定方式也可以参照上述简化后的i的计算方式,本申请实施例在此不再赘述。例如,在 时,由于 与
0.2最为接近,因此可以使得m=‑2;若k是2,则 ,也即可以将
第二移位值确定为10。
[0109] 第一移位值和第二移位值之和即移位单元的移位值。仍以上述示例进行说明,可以得到在目标弧度值是0.2时,对应第3个展开项(因为k从0起算,所以k=2的展开项是第3个展开项)的移位单元的移位值是17。
[0110] 需要说明的是,如上所述,若第一移位值和第二移位值之和超过输入移位单元的数据的总位数,则该移位单元是冗余的。以上述示例为例,若输入该移位单元的数据的总位数为16,则可以在迭代单元中省略该移位值是17的移位单元。
[0111] 各移位单元对输入该移位单元的数据进行移位处理后,将输出的数据输入至第一加法单元。第一加法单元可以对各移位单元输出的值进行加法处理或者减法处理,以得到本迭代单元输出的数据。第一加法单元具体进行加法还是减法是根据各移位单元对应的展开项在泰勒展开形式中的系数(也就是 的值)确定的:例如若移位单元A对应的展开项是 ,那么由于 在正弦函数的泰勒展开形式中的系数为 ,因此第一加法单元需要对其输出的值做减法。其他移位单元可以此类推。
[0112] 本申请实施例提供的CORDIC算法芯片,通过三角函数的泰勒展开形式来确定每个移位单元的移位值,可以提高确定各移位单元的移位值的效率。
[0113] 在一个实施例中,如图3所示,迭代单元100还包括补偿单元130,一个补偿单元130对应一个移位单元120,第一加法单元110分别与各移位单元120及各补偿单元130连接,补偿单元130用于对输入补偿单元的数据进行移位处理,并输出进行移位处理后的数据。第一加法单元110用于对各移位单元120输出的数据及各补偿单元130输出的数据进行加法处理和/或减法处理,并输出进行加法处理和/或减法处理后的数据。其中,补偿单元130的移位值是根据补偿单元130对应的目标移位单元的移位值,与目标移位单元对应的展开项确定的。
[0114] 本申请实施例中,由于直接通过第一移位值来近似展开项的除数会引入部分误差,故而可以通过在电路中添加补偿单元130来弥补该误差。补偿单元130同样是用于对输入补偿单元的数据进行移位的单元,一个移位单元110可以对应一个或多个补偿单元130,移位单元110对输入其中的数据进行处理后输出的值、与其对应的各补偿单元130对输入其中的数据进行处理后输出的值的和应当近似于移位单元110对应的展开项对应的真实值。每一个补偿单元130可以对应一个对移位单元110对应的展开项的补偿值。因为需要补偿的是第一移位值和该展开项的除数之间的误差,故而该补偿值可以写为该展开项的被除数与某一除数之间的比值。因此,补偿单元130的移位值可以是第二移位值和第三移位值之和:
其中第二移位值即该补偿单元130对应的移位单元110的第二移位值,第三移位值与该补偿单元对应的除数对应,第三移位值应当满足以下条件:2的第三移位值次方,是2的各整数次方中与该补偿单元130对应的除数差值最小的。
[0115] 下面对如何确定各补偿单元130的除数进行说明。仍以正弦迭代单元为例,因为对应同一个移位单元110的各补偿单元130的被除数和该移位单元110的被除数相同,且该被除数和移位单元110对应的展开项的被除数近似,所以可以在后续计算中不考虑被除数。为使得移位单元110输出的数据以及各补偿单元130输出的数据之和与展开项对应的真实值之间的差值尽可能小,可以预先设定预设阈值。移位单元110的第一移位值,和各补偿单元130的第三移位值应当满足以下条件:2的第一移位值次方的倒数,与各2的第三移位值次方之和的倒数,与移位单元110对应的展开项的倒数之间的差值小于预设阈值(参见公式(三)):
[0116] 公式(三)
[0117] 其中,n是移位单元110和各补偿单元130的总数, 是第i个移位单元110或补偿单元130的移位值, 是在迭代单元是正弦迭代单元时,各移位单元对应的展开项的除数(其中的k代表这是第k个展开项,k从0起算),是预设阈值。
[0118] 以具体示例进行说明。在k=1的时候, ,而,0.166748与0.166667的差小于预设阈
值(该阈值可以设置为一个不影响计算精度的较小的数,比如1的负五次方)。移位单元110的第一移位值可以参照前述实施例的方式确定(假设为3),因此各补偿单元130的第三移位值可以分别是5、7、9、11、12。将第二移位值和各补偿单元130的第三移位值相加,可以得到各补偿单元130的总移位值。例如在 、 时第二移位值可以是6,因此各补偿单元130的总移位值可以分别为11、13、15、17、19。
[0119] 需要说明的是,如前所述,每一个移位单元的移位值都不应当超过输入补偿单元130的数据的总位数,否则会使得该数据经补偿单元130移位后变为0。因此可以在根据上述方式确定出各补偿单元130的总移位值后,将其中大于或者等于输入补偿单元130的数据的总位数的补偿单元130去除。例如在输入补偿单元130的数据为16位的情况下,就可以去除移位值为17和19的补偿单元130,保留移位值为11、13、15的补偿单元130。
[0120] 本申请实施例提供的CORDIC算法芯片,通过补偿单元来补偿移位单元的模拟值和泰勒展开式中展开项的实际值的误差,可以减少通过迭代单元对输入迭代单元的数据进行处理的误差。
[0121] 在一个实施例中,如图4所示,待旋转角度向量的各位数分别具有对应的位数弧度值,第一迭代模块10包括目标位数的个数个迭代层11,目标数量是目标位数的个数,一个迭代层11对应一个目标位数,迭代层11包括多个迭代单元100。迭代单元100对应的目标弧度值,是迭代单元100所在的迭代层11对应的目标位数的位数弧度值。第一迭代模块10还用于针对任一目标位数,在目标位数的取值为1的情况下,将目标位数对应的迭代层11作为目标迭代层,并通过各目标迭代层中的各迭代单元100,对目标向量进行旋转处理,得到中间向量。
[0122] 本申请实施例中,待旋转角度向量的各位数分别具有对应的位数弧度值,将取值为1的位数的位数弧度值相加即可得到待旋转角度向量对应的角度。例如可以如前述实施例的示例,使得第i位对应的位数弧度值为 ,或者也可以使得各位数对应其他位数弧度值,本申请实施例对此不作具体限定。
[0123] 可以将各迭代单元100分为多个迭代层11。一个迭代层11对应一个目标位数,且每个迭代层11中的迭代单元100对应的目标弧度值,就是该迭代单元100所在的迭代层11对应的目标位数所代表的位数弧度值。例如若某一迭代层11对应的是目标位数2,且位数i的位数弧度值是 ,则该迭代层11中的所有迭代单元100对应的目标弧度值均为。
[0124] 第一迭代模块在接收到待旋转角度向量,并获取目标位数后,可以在目标位数为1的情况下,将该目标位数对应的迭代层11作为目标迭代层,进而根据目标迭代层中的各迭代单元100对目标向量进行旋转,以得到目标向量对应的中间向量。
[0125] 本申请实施例提供的CORDIC算法芯片,设置多个迭代层,并使得每个迭代层均对应一个目标位数,可以大大简化判断具体要选择哪些迭代单元作为目标迭代单元的步骤,进一步简化CORDIC算法芯片的结构。
[0126] 在一个实施例中,如图5所示,各迭代层11串行排列。目标迭代层用于接收在芯片1上排列在目标迭代层之前的模块发送的第一输入向量,通过目标迭代层中的各迭代单元100,对第一输入向量进行旋转处理,得到第一输出向量,并将第一输出向量发送至在芯片1上排列在目标迭代层之后的模块。
[0127] 本申请实施例中,各迭代层11串行排列,目标向量可以顺序经过各迭代层11,以被旋转为中间向量。
[0128] 本申请实施例对于各迭代层11的排列顺序不作具体限定,图5仅为各迭代层11按照目标位数从小到大排列的一种示例。在目标迭代层是芯片1上的第一个迭代层11时,排列在其之前的模块是将目标向量发送给该目标迭代层的模块,第一输入向量也即目标向量;排列在其之后的模块是下一个目标迭代层。在目标迭代层是芯片1上的最后一个目标迭代层时,排列在其之前的模块是上一个目标迭代层,排列在其之后的模块是第二迭代模块,第一输出向量也即中间向量。在目标迭代层不是第一个或者最后一个迭代层11时,排列在其之前的模块是上一个目标迭代层,第一输入向量是上一个目标迭代层的第一输出向量;排列在其之后的模块是下一个目标迭代层。经过各目标迭代层顺序处理后,目标向量也即相当于被依次旋转过各目标迭代层所对应的目标位数的位数弧度值,因而也即相当于被旋转过了各目标位数的取值所代表的弧度值。
[0129] 本申请实施例提供的CORDIC算法芯片,使得各迭代层串行排列,目标向量顺序经过各目标迭代层,即相当于被旋转过了各目标位数的取值所代表的弧度值,可以简化CORDIC算法芯片的结构。
[0130] 在一个实施例中,如图6所示,第一输入向量及第一输出向量由第一分向量和第二分向量组成,迭代层11由第一分向量迭代单元12及第二分向量迭代单元13组成,分向量迭代单元由迭代单元100组成。第一分向量迭代单元12用于通过第一分向量迭代单元12的各迭代单元100,对第一输入向量进行旋转处理,得到第一输出向量的第一分向量。第二分向量迭代单元13用于通过第二分向量迭代单元13的各迭代单元100,对第一输入向量进行旋转处理,得到第一输出向量的第二分向量。
[0131] 本申请实施例中,由于CORDIC算法的基本迭代公式为 和,也即,旋转后得到的向量的x值(第一分向量)和y值(第二分向
量)需要分别进行计算,故而可以将迭代层11分为用于计算输出向量的第一分向量的第一分向量迭代单元12,和用于计算输出向量的第二分向量的第二分向量迭代单元13。第一分向量迭代单元12可以接收第一输入向量,通过公式 ,根据第一输
入向量的第一分向量和第二分向量计算第一输出向量的第一分向量。第二分向量迭代单元
13可以接收第一输入向量,通过公式 ,根据第一输入向量的第一
分向量和第二分向量计算第一输出向量的第二分向量。第一分向量迭代单元12和第二分向量迭代单元13进而将第一输出向量的第一分向量和第二分向量分别输入至下一模块。
[0132] 本申请实施例提供的CORDIC算法芯片,在迭代层中设置第一分向量迭代单元和第二分向量迭代单元,可以根据CORDIC算法的基础迭代公式来计算每个迭代层应当输出的旋转后的第一输出向量。
[0133] 在一个实施例中,如图7所示,迭代单元100为正弦迭代单元或余弦迭代单元,分向量迭代单元还包括第二加法单元140。第一分向量迭代单元12还用于基于余弦迭代单元对第一输入向量的第一分向量进行旋转处理,得到第二输出向量,基于正弦迭代单元对第一输入向量的第二分向量进行旋转处理,得到第三输出向量,并通过第二加法单元140对第二输出向量及第三输出向量进行相减处理,得到第一输出向量的第一分向量。第二分向量迭代单元13还用于基于正弦迭代单元对第一输入向量的第一分向量进行旋转处理,得到第四输出向量,基于余弦迭代单元对第一输入向量的第二分向量进行旋转处理,得到第五输出向量,并通过第二加法单元140对第四输出向量及第五输出向量进行相加处理,得到第一输出向量的第二分向量。
[0134] 本申请实施例中,可以根据上述CORDIC算法的基本迭代公式来构建第一分向量迭代单元12和第二分向量迭代单元13。第一分向量迭代单元12可以包括1个正弦迭代单元和1个余弦迭代单元。通过正弦迭代单元和余弦迭代单元分别对第一输入向量进行旋转处理后,通过第二加法单元140对正弦迭代单元和余弦迭代单元的输出向量进行相减处理,可以得到第一输出向量的第一分向量。第二分向量迭代单元13可以包括1个正弦迭代单元和1个余弦迭代单元。通过正弦迭代单元和余弦迭代单元分别对第一输入向量进行旋转处理后,通过第二加法单元140对正弦迭代单元和余弦迭代单元的输出向量进行相加处理,可以得到第一输出向量的第二分向量。
[0135] 下面示出一种在待旋转角度向量中位数i对应位数弧度值 、且待旋转角度向量为16位,也即目标位数是0、1、2和3的情况下各迭代层11的具体电路结构,参见图8所示。图8中的xi是第一输入向量的第一分向量,yi是第一输入向量的第二分向量,xi+1是第一输出向量的第一分向量,yi+1是第一输出向量的第二分向量。
[0136] 根据前述实施例所述的方式,可以确定正弦移位单元中,对应第0个展开项的是1个第一移位值为0的移位单元110,对应第1个展开项的是1个第一移位值为3的移位单元110、1个第三移位值为5的补偿单元130和1个第三移位值为7的补偿单元130(此处考虑到精度已经达到需求,因此不再继续设置对应第2个展开项的移位单元110和补偿单元130。但是如果需要设置,可以继续按照前述实施例中的方式,设置1个第一移位值是7的移位单元110和1个第一移位值是12的补偿单元130)。还可以确定余弦移位单元中,对应第0个展开项的是1个第一移位值为0的移位单元110,对应第1个展开项的是1个第一移位值为1的移位单元
110,对应第2个展开项的是1个第一移位值为5的移位单元110、1个第三移位值为7的补偿单元130和1个第三移位值为8的补偿单元130(类似的,由于精度已达到需求,不再继续设置对应第3个展开项的移位单元110和补偿单元130)。
[0137] 然后根据各迭代层11对应的目标位数的位数弧度值,确定位于各迭代层11中的迭代单元100的目标弧度值,进而根据目标弧度值确定各移位单元110和补偿单元130的第二移位值。处于对应目标位数0、1、2、3的迭代层11中的各迭代单元100的目标弧度值分别是、 、 和 。因为现在目标弧度值是 ,且 是一个整数,所以根据前述实施例中的方法,第二移位值就是 (针对正弦移位单元),或者
(针对余弦移位单元)。所以各迭代层11中的移位单元110和补偿单元130的第二移位值分别是:
[0138] 对应目标弧度值为 :正弦移位单元中对应第0个展开项的第二移位值是1,对应第1个展开项的第二移位值是3。余弦移位单元中对应第0个展开项的第二移位值是0,对应第1个展开项的第二移位值是2,对应第2个展开项的第二移位值是4。
[0139] 对应目标弧度值为 :正弦移位单元中对应第0个展开项的第二移位值是2,对应第1个展开项的第二移位值是6。余弦移位单元中对应第0个展开项的第二移位值是0,对应第1个展开项的第二移位值是4,对应第2个展开项的第二移位值是8。
[0140] 对应目标弧度值为 :正弦移位单元中对应第0个展开项的第二移位值是3,对应第1个展开项的第二移位值是9。余弦移位单元中对应第0个展开项的第二移位值是0,对应第1个展开项的第二移位值是6,对应第2个展开项的第二移位值是12。
[0141] 对应目标弧度值为 :正弦移位单元中对应第0个展开项的第二移位值是1,对应第1个展开项的第二移位值是12。余弦移位单元中对应第0个展开项的第二移位值是0,对应第1个展开项的第二移位值是8,对应第2个展开项的第二移位值是16。
[0142] 将各第一移位值和第二移位值相加,以及将各第三移位值和第二移位值相加,可以得到:
[0143] 对应目标弧度值为 :正弦移位单元中对应第0个展开项的移位单元110的移位值是1,对应第1个展开项移位单元110的移位值是6,补偿单元130的移位值是8和10。余弦移位单元中对应第0个展开项的移位单元110的移位值是0,对应第1个展开项的移位单元110的移位值是3,对应第2个展开项的移位单元110的移位值是9,补偿单元的移位值是11和12。
[0144] 对应目标弧度值为 :正弦移位单元中对应第0个展开项的移位单元110的移位值是2,对应第1个展开项移位单元110的移位值是9,补偿单元130的移位值是11和13。余弦移位单元中对应第0个展开项的移位单元110的移位值是0,对应第1个展开项的移位单元110的移位值是5,对应第2个展开项的移位单元110的移位值是13,补偿单元的移位值是15和16。
[0145] 对应目标弧度值为 :正弦移位单元中对应第0个展开项的移位单元110的移位值是3,对应第1个展开项移位单元110的移位值是12,补偿单元130的移位值是14和16。余弦移位单元中对应第0个展开项的移位单元110的移位值是0,对应第1个展开项的移位单元110的移位值是7,对应第2个展开项的移位单元110的移位值是17,补偿单元的移位值是19和20。
[0146] 对应目标弧度值为 :正弦移位单元中对应第0个展开项的移位单元110的移位值是4,对应第1个展开项移位单元110的移位值是15,补偿单元130的移位值是17和19。余弦移位单元中对应第0个展开项的移位单元110的移位值是0,对应第1个展开项的移位单元110的移位值是9,对应第2个展开项的移位单元110的移位值是21,补偿单元的移位值是23和24。
[0147] 因为图8中目标向量的位数是16,所以目标向量的第一分向量和第二分向量的位数也是16,也即输入所有移位单元110和补偿单元130的数值的最大位数为16。因此上述移位值超过16的移位单元110和补偿单元130都可以被省略(若希望进一步简化电路,则移位值大于15的移位单元110和补偿单元130都可以被省略)。再将这些正弦移位单元和余弦移位单元分别组装为第一分向量迭代单元12和第二分向量迭代单元13,即可得到如图8所示的电路。
[0148] 本申请实施例提供的CORDIC算法芯片,在迭代层中设置第一分向量迭代单元和第二分向量迭代单元,可以根据CORDIC算法的基础迭代公式来计算每个迭代层应当输出的旋转后的第一输出向量。
[0149] 在一个实施例中,如图9所示,芯片1还包括预旋转模块30,预旋转模块30用于将待旋转角度映射至预设角度范围内,得到待旋转角度向量。
[0150] 本申请实施例中,由于如果要使得各迭代单元100的计算精度较高,就最好使得待旋转角度向量每个位数对应的位数弧度值都是2的整数倍,但这样会使得待旋转角度向量能够表示的角度范围较小。因此可以通过将需要旋转的待旋转角度映射到可以用待旋转角度向量表示的预设角度范围内来解决上述问题。该预设角度范围可以是任何角度。示例性的,可以通过现有的将待旋转角度映射至 范围内的算法来解决上述问题,这样不会引入缩放因子,便于电路的构建。
[0151] 本申请实施例提供的CORDIC算法芯片,设置预旋转模块,将需要旋转的待旋转角度缩放至迭代单元可以处理的角度范围内,可以使得CORDIC算法芯片能够处理更大的旋转角度。
[0152] 在一个实施例中,如图10所示,第二迭代模块20包括单步迭代模块21及双步迭代模块22,单步迭代模块21包括至少一个单步迭代层210,单步迭代模块21用于根据待旋转角度向量在各第一目标位数上的取值,从各单步迭代层210中确定目标单步迭代层,并通过各目标单步迭代层对中间向量进行旋转处理,得到第一中间向量。双步迭代模块22包括至少一个双步迭代层220,双步迭代模块22用于根据待旋转角度向量在各第二目标位数上的取值,从各双步迭代层220中确定目标双步迭代层,并通过各目标双步迭代层对第一中间向量进行旋转处理,得到目标向量的输出向量。其中,第一目标位数的个数与待旋转角度向量的长度正相关,第二目标位数是待旋转角度向量的各位数中,除目标位数及第一目标位数外的位数。
[0153] 本申请实施例中,单步迭代模块21是根据传统SF CORDIC算法构建的,一个单步迭代层210可以将输入其中的向量,根据该单步迭代层210对应的第一目标位数的位数弧度值进行旋转。单步迭代模块21可以在任意一个第一目标位数是1时,将该第一目标位数对应的单步迭代层210作为目标单步迭代层。单步迭代模块21的具体结构可参见现有的任一种基于SF CORDIC算法构建的旋转电路,本申请实施例在此不再赘述。
[0154] 为进一步简化电路,还可以将两个单步迭代模块21合并成一个双步迭代模块22。双步迭代模块22的基础理论公式为,针对 和 两个弧度值(i<j,可以使得i和j是相邻的两个整数),在 的情况下(N是输入该双步迭代模块22的数据的总位数), 和 这两次旋转就可以被合并成一次,该次旋转的矩阵乘法公式可参见公式(四):
[0155] 公式(四)
[0156] 其中, 是输入双步迭代模块22中的向量, 是双步迭代模块22输出的向量。
[0157] 因此一个双步迭代层220可以对应待旋转角度向量中的两个位数。如果这两个位数中的任意一个是1,那么双步迭代模块22就可以将该双步迭代层220作为目标双步迭代层。
[0158] 因为双步迭代层22更加高效,因此在可以使用双步迭代层22时应当尽可能使用双步迭代层22。在无法使用双步迭代层22时则可以使用单步迭代层21。单步迭代层21的数量可以根据上述使用双步迭代层22的条件来确定。比如在本申请实施例中,由于每个位数i对应的位数弧度值是 ,那么使用双步迭代层220的条件就是双步迭代层220对应的更小的位数i满足 的条件。在N=16的情况下,i最小是8。由于位数0、1、2、3已经被作为了前述实施例中的目标位数,因此还剩下位数4、5、6、7没有对应的迭代层。故而这4个位数就是第一目标位数,可以使得这4个位数分别对应一个单步迭代层21。剩余的位数8至位数15是第二目标位数。
[0159] 本申请实施例提供的CORDIC算法芯片,在第二迭代模块中设置单步迭代模块和双步迭代模块,由于双步迭代模块的电路结构较传统的单步迭代更简单,因此可以进一步简化CORDIC算法芯片的结构。
[0160] 需要说明的是,本申请所涉及的用户信息(包括但不限于用户设备信息、用户个人信息等)和数据(包括但不限于用于分析的数据、存储的数据、展示的数据等),均为经用户授权或者经过各方充分授权的信息和数据。
[0161] 本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、数据库或其它介质的任何引用,均可包括非易失性和易失性存储器中的至少一种。非易失性存储器可包括只读存储器(Read‑Only Memory,ROM)、磁带、软盘、闪存、光存储器、高密度嵌入式非易失性存储器、阻变存储器(ReRAM)、磁变存储器(Magnetoresistive Random Access Memory,MRAM)、铁电存储器(Ferroelectric Random Access Memory,FRAM)、相变存储器(Phase Change Memory,PCM)、石墨烯存储器等。易失性存储器可包括随机存取存储器(Random Access Memory,RAM)或外部高速缓冲存储器等。作为说明而非局限,RAM可以是多种形式,比如静态随机存取存储器(Static Random Access Memory,SRAM)或动态随机存取存储器(Dynamic Random Access Memory,DRAM)等。本申请所提供的各实施例中所涉及的数据库可包括关系型数据库和非关系型数据库中至少一种。非关系型数据库可包括基于区块链的分布式数据库等,不限于此。本申请所提供的各实施例中所涉及的处理器可为通用处理器、中央处理器、图形处理器、数字信号处理器、可编程逻辑器、基于量子计算的数据处理逻辑器等,不限于此。
[0162] 以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
[0163] 以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本申请专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请的保护范围应以所附权利要求为准。