[an error occurred while processing this directive]
Сегодня, видать, все заначки выдам на-гора. Получай, Родина, наш ударный труд!
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

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

Отправлено cout 04 апреля 2003 г. 17:03
В ответ на: Господа, просто горю! отправлено AlexSem 04 апреля 2003 г. 16:15

Это сплайн-интерполяция-экстраполяция по 6 точкам. ( MAXIM = 6 )
Как и положено сплайну, отлично чувствует себя в узлах.
Интерполирует прилично, работает умеренно быстро на general purpose
микроконтроллерах.
Недостатки: ЭКСТРАполяция - прямой линией.
В проекте глобальные массивы XX[i] - времена, Yy[i] - измеренные значания, соответствующие этим временам.(float). Промежутки времени ,где "стоят" измерения, могут быть и не одинаковыми.
Аргумент - точка INTERES на оси времени, где требуется узнать значение ф-ции.(float)
На выходе float.
Пробегая for'ом по оси времени (с каким-то шагом), получаешь картинку на экране (шутка)

////////////////////////////////////
#include
#define MAXIM (6)
float power3(float zx )
{
return (zx*zx*zx);
}/*power3*/

float Spline(double INTERES)
{
unsigned char ii,jj,kk;

float dd,ee,hh,ff,pp,xxx,rrr;
float Ll[MAXIM+3],Rr[MAXIM+3],Ss[MAXIM+3],Mm[MAXIM+3];

dd = Xx[2] - Xx[1];
ee = ( Yy[ 2 ] - Yy[ 1 ] ) / dd;
for( kk=2; kk <= MAXIM-1; kk++ )
{
hh = dd;
dd = Xx[kk+1] - Xx[kk];
ff = ee;
ee = ( Yy[kk+1] - Yy[kk] ) / dd;
Ll[kk] = dd / ( dd + hh);
Rr[kk] = 1.0 - Ll[kk];
Ss[kk] = ( 6.0 * (ee - ff) ) / ( hh + dd );
}
for( kk = 2; kk <= MAXIM-1; kk++ )
{
pp = 1.0 / ( Rr[kk] * Ll[kk-1] + 2 );
Ll[kk] = (-Ll[kk]) * pp;
Ss[kk] = ( Ss[kk] - Rr[kk] * Ss[kk-1] ) * pp;
}/*for*/

Mm[ MAXIM ] = 0.0;
Ll[ MAXIM-1 ] = Ss[ MAXIM-1 ];
Mm[ MAXIM-1 ] = Ll[ MAXIM-1 ];
for( kk = MAXIM-2; kk >= 1; kk-- )
{
Ll[kk] = Ll[kk] * Ll[kk+1] + Ss[kk];
Mm[kk] = Ll[kk];
}
xxx = INTERES;
ii = 0;
if( xxx > Xx[ MAXIM ] )
{
dd = Xx[MAXIM] - Xx[MAXIM-1];
yyy = dd * Mm[ MAXIM-1 ] / 6.0 + ( Yy[MAXIM] - Yy[MAXIM-1] ) / dd;
yyy = yyy * ( xxx - Xx[MAXIM] ) + Yy[MAXIM];
return (yyy);
}
if( xxx <= Xx[ 1 ] )
{
dd = ( Xx[2] - Xx[1] );
yyy = (((-dd) * Mm[2]) / 6.0) + (( Yy[2] - Yy[1] ) / dd);
yyy = (yyy * ( xxx - Xx[1] ) ) + Yy[1];
}/*if*/
else
{
do{ ii++; }while( xxx > Xx[ ii ] );
jj = ( ii - 1 );
dd = ( Xx[ii] - Xx[jj] );
hh = ( xxx - Xx[jj] );
rrr = ( Xx[ii] - xxx );
pp = dd * dd / 6.0;
yyy = ( ( Mm[jj]*(power3(rrr)) + Mm[ii]*(power3(hh)) ) / 6.0 ) / dd;
yyy = yyy+((( Yy[jj]-(Mm[jj]*pp))*rrr) + ((Yy[ii]-(Mm[ii]*pp))*hh) ) / dd;
}
return (yyy);
}/*Spline*/


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

Ответы



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

E-mail: info@telesys.ru