00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef DLAGRANGE
00023 #define DLAGRANGE
00024 #include <complex.h>
00025 namespace SPUC {
00029 class double_lagrange
00030 {
00031 public:
00032 long num_taps;
00033 double* coeff;
00034 protected:
00035 double* z;
00036 double output;
00037
00038 public:
00039
00040 double out() { return(output); }
00041
00042
00043 double check(long i) { return(z[i]); }
00044
00045 double_lagrange(void) { };
00046 double_lagrange(long n) : num_taps(n) {
00047 int i;
00048 coeff = new double[n];
00049 z = new double[n];
00050 for (i=0;i<n;i++) z[i] = coeff[i] = 0;
00051 }
00052 void set_size(long n) {
00053 int i;
00054 num_taps = n;
00055 coeff = new double[n];
00056 z = new double[n];
00057 for (i=0;i<n;i++) z[i] = coeff[i] = 0;
00058 }
00059
00060 double update(double in, double offset) {
00061 int i;
00062
00063 for (i=num_taps;i>0;i--) z[i] = z[i-1];
00064
00065 z[0] = in;
00066
00067 for (k=0;k<n;k++) {
00068 coeff[k] = 1;
00069 for (i=0;i<n;i++) {
00070 if (k!=i) coeff[i] *= (offset-i)/(k-i);
00071 }
00072
00073 for (output=0,i=0;i<num_taps;i++) output += coeff[i]*z[i];
00074 return(output);
00075 }
00076 };
00077 }
00078 #endif