CHDK_DE Vorschauversion  Trunk Rev. 5833
 Alle Datenstrukturen Dateien Funktionen Variablen Typdefinitionen Aufzählungen Aufzählungswerte Makrodefinitionen
cordic_math.c-Dateireferenz
#include "stdlib.h"
#include "luaconf.h"
#include "math.h"
#include "cordic_math.h"
+ Include-Abhängigkeitsdiagramm für cordic_math.c:

gehe zum Quellcode dieser Datei

Funktionen

LUALIB_API void cordic (tangle t, fcordic f, fixed *x, fixed *y, fixed *z)
 
LUALIB_API int cordic_abs (int a)
 
LUALIB_API int cordic_sign (int a)
 
LUALIB_API fixed muldivScaled (fixed a, fixed b, fixed c)
 
LUALIB_API fixed mulScaled (fixed a, fixed b)
 
LUALIB_API fixed divScaled (fixed a, fixed b)
 
LUALIB_API int convertToQ1 (fixed *x, fixed *y)
 
LUALIB_API void convertFromQ1 (fixed *x, fixed *y, int q)
 
LUALIB_API int rotateToQ1 (tangle t, fixed *phi)
 
LUALIB_API void rotateFromQ1 (tangle t, fixed *phi, int q)
 
LUALIB_API fixed cathetus (fixed x)
 
LUALIB_API void sincosCordic (tangle t, fixed phi, fixed *sinphi, fixed *cosphi)
 
LUALIB_API void atanhypCordic (tangle t, fixed px, fixed py, fixed *phi, fixed *hyp)
 
LUALIB_API fixed sinCordic (tangle t, fixed phi)
 
LUALIB_API fixed cosCordic (tangle t, fixed phi)
 
LUALIB_API fixed tanCordic (tangle t, fixed phi)
 
LUALIB_API void recCordic (tangle t, fixed r, fixed theta, fixed *px, fixed *py)
 
LUALIB_API fixed asinCordic (tangle t, fixed x)
 
LUALIB_API fixed acosCordic (tangle t, fixed x)
 
LUALIB_API fixed atanCordic (tangle t, fixed x)
 
LUALIB_API void polCordic (tangle t, fixed px, fixed py, fixed *r, fixed *theta)
 
LUALIB_API fixed sind (fixed phi)
 
LUALIB_API fixed cosd (fixed phi)
 
LUALIB_API fixed tand (fixed phi)
 
LUALIB_API void recd (fixed r, fixed theta, fixed *px, fixed *py)
 
LUALIB_API fixed asind (fixed x)
 
LUALIB_API fixed acosd (fixed x)
 
LUALIB_API fixed atand (fixed x)
 
LUALIB_API void pold (fixed px, fixed py, fixed *r, fixed *theta)
 
LUALIB_API fixed sinr (fixed phi)
 
LUALIB_API fixed cosr (fixed phi)
 
LUALIB_API fixed tanr (fixed phi)
 
LUALIB_API void recr (fixed r, fixed theta, fixed *px, fixed *py)
 
LUALIB_API fixed asinr (fixed x)
 
LUALIB_API fixed acosr (fixed x)
 
LUALIB_API fixed atanr (fixed x)
 
LUALIB_API void polr (fixed px, fixed py, fixed *r, fixed *theta)
 
LUALIB_API fixed fint (fixed a)
 
LUALIB_API fixed fceil (fixed a)
 
LUALIB_API fixed ffloor (fixed a)
 
LUALIB_API fixed fround (fixed a)
 
LUALIB_API fixed floatToFixed (double a)
 
LUALIB_API fixed intToFixed (int4b a, int round)
 
LUALIB_API int4b fixedToInt (fixed a, int round)
 

Variablen

fixed atan_tab [][M]
 
fixed INV_GAIN_CIRCLE [] = {0x136e9, 0x136e8}
 
fixed FULL_CIRCLE [] = {0xc90fd, 0x2d00000}
 
fixed HALF_CIRCLE [] = {0x6487e, 0x1680000}
 
fixed QUART_CIRCLE [] = {0x3243f, 0xb40000}
 
fixed ATAN_LIMIT = 0x36f602be
 
fixed FIXED_MAX = 16383.99999
 

Dokumentation der Funktionen

LUALIB_API fixed acosCordic ( tangle  t,
fixed  x 
)

Definiert in Zeile 196 der Datei cordic_math.c.

196  {
197  fixed phi, hyp;
198  fixed _sin = cathetus(x);
199  atanhypCordic(t, x, _sin, &phi, &hyp);
200  return phi;
201 }
LUALIB_API fixed acosd ( fixed  x)

Definiert in Zeile 238 der Datei cordic_math.c.

238  {
239  return acosCordic(DEG, x);
240 }
LUALIB_API fixed acosr ( fixed  x)

Definiert in Zeile 271 der Datei cordic_math.c.

271  {
272  return acosCordic(RAD, x);
273 }
LUALIB_API fixed asinCordic ( tangle  t,
fixed  x 
)

Definiert in Zeile 189 der Datei cordic_math.c.

189  {
190  fixed phi, hyp;
191  fixed _cos = cathetus(x);
192  atanhypCordic(t, _cos, x, &phi, &hyp);
193  return phi;
194 }
LUALIB_API fixed asind ( fixed  x)

Definiert in Zeile 234 der Datei cordic_math.c.

234  {
235  return asinCordic(DEG, x);
236 }
LUALIB_API fixed asinr ( fixed  x)

Definiert in Zeile 267 der Datei cordic_math.c.

267  {
268  return asinCordic(RAD, x);
269 }
LUALIB_API fixed atanCordic ( tangle  t,
fixed  x 
)

Definiert in Zeile 203 der Datei cordic_math.c.

203  {
204  fixed phi, hyp;
205  atanhypCordic(t, CORDIC_SCALE, x, &phi, &hyp);
206  return phi;
207 }
LUALIB_API fixed atand ( fixed  x)

Definiert in Zeile 242 der Datei cordic_math.c.

242  {
243  return atanCordic(DEG, x);
244 }
LUALIB_API void atanhypCordic ( tangle  t,
fixed  px,
fixed  py,
fixed phi,
fixed hyp 
)

Definiert in Zeile 139 der Datei cordic_math.c.

139  {
140  int q = convertToQ1(&px, &py);
141  int f = 0;
142  while (px > ATAN_LIMIT || py > ATAN_LIMIT) {
143  px /= 2;
144  py /= 2;
145  f = 1;
146  }
147  if (px == 0 && py == 0) {
148  // error input vales
149  *phi = 0;
150  *hyp = 0;
151  } else {
152  fixed x = px, y = py, z = 0;
153  cordic(t, VECTOR, &x, &y, &z);
154  rotateFromQ1(t, &z, q);
155  //shift to [pi; -pi]
156  if ((q == 3) || (q == 4)) { z = z - FULL_CIRCLE[t]; }
157  *phi = z;
158  *hyp = (f)? 0 : x;
159  }
160 }
LUALIB_API fixed atanr ( fixed  x)

Definiert in Zeile 275 der Datei cordic_math.c.

275  {
276  return atanCordic(RAD, x);
277 }
LUALIB_API fixed cathetus ( fixed  x)

Definiert in Zeile 124 der Datei cordic_math.c.

124  {
125  return FIXED(sqrt((1 + FLOAT(x)) * (1 - FLOAT(x))));
126 }
LUALIB_API void convertFromQ1 ( fixed x,
fixed y,
int  q 
)

Definiert in Zeile 97 der Datei cordic_math.c.

97  {
98  int fx = 1, fy = 1;
99  if ((q == 2) || (q == 3)) { fx = -1; }
100  if ((q == 3) || (q == 4)) { fy = -1; }
101  *x = fx * *x;
102  *y = fy * *y;
103 }
LUALIB_API int convertToQ1 ( fixed x,
fixed y 
)

Definiert in Zeile 82 der Datei cordic_math.c.

82  {
83  int fx = (*x >= 0), fy = (*y >= 0);
84  int q = 1;
85  if (!fx && fy) {
86  q = 2;
87  } else if (!fx && !fy) {
88  q = 3;
89  } else if (fx && !fy) {
90  q = 4;
91  }
92  *x = cordic_abs(*x);
93  *y = cordic_abs(*y);
94  return q;
95 }
LUALIB_API void cordic ( tangle  t,
fcordic  f,
fixed x,
fixed y,
fixed z 
)

Definiert in Zeile 29 der Datei cordic_math.c.

29  {
30  long *patan_tab = atan_tab[t];
31  long xstep, ystep, zstep = 1;
32  int i;
33  for (i = 0; i < N; ++i) {
34  xstep = *x >> i;
35  ystep = *y >> i;
36  if (i < M) {
37  zstep = *patan_tab;
38  ++patan_tab;
39  } else zstep >>= 1;
40  int f1 = (f) ? *y >= 0 : *z < 0;
41  *x = (f1) ? *x + ystep : *x - ystep;
42  *y = (f1) ? *y - xstep : *y + xstep;
43  *z = (f1) ? *z + zstep : *z - zstep;
44  }
45 }
LUALIB_API int cordic_abs ( int  a)

Definiert in Zeile 48 der Datei cordic_math.c.

48  {
49  if (a < -INT_MAX) a = -INT_MAX;
50  return abs(a);
51 }
LUALIB_API int cordic_sign ( int  a)

Definiert in Zeile 53 der Datei cordic_math.c.

53  {
54  return (a < 0)? -1 : 1;
55 }
LUALIB_API fixed cosCordic ( tangle  t,
fixed  phi 
)

Definiert in Zeile 169 der Datei cordic_math.c.

169  {
170  fixed _sin, _cos;
171  sincosCordic(t, phi, &_sin, &_cos);
172  return _cos;
173 }
LUALIB_API fixed cosd ( fixed  phi)

Definiert in Zeile 222 der Datei cordic_math.c.

222  {
223  return cosCordic(DEG, phi);
224 }
LUALIB_API fixed cosr ( fixed  phi)

Definiert in Zeile 255 der Datei cordic_math.c.

255  {
256  return cosCordic(RAD, phi);
257 }
LUALIB_API fixed divScaled ( fixed  a,
fixed  b 
)

Definiert in Zeile 78 der Datei cordic_math.c.

78  {
79  return muldivScaled(CORDIC_SCALE, a, b);
80 }
LUALIB_API fixed fceil ( fixed  a)

Definiert in Zeile 288 der Datei cordic_math.c.

288  {
289  fixed int_a = fint(a);
290  return (a < 0 || a == int_a)? int_a: int_a + CORDIC_SCALE;
291 }
LUALIB_API fixed ffloor ( fixed  a)

Definiert in Zeile 293 der Datei cordic_math.c.

293  {
294  fixed int_a = fint(a);
295  return (a > 0 || a == int_a)? int_a: int_a - CORDIC_SCALE;
296 }
LUALIB_API fixed fint ( fixed  a)

Definiert in Zeile 284 der Datei cordic_math.c.

284  {
285  return cordic_sign(a) * (cordic_abs(a) & CORDIC_INTEGER);
286 }
LUALIB_API int4b fixedToInt ( fixed  a,
int  round 
)

Definiert in Zeile 327 der Datei cordic_math.c.

327  {
328  double res = cordic_abs(a);
329  if (res > INT_MAX) {
330  // error int4b overflow
331  res = INT_MAX;
332  }
333  res = res * INT_SCALE / CORDIC_SCALE;
334  if (round) res = res + 0.5;
335  return cordic_sign(a) * res;
336 }
LUALIB_API fixed floatToFixed ( double  a)

Definiert in Zeile 303 der Datei cordic_math.c.

303  {
304  int sign = 1;
305  if (a < 0) {
306  sign = -1;
307  a = -a;
308  }
309  if (a > FIXED_MAX) {
310  // error fixed overflow
311  a = FIXED_MAX;
312  }
313  return a * CORDIC_SCALE * sign;
314 }
LUALIB_API fixed fround ( fixed  a)

Definiert in Zeile 298 der Datei cordic_math.c.

298  {
299  return ffloor(a + CORDIC_SCALE / 2);
300 }
LUALIB_API fixed intToFixed ( int4b  a,
int  round 
)

Definiert in Zeile 316 der Datei cordic_math.c.

316  {
317  double res = cordic_abs(a);
318  if (round) res = res + 0.5;
319  res = res * CORDIC_SCALE / INT_SCALE;
320  if (res > INT_MAX) {
321  // error fixed overflow
322  res = INT_MAX;
323  }
324  return cordic_sign(a) * res;
325 }
LUALIB_API fixed muldivScaled ( fixed  a,
fixed  b,
fixed  c 
)

Definiert in Zeile 58 der Datei cordic_math.c.

58  {
59  double res;
60  if (c != 0) {
61  int sign = cordic_sign(a) * cordic_sign(b) / cordic_sign(c);
62  res = FLOAT(cordic_abs(a)) * FLOAT(cordic_abs(b)) / FLOAT(cordic_abs(c));
63  if (res > INT_MAX) {
64  // error overflow
65  res = INT_MAX;
66  } else { res = sign * res; }
67  } else {
68  // error div 0
69  res = 0;
70  }
71  return FIXED(res);
72 }
LUALIB_API fixed mulScaled ( fixed  a,
fixed  b 
)

Definiert in Zeile 74 der Datei cordic_math.c.

74  {
75  return muldivScaled(a, b, CORDIC_SCALE);
76 }
LUALIB_API void polCordic ( tangle  t,
fixed  px,
fixed  py,
fixed r,
fixed theta 
)

Definiert in Zeile 209 der Datei cordic_math.c.

209  {
210  fixed phi, hyp;
211  atanhypCordic(t, px, py, &phi, &hyp);
212  *theta = phi;
213  *r = mulScaled(hyp, INV_GAIN_CIRCLE[t]);
214 }
LUALIB_API void pold ( fixed  px,
fixed  py,
fixed r,
fixed theta 
)

Definiert in Zeile 246 der Datei cordic_math.c.

246  {
247  polCordic(DEG, px, py, r, theta);
248 }
LUALIB_API void polr ( fixed  px,
fixed  py,
fixed r,
fixed theta 
)

Definiert in Zeile 279 der Datei cordic_math.c.

279  {
280  polCordic(RAD, px, py, r, theta);
281 }
LUALIB_API void recCordic ( tangle  t,
fixed  r,
fixed  theta,
fixed px,
fixed py 
)

Definiert in Zeile 181 der Datei cordic_math.c.

181  {
182  fixed _sin, _cos;
183  sincosCordic(t, theta, &_sin, &_cos);
184  *px = mulScaled(r, _cos);
185  *py = mulScaled(r, _sin);
186 }
LUALIB_API void recd ( fixed  r,
fixed  theta,
fixed px,
fixed py 
)

Definiert in Zeile 230 der Datei cordic_math.c.

230  {
231  recCordic(DEG, r, theta, px, py);
232 }
LUALIB_API void recr ( fixed  r,
fixed  theta,
fixed px,
fixed py 
)

Definiert in Zeile 263 der Datei cordic_math.c.

263  {
264  recCordic(RAD, r, theta, px, py);
265 }
LUALIB_API void rotateFromQ1 ( tangle  t,
fixed phi,
int  q 
)

Definiert in Zeile 116 der Datei cordic_math.c.

116  {
117  switch(q) {
118  case 2: *phi = HALF_CIRCLE[t] - *phi; break;
119  case 3: *phi = HALF_CIRCLE[t] + *phi; break;
120  case 4: *phi = FULL_CIRCLE[t] - *phi; break;
121  }
122 }
LUALIB_API int rotateToQ1 ( tangle  t,
fixed phi 
)

Definiert in Zeile 105 der Datei cordic_math.c.

105  {
106  *phi = (*phi % FULL_CIRCLE[t] + FULL_CIRCLE[t]) % FULL_CIRCLE[t];
107  int q = *phi / QUART_CIRCLE[t] + 1;
108  switch(q) {
109  case 2: *phi = HALF_CIRCLE[t] - *phi; break;
110  case 3: *phi = *phi - HALF_CIRCLE[t]; break;
111  case 4: *phi = FULL_CIRCLE[t] - *phi; break;
112  }
113  return q;
114 }
LUALIB_API fixed sinCordic ( tangle  t,
fixed  phi 
)

Definiert in Zeile 163 der Datei cordic_math.c.

163  {
164  fixed _sin, _cos;
165  sincosCordic(t, phi, &_sin, &_cos);
166  return _sin;
167 }
LUALIB_API void sincosCordic ( tangle  t,
fixed  phi,
fixed sinphi,
fixed cosphi 
)

Definiert in Zeile 129 der Datei cordic_math.c.

129  {
130  int q = rotateToQ1(t, &phi);
131  fixed x = INV_GAIN_CIRCLE[t], y = 0, z = phi;
132  cordic(t, ROTATE, &x, &y, &z);
133  convertFromQ1(&x, &y, q);
134  *sinphi = y;
135  *cosphi = x;
136 }
LUALIB_API fixed sind ( fixed  phi)

Definiert in Zeile 218 der Datei cordic_math.c.

218  {
219  return sinCordic(DEG, phi);
220 }
LUALIB_API fixed sinr ( fixed  phi)

Definiert in Zeile 251 der Datei cordic_math.c.

251  {
252  return sinCordic(RAD, phi);
253 }
LUALIB_API fixed tanCordic ( tangle  t,
fixed  phi 
)

Definiert in Zeile 175 der Datei cordic_math.c.

175  {
176  fixed _sin, _cos;
177  sincosCordic(t, phi, &_sin, &_cos);
178  return divScaled(_sin, _cos);
179 }
LUALIB_API fixed tand ( fixed  phi)

Definiert in Zeile 226 der Datei cordic_math.c.

226  {
227  return tanCordic(DEG, phi);
228 }
LUALIB_API fixed tanr ( fixed  phi)

Definiert in Zeile 259 der Datei cordic_math.c.

259  {
260  return tanCordic(RAD, phi);
261 }

Variablen-Dokumentation

fixed ATAN_LIMIT = 0x36f602be

Definiert in Zeile 25 der Datei cordic_math.c.

fixed atan_tab[][M]
Initialisierung:
= {
{0x1921f, 0xed63, 0x7d6d, 0x3fab, 0x1ff5, 0xffe, 0x7ff, 0x3ff, 0x1ff},
{0x5a0000, 0x35214e, 0x1c128e, 0xe4002, 0x72715, 0x3946f, 0x1ca54, 0xe52d, 0x7297}
}

Definiert in Zeile 17 der Datei cordic_math.c.

fixed FIXED_MAX = 16383.99999

Definiert in Zeile 26 der Datei cordic_math.c.

fixed FULL_CIRCLE[] = {0xc90fd, 0x2d00000}

Definiert in Zeile 22 der Datei cordic_math.c.

fixed HALF_CIRCLE[] = {0x6487e, 0x1680000}

Definiert in Zeile 23 der Datei cordic_math.c.

fixed INV_GAIN_CIRCLE[] = {0x136e9, 0x136e8}

Definiert in Zeile 21 der Datei cordic_math.c.

fixed QUART_CIRCLE[] = {0x3243f, 0xb40000}

Definiert in Zeile 24 der Datei cordic_math.c.