Посоветуйте, как улучшить код.

Hемедленно нажми на RESET, All!

Hаписал вот код. ~2кбайта кода для pic18. Библиотечный косинус медленный и плавающий, и к тому же уже к трём килобайтам приближается.

Почему развёрнутый цикл -- если в нормальном цикле, то не разворачиваются циклы сдвига вправо, всё сильно медленее.

Склоняюсь к мысли, что линейная интерполяция по таблице (256 байт) не такой уж и плохой вариант. Может быть можно улучшить?

/* angle 0..64 -> result 0..16383 */ void sincos_u14(uint_fast8_t angle, int_fast16_t *sin_u14, int_fast16_t

*cos_u14) { int16_t x, y, t; int16_t c, a; #define CORDIC(s, u) if (a > c) t=x-(y>>s), y+=(x>>s), x=t, c+=u; \ else t=x+(y>>s), y-=(x>>s), x=t, c-=u; a=angle<<8; x=9949, y=0; c=0; CORDIC(0, 8192); CORDIC(1, 4836); CORDIC(2, 2555); CORDIC(3, 1297); CORDIC(4, 651); CORDIC(5, 326); CORDIC(6, 163); CORDIC(7, 81); CORDIC(8, 41); CORDIC(9, 20); CORDIC(10, 10); CORDIC(11, 5); *sin_u14=y, *cos_u14=x; }

/* angle 0..255 (256 is pi/2) */ int_fast16_t cos_i12(uint_fast8_t angle) { int_fast16_t sin_u14, cos_u14; if (angle<64) { sincos_u14(angle, &sin_u14, &cos_u14); } else if (angle<128) { sincos_u14(128-angle, &sin_u14, &cos_u14); cos_u14=0-cos_u14; } else if (angle<192) { sincos_u14(angle-128, &sin_u14, &cos_u14); cos_u14=0-cos_u14; } else { sincos_u14(256-angle, &sin_u14, &cos_u14); } return cos_u14>>3; }

[ZX]
Reply to
Kirill Frolov
Loading thread data ...

Hello, Kirill! You wrote to All on Wed, 11 Feb 2009 21:19:58 +0500:

KF> Hаписал вот код. ~2кбайта кода для pic18. Библиотечный косинус KF> медленный и плавающий, и к тому же уже к трём килобайтам KF> приближается.

KF> Почему развёрнутый цикл -- если в нормальном цикле, то не KF> разворачиваются циклы сдвига вправо, всё сильно медленее.

KF> Склоняюсь к мысли, что линейная интерполяция по таблице (256 KF> байт) не такой уж и плохой вариант. Может быть можно улучшить? Я же именно для тебя с год-два назад кидал сюда исходник именно на эту тему... ты правда тогда сказал, что "не любишь копаться в чужих исходниках"!!!;) Хозяин барин - а сегодня ты полагаешь, что кто-то полюбить копаться в твоих?

KF> /* angle 0..64 -> result 0..16383 */ KF> void sincos_u14(uint_fast8_t angle, int_fast16_t *sin_u14, KF> int_fast16_t *cos_u14) KF> { KF> int16_t x, y, t; KF> int16_t c, a; KF> #define CORDIC(s, u) if (a > c) t=x-(y>>s), y+=(x>>s), x=t, c+=u; \ KF> else t=x+(y>>s), y-=(x>>s), x=t, c-=u; KF> a=angle<<8; KF> x=9949, y=0; KF> c=0; KF> CORDIC(0, 8192); KF> CORDIC(1, 4836); KF> CORDIC(2, 2555); KF> CORDIC(3, 1297); KF> CORDIC(4, 651); KF> CORDIC(5, 326); KF> CORDIC(6, 163); KF> CORDIC(7, 81); KF> CORDIC(8, 41); KF> CORDIC(9, 20); KF> CORDIC(10, 10); KF> CORDIC(11, 5); KF> *sin_u14=y, *cos_u14=x; KF> }

KF> /* angle 0..255 (256 is pi/2) */ KF> int_fast16_t cos_i12(uint_fast8_t angle) KF> { KF> int_fast16_t sin_u14, cos_u14; KF> if (angle<64) { KF> sincos_u14(angle, &sin_u14, &cos_u14); KF> } KF> else if (angle<128) { KF> sincos_u14(128-angle, &sin_u14, &cos_u14); KF> cos_u14=0-cos_u14; KF> } KF> else if (angle<192) { KF> sincos_u14(angle-128, &sin_u14, &cos_u14); KF> cos_u14=0-cos_u14; KF> } KF> else { KF> sincos_u14(256-angle, &sin_u14, &cos_u14); KF> } KF> return cos_u14>>3; KF> }

With best regards, Andrej Arnold. E-mail: snipped-for-privacy@aol.com

Reply to
Andrej Arnold

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.