104 if ((PassType ==
HPF || PassType ==
NOTCH) && NumTaps % 2 == 0)
109 if (PassType ==
LPF) {
117 Edge[3] = Edge[2] + ParksWidth;
125 InitWeight[2] = 10.0;
128 if (PassType ==
HPF) {
136 Edge[2] = Edge[3] - ParksWidth;
143 InitWeight[1] = 10.0;
147 if (PassType ==
BPF) {
150 Edge[3] = OmegaC - BW / 2.0;
153 Edge[2] = Edge[3] - ParksWidth;
156 Edge[4] = OmegaC + BW / 2.0;
159 Edge[5] = Edge[4] + ParksWidth;
167 InitWeight[1] = 10.0;
169 InitWeight[3] = 10.0;
172 if (PassType ==
NOTCH) {
175 Edge[3] = OmegaC - BW / 2.0;
178 Edge[2] = Edge[3] - ParksWidth;
181 Edge[4] = OmegaC + BW / 2.0;
184 Edge[5] = Edge[4] + ParksWidth;
193 InitWeight[2] = 10.0;
198 for (j = 1; j <= 2 * NumBands; j++)
208 int j, k, GridCount, GridIndex, BandIndex, NumIterations;
209 double LowFreqEdge, UpperFreq, TempVar, Change;
218 HalfTapCount = TapCount / 2;
223 LowFreqEdge = GridCount * HalfTapCount;
224 LowFreqEdge = 0.5 / LowFreqEdge;
228 while (BandIndex <= NumBands) {
229 UpperFreq = Edge[k + 1];
230 while (Grid[j] <= UpperFreq) {
232 DesiredMag[j] = BandMag[BandIndex];
233 Weight[j] = InitWeight[BandIndex];
236 Grid[j] = TempVar + LowFreqEdge;
239 Grid[j - 1] = UpperFreq;
240 DesiredMag[j - 1] = BandMag[BandIndex];
241 Weight[j - 1] = InitWeight[BandIndex];
244 if (BandIndex <= NumBands)
249 if (!OddNumTaps && Grid[GridIndex] > (0.5 - LowFreqEdge))
253 for (j = 1; j <= GridIndex; j++) {
254 Change = cos(
M_PI * Grid[j]);
255 DesiredMag[j] = DesiredMag[j] / Change;
256 Weight[j] = Weight[j] * Change;
260 TempVar = (double)(GridIndex - 1) / (double)HalfTapCount;
261 for (j = 1; j <= HalfTapCount; j++) {
262 ExchangeIndex[j] = (double)(j - 1) * TempVar + 1.0;
264 ExchangeIndex[HalfTapCount + 1] = GridIndex;
266 NumIterations =
Remez2(GridIndex);
271 for (j = 1; j <= HalfTapCount - 1; j++) {
272 Coeff[j] = 0.5 * Alpha[HalfTapCount + 1 - j];
274 Coeff[HalfTapCount] = Alpha[1];
276 Coeff[1] = 0.25 * Alpha[HalfTapCount];
277 for (j = 2; j <= HalfTapCount - 1; j++) {
278 Coeff[j] = 0.25 * (Alpha[HalfTapCount + 1 - j] + Alpha[HalfTapCount + 2 - j]);
280 Coeff[HalfTapCount] = 0.5 * Alpha[1] + 0.25 * Alpha[2];
284 for (j = 1; j <= HalfTapCount; j++)
287 for (j = 1; j < HalfTapCount; j++)
288 FirCoeff[HalfTapCount + j - 1] = Coeff[HalfTapCount - j];
290 for (j = 1; j <= HalfTapCount; j++)
291 FirCoeff[HalfTapCount + j - 1] = Coeff[HalfTapCount - j + 1];
293 FirCoeff.conservativeResize(TapCount);
297 if (NumIterations <= 3) {
313 int j, JET, K, k, NU, JCHNGE, K1, KNZ, KLOW, NUT, KUP;
314 int NUT1 = 0, LUCK, KN, NITER;
315 double Deviation, DNUM, DDEN, TempVar;
316 double DEVL, COMP = 0.0, YNZ = 0.0, Y1, ERR;
324 ExchangeIndex[HalfTapCount + 2] = GridIndex + 1;
326 for (j = 1; j <= HalfTapCount + 1; j++) {
327 TempVar = Grid[ExchangeIndex[j]];
328 CosOfGrid[j] = cos(TempVar *
M_2PI);
331 JET = (HalfTapCount - 1) / 15 + 1;
332 for (j = 1; j <= HalfTapCount + 1; j++) {
339 for (j = 1; j <= HalfTapCount + 1; j++) {
340 k = ExchangeIndex[j];
341 DNUM += LeGrangeD[j] * DesiredMag[k];
342 DDEN += (double)K * LeGrangeD[j] / Weight[k];
345 Deviation = DNUM / DDEN;
350 Deviation = -(double)NU * Deviation;
352 for (j = 1; j <= HalfTapCount + 1; j++) {
353 k = ExchangeIndex[j];
354 TempVar = (double)K * Deviation / Weight[k];
355 DesPlus[j] = DesiredMag[k] + TempVar;
359 if (Deviation <= DEVL)
364 K1 = ExchangeIndex[1];
365 KNZ = ExchangeIndex[HalfTapCount + 1];
372 while (j < HalfTapCount + 2) {
373 KUP = ExchangeIndex[j + 1];
374 k = ExchangeIndex[j] + 1;
380 if (k < KUP && !
ErrTest(k, NUT, COMP, &ERR)) {
382 COMP = (double)NUT * ERR;
383 for (k++; k < KUP; k++) {
384 if (
ErrTest(k, NUT, COMP, &ERR))
386 COMP = (double)NUT * ERR;
389 ExchangeIndex[j] = k - 1;
401 k = ExchangeIndex[j] + 1;
403 ExchangeIndex[j] = k - 1;
410 for (k++; k < KUP; k++) {
411 if (
ErrTest(k, NUT, COMP, &ERR))
416 KLOW = ExchangeIndex[j];
422 if (
ErrTest(k, NUT, COMP, &ERR) && JCHNGE <= 0)
425 if (
ErrTest(k, NUT, COMP, &ERR)) {
426 KLOW = ExchangeIndex[j];
431 COMP = (double)NUT * ERR;
434 for (k--; k > KLOW; k--) {
435 if (
ErrTest(k, NUT, COMP, &ERR))
437 COMP = (double)NUT * ERR;
440 KLOW = ExchangeIndex[j];
441 ExchangeIndex[j] = k + 1;
446 if (j == HalfTapCount + 2)
449 while (j <= HalfTapCount + 2) {
450 if (K1 > ExchangeIndex[1])
451 K1 = ExchangeIndex[1];
452 if (KNZ < ExchangeIndex[HalfTapCount + 1])
453 KNZ = ExchangeIndex[HalfTapCount + 1];
458 COMP = YNZ * 1.00001;
461 for (k++; k < KUP; k++) {
462 if (
ErrTest(k, NUT, COMP, &ERR))
464 j = HalfTapCount + 2;
471 if (LUCK == 1 || LUCK == 2) {
475 K1 = ExchangeIndex[HalfTapCount + 2];
483 for (k--; k > KLOW; k--) {
484 if (
ErrTest(k, NUT, COMP, &ERR))
486 j = HalfTapCount + 2;
487 COMP = (double)NUT * ERR;
493 if (JCHNGE > 0 && NITER++ <
ITRMAX)
499 for (j = 1; j <= HalfTapCount; j++) {
500 ExchangeIndex[HalfTapCount + 2 - j] = ExchangeIndex[HalfTapCount + 1 - j];
502 ExchangeIndex[1] = K1;
507 KN = ExchangeIndex[HalfTapCount + 2];
508 for (j = 1; j <= HalfTapCount; j++) {
509 ExchangeIndex[j] = ExchangeIndex[j + 1];
511 ExchangeIndex[HalfTapCount + 1] = KN;
588 double GTempVar, OneOverNumTaps;
589 double Omega, TempVar, FreqN, TempX, GridCos;
590 double GeeArray[
SMALL];
593 CosOfGrid[HalfTapCount + 2] = -2.0;
594 OneOverNumTaps = 1.0 / (double)(2 * HalfTapCount - 1);
597 for (j = 1; j <= HalfTapCount; j++) {
598 FreqN = (double)(j - 1) * OneOverNumTaps;
599 TempX = cos(
M_2PI * FreqN);
601 GridCos = CosOfGrid[k];
602 if (TempX <= GridCos) {
603 while (TempX <= GridCos && (GridCos - TempX) >=
MIN_TEST_VAL)
607 GridCos = CosOfGrid[k];
610 if (TempX <= GridCos || (TempX - GridCos) <
MIN_TEST_VAL) {
611 GeeArray[j] = DesPlus[k];
614 GeeArray[j] =
GEE2(1, HalfTapCount + 1);
621 for (j = 1; j <= HalfTapCount; j++) {
623 Omega = (double)(j - 1) *
M_2PI * OneOverNumTaps;
624 for (n = 1; n <= HalfTapCount - 1; n++) {
625 TempVar += GeeArray[n + 1] * cos(Omega * (
double)n);
627 TempVar = 2.0 * TempVar + GeeArray[1];
631 Alpha[1] = Alpha[1] * OneOverNumTaps;
632 for (j = 2; j <= HalfTapCount; j++) {
633 Alpha[j] = 2.0 * Alpha[j] * OneOverNumTaps;