一、求模的方法
在数字芯片设计中,求模是一种常见的操作,如已知直角三角形两个底边I,Q求斜边R。在数字信号处理中常见于复信号的求模,如求I+jQ的模值R。以上问题都是已知I,Q求R:
所以求模的操作简单归结为以下三步:
1. 求x和y的平方
2. x和y的平方和
3. 对x和y的平方和开方
以上三步用到了2个乘法器和1个加法器,还有1个开方操作,但是开方怎么做呢?
一般来说,开方有三类办法:
(1)基于牛顿方法的迭代算法
(2)基于数字集的算法
(3)CORDIC算法
以上三类办法中,
第一种牛顿方法的主要缺点为误差取决于第一个迭代值的选择和迭代次数。
第二种基于数字集的算法,在往期中也有介绍,迭代次数取决于不同的算法,迭代次数也取决于位宽,简单的基于数字集的算法迭代次数大,如果使用迭代次数少的基于数字集的算法,基必须大,代价便是复杂度高。
第三种基于CORDIC的算法,是一种比较有效的开方算法,CORDIC硬件在每一步计算中主要使用两个加法和两个移位器,其迭代的步数取决于算术单元和输入信号的动态范围,所以对于不同动态范围的信号需要设置不同的迭代次数才能获得比较小的误差。
本文将要介绍的是一种非迭代的开方近似算法。
二、近似求模
这种近似求模的算法被称为Alpha Max and Beta Min algorithm.
该算法来自于1973年的论文《Linear Approximations to sqrt(x^2+y^2) Having Equiripple Error Characteristic》。
为了求
其中定义了:
以上变换旋转了z=I+jQ至0°到45°之间,形成新的向量z=x+jy所以:
在旋转到的[0,pi/4]区域范围内,R的近似值为:
其中a,b是根据不同区域求出的使误差最小的参数。
近似误差定义如下:
为了改善近似误差,pi/4弧度又被划分为2个区域:
根据论文提供的优化结果,当theta0=pi/8时,具有最小的近似误差,其中在两个区域内的a和b的值分别列在以上表中。
显而易见,在误差可接受范围内,这种近似算法操作简便,只需要乘法和加法,免去了复杂的开方运算,并且,不需要迭代运算。
三、一个例子
求3+j4的模?
根据勾股定理,其实我们已经知道3+j4的模是5。
现在应用以上算法:
本例中的误差为0.86%。
谢谢您的阅读!
原创不易,如果对您有帮助,记得点赞关注哦。欢迎批评指正,谢谢鼓励!
一起“纸上谈芯”,共同学习,下期再会: