107 if ((PassType ==
HPF || PassType ==
NOTCH) && NumTaps % 2 == 0)
112 if (PassType ==
LPF) {
120 Edge[3] = Edge[2] + ParksWidth;
128 InitWeight[2] = 10.0;
131 if (PassType ==
HPF) {
139 Edge[2] = Edge[3] - ParksWidth;
146 InitWeight[1] = 10.0;
150 if (PassType ==
BPF) {
153 Edge[3] = OmegaC - BW / 2.0;
156 Edge[2] = Edge[3] - ParksWidth;
159 Edge[4] = OmegaC + BW / 2.0;
162 Edge[5] = Edge[4] + ParksWidth;
170 InitWeight[1] = 10.0;
172 InitWeight[3] = 10.0;
175 if (PassType ==
NOTCH) {
178 Edge[3] = OmegaC - BW / 2.0;
181 Edge[2] = Edge[3] - ParksWidth;
184 Edge[4] = OmegaC + BW / 2.0;
187 Edge[5] = Edge[4] + ParksWidth;
196 InitWeight[2] = 10.0;
201 for (j = 1; j <= 2 * NumBands; j++)
211 int j, k, GridCount, GridIndex, BandIndex, NumIterations;
212 double LowFreqEdge, UpperFreq, TempVar, Change;
221 HalfTapCount = TapCount / 2;
226 LowFreqEdge = GridCount * HalfTapCount;
227 LowFreqEdge = 0.5 / LowFreqEdge;
231 while (BandIndex <= NumBands) {
232 UpperFreq = Edge[k + 1];
233 while (Grid[j] <= UpperFreq) {
235 DesiredMag[j] = BandMag[BandIndex];
236 Weight[j] = InitWeight[BandIndex];
239 Grid[j] = TempVar + LowFreqEdge;
242 Grid[j - 1] = UpperFreq;
243 DesiredMag[j - 1] = BandMag[BandIndex];
244 Weight[j - 1] = InitWeight[BandIndex];
247 if (BandIndex <= NumBands)
252 if (!OddNumTaps && Grid[GridIndex] > (0.5 - LowFreqEdge))
256 for (j = 1; j <= GridIndex; j++) {
257 Change = cos(M_PI * Grid[j]);
258 DesiredMag[j] = DesiredMag[j] / Change;
259 Weight[j] = Weight[j] * Change;
263 TempVar =
static_cast<double>(GridIndex - 1) /
static_cast<double>(HalfTapCount);
264 for (j = 1; j <= HalfTapCount; j++) {
265 ExchangeIndex[j] =
static_cast<double>(j - 1) * TempVar + 1.0;
267 ExchangeIndex[HalfTapCount + 1] = GridIndex;
269 NumIterations =
Remez2(GridIndex);
274 for (j = 1; j <= HalfTapCount - 1; j++) {
275 Coeff[j] = 0.5 * Alpha[HalfTapCount + 1 - j];
277 Coeff[HalfTapCount] = Alpha[1];
279 Coeff[1] = 0.25 * Alpha[HalfTapCount];
280 for (j = 2; j <= HalfTapCount - 1; j++) {
281 Coeff[j] = 0.25 * (Alpha[HalfTapCount + 1 - j] + Alpha[HalfTapCount + 2 - j]);
283 Coeff[HalfTapCount] = 0.5 * Alpha[1] + 0.25 * Alpha[2];
287 FirCoeff = RowVectorXd::Zero(TapCount);
288 for (j = 1; j <= HalfTapCount; j++)
291 for (j = 1; j < HalfTapCount; j++)
292 FirCoeff[HalfTapCount + j - 1] = Coeff[HalfTapCount - j];
294 for (j = 1; j <= HalfTapCount; j++)
295 FirCoeff[HalfTapCount + j - 1] = Coeff[HalfTapCount - j + 1];
299 if (NumIterations <= 3) {
315 int j, JET, K, k, NU, JCHNGE, K1, KNZ, KLOW, NUT, KUP;
316 int NUT1 = 0, LUCK, KN, NITER;
317 double Deviation, DNUM, DDEN, TempVar;
318 double DEVL, COMP = 0.0, YNZ = 0.0, Y1, ERR;
326 ExchangeIndex[HalfTapCount + 2] = GridIndex + 1;
328 for (j = 1; j <= HalfTapCount + 1; j++) {
329 TempVar = Grid[ExchangeIndex[j]];
330 CosOfGrid[j] = cos(TempVar *
M_2PI);
333 JET = (HalfTapCount - 1) / 15 + 1;
334 for (j = 1; j <= HalfTapCount + 1; j++) {
341 for (j = 1; j <= HalfTapCount + 1; j++) {
342 k = ExchangeIndex[j];
343 DNUM += LeGrangeD[j] * DesiredMag[k];
344 DDEN +=
static_cast<double>(K) * LeGrangeD[j] / Weight[k];
347 Deviation = DNUM / DDEN;
352 Deviation = -
static_cast<double>(NU) * Deviation;
354 for (j = 1; j <= HalfTapCount + 1; j++) {
355 k = ExchangeIndex[j];
356 TempVar =
static_cast<double>(K) * Deviation / Weight[k];
357 DesPlus[j] = DesiredMag[k] + TempVar;
361 if (Deviation <= DEVL)
366 K1 = ExchangeIndex[1];
367 KNZ = ExchangeIndex[HalfTapCount + 1];
374 while (j < HalfTapCount + 2) {
375 KUP = ExchangeIndex[j + 1];
376 k = ExchangeIndex[j] + 1;
382 if (k < KUP && !
ErrTest(k, NUT, COMP, &ERR)) {
384 COMP =
static_cast<double>(NUT) * ERR;
385 for (k++; k < KUP; k++) {
386 if (
ErrTest(k, NUT, COMP, &ERR))
388 COMP =
static_cast<double>(NUT) * ERR;
391 ExchangeIndex[j] = k - 1;
403 k = ExchangeIndex[j] + 1;
405 ExchangeIndex[j] = k - 1;
412 for (k++; k < KUP; k++) {
413 if (
ErrTest(k, NUT, COMP, &ERR))
418 KLOW = ExchangeIndex[j];
424 if (
ErrTest(k, NUT, COMP, &ERR) && JCHNGE <= 0)
427 if (
ErrTest(k, NUT, COMP, &ERR)) {
428 KLOW = ExchangeIndex[j];
433 COMP =
static_cast<double>(NUT) * ERR;
436 for (k--; k > KLOW; k--) {
437 if (
ErrTest(k, NUT, COMP, &ERR))
439 COMP =
static_cast<double>(NUT) * ERR;
442 KLOW = ExchangeIndex[j];
443 ExchangeIndex[j] = k + 1;
448 if (j == HalfTapCount + 2)
451 while (j <= HalfTapCount + 2) {
452 if (K1 > ExchangeIndex[1])
453 K1 = ExchangeIndex[1];
454 if (KNZ < ExchangeIndex[HalfTapCount + 1])
455 KNZ = ExchangeIndex[HalfTapCount + 1];
460 COMP = YNZ * 1.00001;
463 for (k++; k < KUP; k++) {
464 if (
ErrTest(k, NUT, COMP, &ERR))
466 j = HalfTapCount + 2;
473 if (LUCK == 1 || LUCK == 2) {
477 K1 = ExchangeIndex[HalfTapCount + 2];
485 for (k--; k > KLOW; k--) {
486 if (
ErrTest(k, NUT, COMP, &ERR))
488 j = HalfTapCount + 2;
489 COMP =
static_cast<double>(NUT) * ERR;
495 if (JCHNGE > 0 && NITER++ <
ITRMAX)
501 for (j = 1; j <= HalfTapCount; j++) {
502 ExchangeIndex[HalfTapCount + 2 - j] = ExchangeIndex[HalfTapCount + 1 - j];
504 ExchangeIndex[1] = K1;
509 KN = ExchangeIndex[HalfTapCount + 2];
510 for (j = 1; j <= HalfTapCount; j++) {
511 ExchangeIndex[j] = ExchangeIndex[j + 1];
513 ExchangeIndex[HalfTapCount + 1] = KN;
590 double GTempVar, OneOverNumTaps;
591 double Omega, TempVar, FreqN, TempX, GridCos;
592 double GeeArray[
SMALL];
595 CosOfGrid[HalfTapCount + 2] = -2.0;
596 OneOverNumTaps = 1.0 /
static_cast<double>(2 * HalfTapCount - 1);
599 for (j = 1; j <= HalfTapCount; j++) {
600 FreqN =
static_cast<double>(j - 1) * OneOverNumTaps;
601 TempX = cos(
M_2PI * FreqN);
603 GridCos = CosOfGrid[k];
604 if (TempX <= GridCos) {
605 while (TempX <= GridCos && (GridCos - TempX) >=
MIN_TEST_VAL)
609 GridCos = CosOfGrid[k];
612 if (TempX <= GridCos || (TempX - GridCos) <
MIN_TEST_VAL) {
613 GeeArray[j] = DesPlus[k];
616 GeeArray[j] =
GEE2(1, HalfTapCount + 1);
623 for (j = 1; j <= HalfTapCount; j++) {
625 Omega =
static_cast<double>(j - 1) *
M_2PI * OneOverNumTaps;
626 for (n = 1; n <= HalfTapCount - 1; n++) {
627 TempVar += GeeArray[n + 1] * cos(Omega *
static_cast<double>(n));
629 TempVar = 2.0 * TempVar + GeeArray[1];
633 Alpha[1] = Alpha[1] * OneOverNumTaps;
634 for (j = 2; j <= HalfTapCount; j++) {
635 Alpha[j] = 2.0 * Alpha[j] * OneOverNumTaps;