summaryrefslogtreecommitdiffstats
path: root/src/tools/cordic.py
blob: 3f80c5f09a59c7f1bb74c877946b4e01bf929566 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# compute arctangent table for CORDIC computations in fttrigon.c
import sys, math

#units  = 64*65536.0   # don't change !!
units  = 256
scale  = units/math.pi
shrink = 1.0
comma  = ""

def calc_val( x ):
    global units, shrink
    angle  = math.atan(x)
    shrink = shrink * math.cos(angle)
    return angle/math.pi * units

def  print_val( n, x ):
    global comma

    lo  = int(x)
    hi  = lo + 1
    alo = math.atan(lo)
    ahi = math.atan(hi)
    ax  = math.atan(2.0**n)

    errlo = abs( alo - ax )
    errhi = abs( ahi - ax )

    if ( errlo < errhi ):
      hi = lo

    sys.stdout.write( comma + repr( int(hi) ) )
    comma = ", "


print ""
print "table of arctan( 1/2^n ) for PI = " + repr(units/65536.0) + " units"

# compute range of "i"
r = [-1]
r = r + range(32)

for n in r:

    if n >= 0:
        x = 1.0/(2.0**n)    # tangent value
    else:
        x = 2.0**(-n)

    angle  = math.atan(x)    # arctangent
    angle2 = angle*scale     # arctangent in FT_Angle units

    # determine which integer value for angle gives the best tangent
    lo  = int(angle2)
    hi  = lo + 1
    tlo = math.tan(lo/scale)
    thi = math.tan(hi/scale)

    errlo = abs( tlo - x )
    errhi = abs( thi - x )

    angle2 = hi
    if errlo < errhi:
        angle2 = lo

    if angle2 <= 0:
        break

    sys.stdout.write( comma + repr( int(angle2) ) )
    comma = ", "

    shrink = shrink * math.cos( angle2/scale)


print
print "shrink factor    = " + repr( shrink )
print "shrink factor 2  = " + repr( shrink * (2.0**32) )
print "expansion factor = " + repr(1/shrink)
print ""