для начала хочу разобрать уже имеющуюся конструкцию фильтра третьей степени.
// Функция расчета кубического полинома
// на основе модифицированного фильтра Фарроу
double interp(double *y, double x){
double a3 = (y[3]-y[0])/6.0+(y[1]-y[2])/2.0;
double a1 = (y[3]-y[1])/2.0-a3;
double a2 = y[3]-a3-a1-y[2];
return x*(x*(x*a3+a2)+a1)+y[2];
}
// собственно фильтрующая конструкция
for(int i = 0; i<K; i++){
t1[i] = (double)i/Fs1; // текущий момент дискретизации
int j = int((double)i*Fs0/Fs1)-2; // пересчитываю индекс исходного сигнала
if(j<0) j =0; // если индекс отрицателььный то приравниваю его к 0
double x = (t1[i]-t0[j])*Fs0-2; // пересчитываю значение x
y1[i] = interp(y0+j, x); // фильтр Фарроу
t1[i] *= 1E3; // перевожу время результата ресэмплинга в мс
}
Рассуждения будем вести относительно полинома 4-й степени
1) как я понимаю фильтрующая конструкция остаётся всегда без изменений?
2)функция же самого фильтра естественно будет расчитывать уже четыре коэффициента.
я правильно понимаю, что y0+j в принимаемых значениях означает инкремент для индекса у в функции interp?
т.е. если j = 0 то функция расчитывает коэффиценты по y0[0], y0[1], y0[2], y0[3].
если же, скажем j = 1, то функция расчитывает коэффициенты по y0[1], y0[2], y0[3], y0[4]?
3) Вы расчитываете коэффиценты исходя из того что моменты у вас [-2; -1; 0; 1]
у меня для фильтра 4-й степени моменты можно взять такие [-2; -1; -0.5; 0; 1] - справедливо?
4) вы говорите: "На практике необходимо стремиться вести пересчет шкалы времени именно в интервал от -1 до 0"
а потом вы в примере говорите что x нужно пересчитать от -2 до 1. как это объяснить?
Отредактировано Franky (2010-03-23 22:11:12)