10 double const pi = M_PI;
13 double logb(
int base, T value)
15 return log(value)/log(base);
53 if((N%2)==0 || (L%4) != 0)
55 cerr <<
"N must be odd and L must be divisible by 4\n";
58 if(0 >= ws1 || ws1 >= wp || wp >= ws2 || ws2 >=
pi)
60 cerr <<
"need: 0 < ws1 < wp < ws2 < pi\n";
65 cerr <<
"L must be positive\n";
70 int q = int((N-L + 1) / 2);
71 int g = int(pow(2,ceil(
log2(8*N))));
76 for(
int i=0; i<w.size2(); i++)
79 double d = ws1 / (
pi-ws2);
80 int q1 = int(round((q+1)/(1+1/d)));
98 for(
int i=0; i<rs1.size2(); i++)
99 rs1(0,i) = i * (ws1/(q1-1));
109 for(
int i=0; i<rs2.size2(); i++)
110 rs2(0,i) = i * ((
pi-ws2)/(q2-1)) + ws2;
114 Matrix rs(rs1.size2() + rs2.size2(),1);
115 for(
int i=0;i<rs1.size2();i++)
117 for(
int i=0;i<rs2.size2();i++)
118 rs(i+rs1.size2(),0) = rs2(0,i);
124 int Z_size = 2 * (g+1-q)-1;
134 for(
int i=0;i<si.size1();i++)
135 si(i,0) = (i % 2)==0 ? 1 : -1;
139 for(
int i=0;i<n.size2();i++)
145 Matrix A1r =
apply(temp, pow, L/2) * pow(-1.0,L/2);
150 for(
int it=0; it<15; it++)
156 a.resize(x.size1()-1,1);
157 for(
int i=0;i<a.size1();i++)
172 F(F.size1()-i,0) = a(i,0)/2;
192 std::vector<int> lmAInv =
localMax(A*(-1));
193 for(
int i=0;i<lmAInv.size();i++)
194 lmA.push_back(lmAInv[i]);
195 sort(lmA.begin(),lmA.end());
198 int llmA = lmA.size();
210 if(abs(A(0,lmA[llmA-1]-1)-A(0,lmA[llmA-2]-1))
211 < abs(A(0,lmA[0]-1)-A(0,lmA[1]-1)))
217 lmA.erase(lmA.begin());
222 std::vector<double> ri(lmA.size());
224 double min = DBL_MAX;
225 for(
int i=0;i<lmA.size();i++)
227 ri[i] = (double(lmA[i])-1.0) *
pi/g;
228 double v = abs(ri[i]-wp);
236 ri.erase(ri.begin()+k);
239 int sign = int(pow(-1.0, L/2));
240 double Aws1 = (prod(
apply(
Matrix(n*ws1),cos), a))(0,0) * sign * pow(sin(ws1/2-wp/2) * sin(ws1/2 + wp/2), L/2) + 1;
241 double Aws2 = (prod(
apply(
Matrix(n*ws2),cos), a))(0,0) * sign * pow(sin(ws2/2-wp/2) * sin(ws2/2 + wp/2), L/2) + 1;
244 bool in_range =
false;
245 for(
int i=0;i<ri.size();i++)
246 if(ri[i] > wp && ri[i] < ws2)
253 if((Aws1 > Aws2) || (in_range))
258 sort(ri.begin(),ri.end());
262 for(
int i=0;i<ri.size();i++)
274 double Err = armax > e1 ? armax : e1;
285 cout <<
"\tErr is " << Err <<
"\n";
288 cout <<
"\tI have converged\n";
303 for(
int i=q-1;i>=1;i--)
305 h(h_index++,0) = a(i,0)/2;
307 h(h_index++,0) = a(0,0);
310 h(h_index++,0) = a(i,0)/2;
322 y(1,0) = -2 * cos(wp);
326 for(
int i=0;i<L/2;i++)
330 int ind = ((N+1)/2) - 1;
343 if(X.size1() < X.size2())
345 int size = X.size1();
347 for(
int i=0;i<size-2;i++)
349 bool b1 = X(i,0) <= X(i+1,0);
350 bool b2 = X(i+1,0) > X(i+2,0);
357 if(X(size-1,0) > X(size-2,0))
360 std::sort(k.begin(), k.end());
371 printf(
"fstop1=%f, fpass=%f, fstop2=%f\n",fstop1, fpass, fstop2);
372 double wp = fpass /(Fs/2) *
pi;
373 double ws1 = fstop1/(Fs/2) *
pi;
374 double ws2 = fstop2/(Fs/2) *
pi;
376 printf(
"wp: %f, ws1: %f, ws2 %f\n",wp,ws1,ws2);
378 return(
chebbp2(N,L,wp,ws1,ws2));
384 ublas::matrix<double>
convolve(ublas::matrix<double> x, ublas::matrix<double> y)
402 for(
int i=0;i<ny-1;i++)
404 x1(x1_index++,0) = 0;
406 for(
int i=0; i<nx; i++)
408 x1(x1_index++,0) = x(i,0);
413 y.resize(ny + nx - 1, 1);
414 for(
int i=0;i<nx-1;i++)
419 ublas::matrix< complex<double> > xfft1 =
fft(x1);
421 ublas::matrix< complex<double> > yfft1 =
Conj(
fft(y));
424 ublas::matrix<double> ret =
Re(
fft(
compProd(xfft1,yfft1),
true)) * (1.0/n);
436 if(B.size2() != 1 || A.size2() != 1)
437 throw(
"B.size2() == 1 or A.size2() == 1");
443 int nDim = x.size1();
457 if(state_x.size1() == 0 || state_x.size2() == 0)
459 if(state_y.size1() == 0 || state_y.size2() == 0)
462 state_x =
cbind(state_x, x);
463 int ncsx =
ncol(state_x);
472 for(
int i=1; i<nB; i++)
474 v = v +
submatrix(state_x, 0, 0, ncsx-i-nX+1, ncsx-i) * B(i,0);
476 state_x =
submatrix(state_x,0,0, ncsx-nB+1, ncsx-1);
478 state_y =
cbind(state_y, v);
482 for(
int i=0; i<nX; i++)
485 + prod(
submatrix(state_y, 0, 0, i, i+nA-3) , Arev);
488 int ncsy =
ncol(state_y);
494 state_y =
submatrix(state_y,0,0,ncsy-nA, ncsy-1);