bcm-v4 [Specification]

## PHY Cordic (int theta, struct cint32 *val)

Note: struct cint32 {int q; int i;};

This routine does most of its calculations in a pseudo-floating point. The binary point is in the middle of a 32-bit word, which explains the shifts below. Both arguments are in this form.

1. Create an arctangent table with the following elements:
• 2949120, 1740967, 919879, 466945, 234379, 117304, 58666, 29335, 14668, 7334, 3667, 1833, 917, 458, 229, 115, 57, 29
2. Set signx to 1
3. Set the imaginary part of val[0] to 39797
4. Set the real part of val[0] to 0
5. Set the angle to 0
6. While theta > (180 << 16)

1. Subtract 360 << 16 from theta

7. While -theta > (180 << 16)

1. Add 360 << 16 to theta

8. If theta > (90 << 16)

1. Subtract (180 << 16) from theta

2. Set signx to -1
9. If -theta > (90 << 16)

1. Add 180 << 16 to theta

1. Set signx to -1
10. Loop from 0 to 17 (inclusive)
1. If theta greater than the angle
1. Save the imaginary part of val[0] minus the real part right shifted by the loop index
2. Add the imaginary part of val[0] right shifted by the loop index to the real part of val[0]
3. Replace the imaginary part of val[0] with the temporary from above
4. Add the value from the arctangent table indexed by the loop variable to the angle
2. Otherwise
1. Save the imaginary part of val[0] plus the real part right shifted by the loop index
2. Subtract the imaginary part of val[0] right shifted by the loop index from the real part of val[0]
3. Replace the imaginary part of val[0] with the temporary from above
4. Subtract the value from the arctangent table indexed by the loop variable from the angle
11. Multiply the real and imaginary parts of val[0] by signx

Exported/Archived from the wiki to HTML on 2016-10-27