00001 #ifndef LAGRANGE
00002 #define LAGRANGE
00003 #include <iostream>
00004 #include <fstream>
00005 #include <complex.h>
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 using namespace std;
00027 namespace SPUC {
00036
00037
00038
00039
00040
00041
00042 template <class Numeric> class lagrange
00043 {
00044 public:
00045 long num_taps;
00046 double* coeff;
00047 protected:
00048 Numeric* z;
00049 Numeric output;
00050
00051 public:
00053 void reset() {
00054 for (int i=0;i<=num_taps;i++) z[i] = 0;
00055 output = 0;
00056 }
00058 Numeric out() { return(output); }
00060 Numeric check(long i) { return(z[i]); }
00061
00062 lagrange(void) { };
00064 lagrange(long n) : num_taps(n) {
00065 int i;
00066 coeff = new double[n+1];
00067 z = new Numeric[n+1];
00068 for (i=0;i<=n;i++) {
00069 z[i] = 0;
00070 coeff[i] = 0;
00071 }
00072 }
00074 ~lagrange(void) {
00075 if (num_taps > 0) {
00076 delete [] coeff;
00077 delete [] z;
00078 }
00079 }
00081 void set_size(long n) {
00082 int i;
00083 num_taps = n;
00084 coeff = new double[n+1];
00085 z = new Numeric[n+1];
00086 for (i=0;i<=n;i++) {
00087 z[i] = 0;
00088 coeff[i] = 0;
00089 }
00090 }
00092 void input(Numeric in) {
00093 int i;
00094
00095 for (i=num_taps;i>0;i--) z[i] = z[i-1];
00096
00097 z[0] = in;
00098 }
00103 Numeric update(Numeric in, double offset) {
00104 int i;
00105
00106 for (i=num_taps;i>0;i--) z[i] = z[i-1];
00107
00108 z[0] = in;
00109
00110 calculate_coeff(offset);
00111
00112 return(fir());
00113 }
00115 Numeric fir(void) {
00116 int i;
00117
00118 for (output=0,i=0;i<=num_taps;i++) output += coeff[i]*z[i];
00119 return(output);
00120 }
00122 Numeric rephase(double offset) {
00123
00124 calculate_coeff(offset);
00125
00126 return(fir());
00127 }
00129 void calculate_coeff(double offset) {
00130 int i,k;
00131
00132 double off = offset + num_taps/2;
00133 for (k=0;k<=num_taps;k++) {
00134 coeff[num_taps-k] = 1;
00135 for (i=0;i<=num_taps;i++) if (k!=i) coeff[num_taps-k] *= double(i-off)/double(i-k);
00136 }
00137 }
00139 void print() {
00140 cout << "Lagrange coefficients ";
00141 for (long i=0;i<=num_taps;i++) {
00142 cout << coeff[i] << ' ';
00143 if ((i+1)%6 == 0) cout << '\n';
00144 }
00145 cout << '\n';
00146 cout.flush();
00147 }
00148
00149 };
00150
00151 }
00152 #endif