98 if(NumTaps > 256) NumTaps = 256;
99 if(NumTaps < 9) NumTaps = 9;
100 if( (PassType ==
HPF || PassType ==
NOTCH) && NumTaps % 2 == 0) NumTaps--;
109 if(Edge[2] < 0.01)Edge[2] = 0.01;
110 if(Edge[2] > 0.98)Edge[2] = 0.98;
111 Edge[3] = Edge[2] + ParksWidth;
112 if(Edge[3] > 0.99)Edge[3] = 0.99;
118 InitWeight[2] = 10.0;
126 if(Edge[3] > 0.99)Edge[3] = 0.99;
127 if(Edge[3] < 0.02)Edge[3] = 0.02;
128 Edge[2] = Edge[3] - ParksWidth;
129 if(Edge[2] < 0.01)Edge[2] = 0.01;
134 InitWeight[1] = 10.0;
142 Edge[3] = OmegaC - BW/2.0;
143 if(Edge[3] < 0.02)Edge[3] = 0.02;
144 Edge[2] = Edge[3] - ParksWidth;
145 if(Edge[2] < 0.01)Edge[2] = 0.01;
146 Edge[4] = OmegaC + BW/2.0;
147 if(Edge[4] > 0.98)Edge[4] = 0.98;
148 Edge[5] = Edge[4] + ParksWidth;
149 if(Edge[5] > 0.99)Edge[5] = 0.99;
155 InitWeight[1] = 10.0;
157 InitWeight[3] = 10.0;
160 if(PassType ==
NOTCH)
164 Edge[3] = OmegaC - BW/2.0;
165 if(Edge[3] < 0.02)Edge[3] = 0.02;
166 Edge[2] = Edge[3] - ParksWidth;
167 if(Edge[2] < 0.01)Edge[2] = 0.01;
168 Edge[4] = OmegaC + BW/2.0;
169 if(Edge[4] > 0.98)Edge[4] = 0.98;
170 Edge[5] = Edge[4] + ParksWidth;
171 if(Edge[5] > 0.99)Edge[5] = 0.99;
178 InitWeight[2] = 10.0;
183 for(j=1; j<=2*NumBands; j++) Edge[j] /= 2.0;
192 int j, k, GridCount, GridIndex, BandIndex, NumIterations;
193 double LowFreqEdge, UpperFreq, TempVar, Change;
197 if(TapCount % 2)OddNumTaps =
true;
198 else OddNumTaps =
false;
200 HalfTapCount = TapCount/2;
201 if(OddNumTaps) HalfTapCount++;
204 LowFreqEdge = GridCount * HalfTapCount;
205 LowFreqEdge = 0.5 / LowFreqEdge;
209 while(BandIndex <= NumBands)
211 UpperFreq = Edge[k+1];
212 while(Grid[j] <= UpperFreq)
215 DesiredMag[j] = BandMag[BandIndex];
216 Weight[j] = InitWeight[BandIndex];
218 Grid[j] = TempVar + LowFreqEdge;
221 Grid[j-1] = UpperFreq;
222 DesiredMag[j-1] = BandMag[BandIndex];
223 Weight[j-1] = InitWeight[BandIndex];
226 if(BandIndex <= NumBands)Grid[j] = Edge[k];
230 if(!OddNumTaps && Grid[GridIndex] > (0.5-LowFreqEdge)) GridIndex--;
234 for(j=1; j<=GridIndex; j++)
236 Change = cos(
M_PI * Grid[j] );
237 DesiredMag[j] = DesiredMag[j] / Change;
238 Weight[j] = Weight[j] * Change;
242 TempVar = (double)(GridIndex-1)/(double)HalfTapCount;
243 for(j=1; j<=HalfTapCount; j++)
245 ExchangeIndex[j] = (double)(j-1) * TempVar + 1.0;
247 ExchangeIndex[HalfTapCount+1] = GridIndex;
249 NumIterations =
Remez2(GridIndex);
255 for(j=1; j<=HalfTapCount-1; j++)
257 Coeff[j] = 0.5 * Alpha[HalfTapCount+1-j];
259 Coeff[HalfTapCount] = Alpha[1];
263 Coeff[1] = 0.25 * Alpha[HalfTapCount];
264 for(j=2; j<=HalfTapCount-1; j++)
266 Coeff[j] = 0.25 * (Alpha[HalfTapCount+1-j] + Alpha[HalfTapCount+2-j]);
268 Coeff[HalfTapCount] = 0.5 * Alpha[1] + 0.25 * Alpha[2];
272 for(j=1; j<=HalfTapCount; j++)
FirCoeff[j-1] = Coeff[j];
274 for(j=1; j<HalfTapCount; j++)
FirCoeff[HalfTapCount+j-1] = Coeff[HalfTapCount-j];
276 for(j=1; j<=HalfTapCount; j++ )
FirCoeff[HalfTapCount+j-1] = Coeff[HalfTapCount-j+1];
278 FirCoeff.conservativeResize(TapCount);
282 if(NumIterations <= 3)
298 int j, JET, K, k, NU, JCHNGE, K1, KNZ, KLOW, NUT, KUP;
299 int NUT1, LUCK, KN, NITER;
300 double Deviation, DNUM, DDEN, TempVar;
301 double DEVL, COMP, YNZ, Y1, ERR;
309 ExchangeIndex[HalfTapCount+2] = GridIndex + 1;
311 for(j=1; j<=HalfTapCount+1; j++)
313 TempVar = Grid[ ExchangeIndex[j] ];
314 CosOfGrid[j] = cos(TempVar *
M_2PI);
317 JET = (HalfTapCount-1)/15 + 1;
318 for(j=1; j<=HalfTapCount+1; j++)
326 for(j=1; j<=HalfTapCount+1; j++)
328 k = ExchangeIndex[j];
329 DNUM += LeGrangeD[j] * DesiredMag[k];
330 DDEN += (double)K * LeGrangeD[j]/Weight[k];
333 Deviation = DNUM / DDEN;
336 if(Deviation > 0.0) NU = -1;
337 Deviation = -(double)NU * Deviation;
339 for(j=1; j<=HalfTapCount+1; j++)
341 k = ExchangeIndex[j];
342 TempVar = (double)K * Deviation/Weight[k];
343 DesPlus[j] = DesiredMag[k] + TempVar;
347 if(Deviation <= DEVL)
return(NITER);
351 K1 = ExchangeIndex[1];
352 KNZ = ExchangeIndex[HalfTapCount+1];
360 while(j<HalfTapCount+2)
362 KUP = ExchangeIndex[j+1];
363 k = ExchangeIndex[j] + 1;
365 if(j == 2) Y1 = COMP;
368 if(k < KUP && !
ErrTest(k, NUT, COMP, &ERR))
371 COMP = (double)NUT * ERR;
374 if(
ErrTest(k, NUT, COMP, &ERR) )
break;
375 COMP = (double)NUT * ERR;
378 ExchangeIndex[j] = k-1;
390 k = ExchangeIndex[j] + 1;
393 ExchangeIndex[j] = k-1;
403 if(
ErrTest(k, NUT, COMP, &ERR) )
continue;
407 KLOW = ExchangeIndex[j];
413 if(
ErrTest(k, NUT, COMP, &ERR) && JCHNGE <= 0)
goto L225;
415 if(
ErrTest(k, NUT, COMP, &ERR) )
417 KLOW = ExchangeIndex[j];
422 COMP = (double)NUT * ERR;
425 for(k--; k>KLOW; k--)
427 if(
ErrTest(k, NUT, COMP, &ERR) )
break;
428 COMP = (double)NUT * ERR;
431 KLOW = ExchangeIndex[j];
432 ExchangeIndex[j] = k + 1;
437 if(j == HalfTapCount+2) YNZ = COMP;
439 while(j <= HalfTapCount+2)
441 if(K1 > ExchangeIndex[1]) K1 = ExchangeIndex[1];
442 if(KNZ < ExchangeIndex[HalfTapCount+1]) KNZ = ExchangeIndex[HalfTapCount+1];
447 COMP = YNZ * 1.00001;
452 if(
ErrTest(k, NUT, COMP, &ERR) )
continue;
460 if(LUCK == 1 || LUCK == 2)
464 if(COMP > Y1) Y1 = COMP;
465 K1 = ExchangeIndex[HalfTapCount+2];
473 for(k--; k>KLOW; k--)
475 if(
ErrTest(k, NUT, COMP, &ERR) )
continue;
477 COMP = (double)NUT * ERR;
484 if(JCHNGE > 0 && NITER++ <
ITRMAX)
goto TOP_LINE;
488 for(j=1; j<=HalfTapCount; j++)
490 ExchangeIndex[HalfTapCount+2 - j] = ExchangeIndex[HalfTapCount+1 - j];
492 ExchangeIndex[1] = K1;
493 if(NITER++ <
ITRMAX)
goto TOP_LINE;
496 KN = ExchangeIndex[HalfTapCount+2];
497 for(j=1; j<=HalfTapCount; j++)
499 ExchangeIndex[j] = ExchangeIndex[j+1];
501 ExchangeIndex[HalfTapCount+1] = KN;
502 if(NITER++ <
ITRMAX)
goto TOP_LINE;
573 double GTempVar, OneOverNumTaps;
574 double Omega, TempVar, FreqN, TempX, GridCos;
575 double GeeArray[
SMALL];
578 CosOfGrid[HalfTapCount+2] = -2.0;
579 OneOverNumTaps = 1.0 /(double)(2*HalfTapCount-1);
582 for(j=1; j<=HalfTapCount; j++)
584 FreqN = (double)(j-1) * OneOverNumTaps;
585 TempX = cos(
M_2PI * FreqN);
587 GridCos = CosOfGrid[k];
590 while(TempX <= GridCos && (GridCos-TempX) >=
MIN_TEST_VAL)
593 GridCos = CosOfGrid[k];
598 GeeArray[j] = DesPlus[k];
603 GeeArray[j] =
GEE2(1, HalfTapCount+1);
609 for(j=1; j<=HalfTapCount; j++)
612 Omega = (double)(j-1) *
M_2PI * OneOverNumTaps;
613 for(n=1; n<=HalfTapCount-1; n++)
615 TempVar += GeeArray[n+1] * cos(Omega * (
double)n);
617 TempVar = 2.0 * TempVar + GeeArray[1];
621 Alpha[1] = Alpha[1] * OneOverNumTaps;
622 for(j=2; j<=HalfTapCount; j++)
624 Alpha[j] = 2.0 * Alpha[j] * OneOverNumTaps;