Тогда не в d кодах а так?? - как- нибудь проще для mk с АЛУ с аппаратным 16x16 умножением??
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено гоша 30 мая 2004 г. 10:17
В ответ на: кроме того Вы именно так и сделали - взяли модуль этих чисел отправлено Пушистик 29 мая 2004 г. 22:17


#define GLOBAL_Q 16
typedef long _iq; // fixed point format 0x----.----; / GLOBAL_Q==16/
/*===========================================================================*/
//#define iq_mpy(x,y) (((y) * (x)) >> GLOBAL_Q) // Multiply a fixed by a fixed
_iq my_iqmpy(_iq a, _iq b)
{_iq _a, _b;
long a0, a1, b0, b1, c0, c1, c2, c3;
_a= labs(a);
_b= labs(b);
a1= _a >> GLOBAL_Q;
a0= _a & 0x0000ffffL;
b1= _b >> GLOBAL_Q;
b0= _b & 0x0000ffffL;
c0= (a0 * b0) >> GLOBAL_Q;
c1= (a1 * b0);
c2= (a0 * b1);
c3= (a1 * b1) << GLOBAL_Q;
c3+= c2 + c1 + c0;
if( (a & 0x80000000L) ^ (b & 0x80000000L)) return -c3;
return c3;
}
/*===========================================================================*/
//#define iq_rsmpy(x,y) ( (((y) * (x)) >> GLOBAL_Q) > MAXLONG)? MAXLONG : ((y) * (x)) >> GLOBAL_Q) )
// Multiply a fixed by a fixed saturate
_iq my_iqrsmpy(_iq a, _iq b)
{_iq _a, _b;
long a0, a1, b0, b1, c0, c1, c2, c3;
_a= labs(a);
_b= labs(b);
a1= _a >> GLOBAL_Q;
a0= _a & 0x0000ffffL;
b1= _b >> GLOBAL_Q;
b0= _b & 0x0000ffffL;
c0= (a0 * b0) >> GlobalQ;
c1= (a1 * b0);
c2= (a0 * b1);
c3= (a1 * b1) << GLOBAL_Q;
c3+= c2 + c1 + c0;
if(c3 < 0) c3= 0x7fffffffL;
if( (a & 0x80000000L) ^ (b & 0x80000000L)) return -c3;
return c3;
}

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru