Scipy에서 CORDIC

가산, 감산, 시프트 연산만으로 삼각 함수를 계산할 수 있다는 것입니다.
자세한 것은 여기의 페이지가 매우 알기 쉬웠다.
실제로 써본 코드는 부동 소수점수로 연산하고 있으므로, 시프트 연산 대신에 곱셈을 사용.
그렇다 치더라도 , 자주 이런 알고리즘 을 생각해 낸다 .

이하, 코드와 실행 결과.

cordic.py
#!/usr/bin/env python
from __future__ import division
import scipy as sp
import numpy as np
import matplotlib.pyplot as plt
import math

term_num = 17
thetas =  map( lambda x : math.atan( 1.0 / math.pow( 2.0,x ) ) , range( term_num  + 1) )
hypot_length =  1.0 / reduce( lambda x,y:  x * ( 1.0 / math.cos(y) ) ,thetas,1.0 )

def cos_cordic( angle ):
        x,y = (1.0,1.0)
        acc_theta = thetas[0]
        scale_ratio = 1.0
        for i,theta in enumerate( thetas[1:] ):
                x1,y1 = x,y
                scale_ratio *= 0.5
                if acc_theta < angle :
                        acc_theta += theta
                        x -= scale_ratio * y1
                        y += scale_ratio * x1
                else:
                        acc_theta -= theta
                        x += scale_ratio * y1
                        y -= scale_ratio * x1
        return ( x * hypot_length )


if __name__ == '__main__':
        t = [ x * ( math.pi / 200.0 ) for x in range( 100 ) ]
        result = map( cos_cordic,t )

        plt.plot( result )
        plt.show()

좋은 웹페이지 즐겨찾기