迭代法定点求actan代码实现

#define   NEG_PI_BY_2	  (-16384)
#define	  PI_BY_2	  (16384)
#define	  PI		  (32767)
#define	  NEG_PI	  (-32767)
uint16_t CORDIC_DATA[16] = {0x2000,0x12E4,0x09FB,0x0511,0x028B,0x0146,0x00A3,0x0051
                            ,0x0029,0x0014,0x000A,0x0005,0x0003,0x0001,0x0001,0x0000
						   };
int32_t atan2CORDIC(int32_t XX, int32_t YY)
{
	int32_t Angle = 0;
	int32_t j;                  // for iteration      
	int32_t N = 16;          // loop times     
	int32_t abs_XX[17] = {0};   
	int32_t abs_YY[17] = {0}; 
	if (XX == 0 || YY == 0) 
	{   
        if (XX ==0) {   
            if (YY > 0)    
                Angle = PI_BY_2;   
            else if(YY < 0)   
                Angle = NEG_PI_BY_2;   
            else Angle = 0;   
        }   
        if (YY ==0) {   
            if (XX >= 0)    
                Angle = 0;   
            else if(XX < 0)   
                Angle = PI;   
        }   
    }
	else
	{
		abs_XX[0] = Abs(XX);
		abs_YY[0] = Abs(YY);
	
		for (j = 0; j < N-1 ; j++) 
		{   
				if (abs_YY[j] > 0) {   
					Angle = Angle + CORDIC_DATA[j];   
					abs_XX[j + 1] = abs_XX[j] + (abs_YY[j] >> j);   
					abs_YY[j + 1] = abs_YY[j] - (abs_XX[j] >> j);   
				}   
				else if (abs_YY[j] < 0) {   
					Angle = Angle - CORDIC_DATA[j];   
					abs_XX[j + 1] = abs_XX[j] - (abs_YY[j] >> j);   
					abs_YY[j + 1] = abs_YY[j] + (abs_XX[j] >> j);   
				}   
				else Angle = Angle;   
		 } 
		 // judge which XXuadrant estiTheta is    
        if (XX > 0) {   
            if (YY >0) {          // the first XXuadrant   
                Angle = Angle;   
            }   
            else if (YY < 0) {    // the forth XXuadrant   
                Angle = -Angle;   
            }   
        }   
        else if (XX < 0) {   
            if (YY >0) {          
                Angle = (32767 - Angle);  
            }   
            else if (YY < 0) {    // the third XXuadrant   
                Angle = (Angle - 32767);   
            }   
        }   
	}	
	return (Angle);
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值