246 : naturalResponseCoefficients(),
247 forcedResponseCoefficients()
254 std::array<std::complex<double>, 2 * ORDER> bandpass_stop_poles;
257 wl = (2.0 / Ts) * std::tan(wl * (Ts / 2.0));
258 whp = (2.0 / Ts) * std::tan(whp * (Ts / 2.0));
261 std::array<std::complex<double>,
COEFFICIENTS - 1> poles;
262 for (
int k = 0; k < n; ++k)
264 double theta = M_PI * (2.0 * k + 1) / (2.0 * n) + M_PI / 2.0;
265 poles[k] = std::complex<double>(std::cos(theta), std::sin(theta));
268 std::array<std::complex<double>,
COEFFICIENTS - 1> zPoles;
276 for (
int j = 0; j < n; ++j) poles[j] = poles[j] * wl;
285 for (
int j = 0; j < n; ++j)
287 poles[j] = wl / poles[j];
299 throw std::invalid_argument(
"wh must be > wl for BANDPASS");
308 double W0sq = whp * wl;
310 for (
int j = 0; j < ORDER; ++j)
312 std::complex<double>
p = poles[j];
314 std::complex<double> discriminant = (
p * B) * (
p * B) - 4.0 * W0sq;
317 bandpass_stop_poles[2 * j] = (
p * B + root) * 0.5;
318 bandpass_stop_poles[2 * j + 1] = (
p * B - root) * 0.5;
323 zPoles[
i] =
s2z(bandpass_stop_poles[
i], Ts);
333 throw std::invalid_argument(
"wh must be > wl for BANDSTOP");
342 double W0sq = whp * wl;
343 for (
int j = 0; j < n; ++j)
345 std::complex<double>
p = poles[j];
347 std::complex<double> discriminant = B * B - (4.0 * -
p * W0sq);
350 bandpass_stop_poles[2 * j] = (B + root) / (2.0 *
p);
351 bandpass_stop_poles[2 * j + 1] = (B - root) / (2.0 *
p);
356 zPoles[
i] =
s2z(bandpass_stop_poles[
i], Ts);
361 throw std::invalid_argument(
"Unknown filter type");
364 std::array<std::complex<double>,
COEFFICIENTS - 1> zZeros;
370 zZeros.fill(std::complex<double>(-1, 0));
374 zZeros.fill(std::complex<double>(1, 0));
381 (
i % 2 == 0) ? std::complex<double>(1, 0) : std::complex<double>(-1, 0);
392 double omega0 = std::sqrt(wl * whp) * Ts;
394 double realPart = std::cos(omega0);
395 double imagPart = std::sin(omega0);
397 std::complex<double> zeroPlus(realPart, imagPart);
398 std::complex<double> zeroMinus(realPart, -imagPart);
402 zZeros[
i] = zeroPlus;
421 double scale = 1 / mag;
422 for (
auto &coef : b) coef *= scale;
430 double scale = 1 / mag;
431 for (
auto &coef : b) coef *= scale;
440 double scale = 1 / mag;
441 for (
auto &coef : b) coef *= scale;
449 double scale = 1 / mag;
450 for (
auto &coef : b) coef *= scale;