CHDK_DE Vorschauversion  Trunk Rev. 5273
 Alle Datenstrukturen Dateien Funktionen Variablen Typdefinitionen Aufzählungen Aufzählungswerte Makrodefinitionen
cordic_math.c-Dateireferenz
#include "stdio.h"
#include "stdlib.h"
#include "../lib/lua/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 197 der Datei cordic_math.c.

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

Definiert in Zeile 239 der Datei cordic_math.c.

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

Definiert in Zeile 272 der Datei cordic_math.c.

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

Definiert in Zeile 190 der Datei cordic_math.c.

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

Definiert in Zeile 235 der Datei cordic_math.c.

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

Definiert in Zeile 268 der Datei cordic_math.c.

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

Definiert in Zeile 204 der Datei cordic_math.c.

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

Definiert in Zeile 243 der Datei cordic_math.c.

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

Definiert in Zeile 140 der Datei cordic_math.c.

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

Definiert in Zeile 276 der Datei cordic_math.c.

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

Definiert in Zeile 125 der Datei cordic_math.c.

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

Definiert in Zeile 98 der Datei cordic_math.c.

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

Definiert in Zeile 83 der Datei cordic_math.c.

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

Definiert in Zeile 30 der Datei cordic_math.c.

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

Definiert in Zeile 49 der Datei cordic_math.c.

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

Definiert in Zeile 54 der Datei cordic_math.c.

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

Definiert in Zeile 170 der Datei cordic_math.c.

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

Definiert in Zeile 223 der Datei cordic_math.c.

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

Definiert in Zeile 256 der Datei cordic_math.c.

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

Definiert in Zeile 79 der Datei cordic_math.c.

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

Definiert in Zeile 289 der Datei cordic_math.c.

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

Definiert in Zeile 294 der Datei cordic_math.c.

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

Definiert in Zeile 285 der Datei cordic_math.c.

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

Definiert in Zeile 328 der Datei cordic_math.c.

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

Definiert in Zeile 304 der Datei cordic_math.c.

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

Definiert in Zeile 299 der Datei cordic_math.c.

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

Definiert in Zeile 317 der Datei cordic_math.c.

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

Definiert in Zeile 59 der Datei cordic_math.c.

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

Definiert in Zeile 75 der Datei cordic_math.c.

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

Definiert in Zeile 210 der Datei cordic_math.c.

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

Definiert in Zeile 247 der Datei cordic_math.c.

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

Definiert in Zeile 280 der Datei cordic_math.c.

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

Definiert in Zeile 182 der Datei cordic_math.c.

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

Definiert in Zeile 231 der Datei cordic_math.c.

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

Definiert in Zeile 264 der Datei cordic_math.c.

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

Definiert in Zeile 117 der Datei cordic_math.c.

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

Definiert in Zeile 106 der Datei cordic_math.c.

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

Definiert in Zeile 164 der Datei cordic_math.c.

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

Definiert in Zeile 130 der Datei cordic_math.c.

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

Definiert in Zeile 219 der Datei cordic_math.c.

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

Definiert in Zeile 252 der Datei cordic_math.c.

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

Definiert in Zeile 176 der Datei cordic_math.c.

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

Definiert in Zeile 227 der Datei cordic_math.c.

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

Definiert in Zeile 260 der Datei cordic_math.c.

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

Variablen-Dokumentation

fixed ATAN_LIMIT = 0x36f602be

Definiert in Zeile 26 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 18 der Datei cordic_math.c.

fixed FIXED_MAX = 16383.99999

Definiert in Zeile 27 der Datei cordic_math.c.

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

Definiert in Zeile 23 der Datei cordic_math.c.

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

Definiert in Zeile 24 der Datei cordic_math.c.

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

Definiert in Zeile 22 der Datei cordic_math.c.

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

Definiert in Zeile 25 der Datei cordic_math.c.