Статья и теория тут - http://www.dsplib.ru/content/farrow/farrow.html
В функцию передают 4 точки и искомую координату. Закомментил часть, где вручную можно вводить значения. Для образца я взял параметры из статьи. Циклом вычисляю 10 значений из среднего диапазона.
Просьба к форумчанам проверить работоспособность.
Код: Выделить всё
#include <stdio.h>
#include <stdlib.h>
float Farrow_Filter(float x1,float y1,float x2,float y2,float x3, float y3, float x4, float y4, float x_current);
int main()
{
printf("Farrow filter\n");
float i, x1,y1,x2,y2,x3,y3,x4,y4,x_current, y_current; // 4 точки и искомая координата
/* printf("Input 4 points\n");
printf ( "x1= " ), scanf ("%f",&x1);
printf ( "y1= " ), scanf ("%f",&y1);
printf ( "x2= " ), scanf ("%f",&x2);
printf ( "y2= " ), scanf ("%f",&y2);
printf ( "x3= " ), scanf ("%f",&x3);
printf ( "y3= " ), scanf ("%f",&y3);
printf ( "x4= " ), scanf ("%f",&x4);
printf ( "y4= " ), scanf ("%f",&y4);
printf ( "x_current= %f/n" ,x_current);
*/
x1=0;
y1=1;
x2=0.001;
y2=-1;
x3=0.002;
y3=2;
x4=0.003;
y4=1;
x_current=0.0013;
for (i=0.001; i<0.002; i+=0.0001)
{
y_current=Farrow_Filter(x1,y1,x2,y2,x3,y3,x4,y4,i);
printf("y(%f)=%f \n",i, y_current);
}
return 0;
}
float Farrow_Filter(float t0,float y0,float t1,float y1,float t2, float y2, float t3, float y3, float t_current)
{
//модифицированный фильтр Фарроу http://www.dsplib.ru/content/farrow/farrow.html
float x,a0,a1,a2,a3,y;
// нормировка
x=(t_current-t0)*3/(t3-t0)-2;
// коэффициенты полинома
a3=(y3-y0)/6 + (y1-y2)/2;
a1=(y3-y1)/2 - a3;
a2=y3-y2-a1-a3;
a0=y2;
// вычисляем значение в заданой точке
y=((x*a3+a2)*x+a1)*x+a0;
return(y);
}