[an error occurred while processing this directive] [an error occurred while processing this directive]
Elektronikу - в продолжение темы о состязаниях в шустрости
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено Сергей Борщ 05 февраля 2002 г. 17:04

Извиняюсь за задержку - вчера предложили сходить в оперетту, не смог отказаться. Поэтому не заслал сюда свой вариант задачи.

Вычисление аппроксимирующей функции (МНК с ортогональным базисом).
Источник - А.Е. Мудров, "Численные методы для ПЭВМ", Томск, МП "Раско", 1991г.
Задача, вполне характерная для Embedded.


#define PolynomSize 6
#define TestSize 12

typedef struct
{
float A,B,C;
}PolynomType;


PolynomType Curva[PolynomSize] =
{
{ 0.000000e+00, 0.000000e+00, 6.572746e-01 },
{ 1.538023e-01, 1.200000e+01, 2.461351e+00 },
{ 1.797707e-01, 9.678312e-03, -2.489141e+00 },
{ 1.632455e-01, 3.831551e-03, 1.029298e+01 },
{ 1.654519e-01, 4.851670e-03, -5.139529e+01 },
{ 1.605135e-01, 3.762015e-03, 1.107173e+03 }
};

float TestData[TestSize]=
{
0.2986275,
0.2941434,
0.2738411,
0.2384701,
0.2033925,
0.1462702,
0.11052120,
0.08661973,
0.06680501,
0.05025315,
0.04257548,
0.03410769
};

float Fx (float Input)
{
float Result=Curva[0].C,S=0,Q=1,D;
unsigned char i;
for(i=1;i {
D=(Input-Curva[i].A)*Q-Curva[i].B*S;
Result+=Curva[i].C*D;
S=Q;
Q=D;
}
Result=((1/Result)-1);
return (Result);
}

float Output[TestSize];
void main (void)
{
unsigned char i;
*(unsigned int*)0x120=0x5A80; //disable WDT
// Label1
for(i=0; i Output[i]=Fx(TestData[i]);
// Label2
}


Данные (коэффициенты и тестовый набор) расположены в ОЗУ для адекватности (АВР из флешки читает дольше, для MSP все равно - озу/флеш).
Считаем также, что накладные расходы на копирование этих данных в ОЗУ участвуют в тесте, поскольку обусловлены архитектурой кристалла.
Для такого варианта 430 с умножителем всю программу (от ресета до Label2) выполняет за 83005 тактов, без умножителя - за 119394 тактов.
Если отбросить расходы на копирование (т.е считать от Label1 до Label2) то получается 117018 тактов без умножителя и 80629 тактов с умножителем.
Что получится для АВРа?

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

Ответы



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

E-mail: info@telesys.ru