MyTetra Share
Делитесь знаниями!
Интерполяция 3 степени
Время создания: 16.09.2019 16:59
Раздел: Computer - Programming - C

#include <stdio.h>

#include <math.h>


float *BufProbe = new float [2048]; //Бфуер входного сгнала

float *BufProbe05 = new float [2048]; //Буфер интерполированыых промежуточных отсчетов

float *BufProbeSum = new float [2048]; //Суммарный буфер для исходных и интерполированыых промежуточных отсчетов

static const float Pi = 3.14159265358979323846;

float *x, *y, *h, *l, *delta, *lambda, *c, *d, *b; //Указатели на массивы в стиле С++ без резервирования памяти

float Hk; //

int N = 256; //Number of ticks

int k = 0; //счетчики в циклах.


void allocmatrix()

{

// x = new float[N+1];

y = new float[N+1];

// h = new float[N+1];

l = new float[N+1];

delta = new float[N+1];

lambda = new float[N+1];

c = new float[N+1];

d = new float[N+1];

b = new float[N+1];

}


void freematrix() //Удаление массивов, освобождение памяти

{

// delete [] x;

delete [] y;

// delete [] h;

delete [] l;

delete [] delta;

delete [] lambda;

delete [] c;

delete [] d;

delete [] b;

}




int main()

{

//Generating random array

for(int i=0; i<N; ++i)

{

BufProbe[i] = 200.0*sin((Pi*(double)i)/10.0)*sin((Pi*(double)i)/178.0);

}






allocmatrix(); //Создаем массивы прожежуточных данных


//Всего для интерполяции необходимо 4 коеффициента

//Коеффициент y[х] - это отсчеты входного сигнала

//Интперполирующие Коеффициенты полинома (сплайнап) b[х], c[х] и d[х] вычисляются далее.

for(int i=0; i<N+1; i++)

{

//x[i] = i; //Массив номеров отсчетов исходгого сигнала. Номера могут быть какими угодно, но в классическом случае,

//т.е. в нашем, это номера отсчетов массыва. По большому счету их можно генерировать

//в цикле или вычислять в процессе реализации, а не хранить в массиве.


y[i] = BufProbe[i]; //Собственно отсчеты исходного сигнала

}


//Первыми вычисляются массивы коеффициентов h[х] и l[х].

// for(k=1; k<=N; k++)

// {

// h[k] = x[k] - x[k-1];


// if(h[k]==0)

// {

// printf("\nError, x[%d]=x[%d]\n", k, k-1);

// break;

// }


// l[k] = (y[k] - y[k-1]);///h[k];

// }




//В случае интерполяции с симметричным удвоением точек коеффициент h[х] всегда равен "1" для всех N отсчетов.

//В данном случае коэффициент h[х] заменен на переменную Hk = 1.0; типа float.

Hk = 1.0;


//Для Hk = 1.0 вместо h[х] цикл вычисления прогоночного коэффициента l[х] сводится к виду:

for(k=1; k<=N; k++)

{


l[k] = (y[k] - y[k-1]);///h[k]; // Прогоночный коэффициент l[х] для всех N отсчетов.

}


//Значения первых отсчетов прогоночных коеффициентов delta[1] и lambda[1]

delta[1] = - 0.25;

lambda[1] = 1.5 * (l[2] - l[1]) / 2.0;


//Вычисление следующих значений прогоночных коеффициентов delta[х] и lambda[х]

for(k=3; k<=N; k++)

{

delta[k-1] = - Hk / (4.0 + delta[k-2]);

lambda[k-1] = (3.0 * (l[k] - l[k-1]) - lambda[k-2]) / (4.0 + delta[k-2]);

}



//Дальше вычисляем коеффициенты полинома (интерполирующей функции)

//Крайние значения коэффициентов c[х]

c[0] = 0;

c[N] = 0;


//Остальные значения коэффициентов c[х]

for(k=N; k>=2; k--)

{

c[k-1] = delta[k-1] * c[k] + lambda[k-1];

}


//Коеффициенты d[х] и b[х]

for(k=1; k<=N; k++)

{

d[k] = (c[k] - c[k-1])/3.0;

b[k] = l[k] + (2.0 * c[k] + c[k-1]) / 3.0;

}


BufProbe05[0] = 0;

for(int k=1; k<=N; k++)

{

BufProbe05[k] = (y[k]) + (b[k] * 0.5) + (c[k] * pow(0.5, 2)) + (d[k] * pow(0.5, 3));

}



/*

for(int i=0; i<N; ++i)

{

printf("%d: %f\n\r", i, BufProbe[i]);

}

*/




for(int i=0; i<N; ++i)

{

printf("%i: %f --- %f\n\r", i, BufProbe[i], BufProbe05[i]);

}









getchar();


freematrix();


return 0;

}

 
MyTetra Share v.0.53
Яндекс индекс цитирования