13iirfilter::iirfilter(
double fc,
int tp) {
14 wxASSERT(tp == IIRFILTER_TYPE_DEG || tp == IIRFILTER_TYPE_LINEAR ||
15 tp == IIRFILTER_TYPE_RAD);
21double iirfilter::filter(
double data) {
22 if (!std::isnan(data) && !std::isnan(b1)) {
23 if (std::isnan(accum)) accum = 0.0;
25 case IIRFILTER_TYPE_LINEAR:
26 accum = accum * b1 + a0 * data;
29 case IIRFILTER_TYPE_DEG:
31 accum = accum * b1 + a0 * (oldDeg + 360.0 * wraps);
34 case IIRFILTER_TYPE_RAD:
36 accum = accum * b1 + a0 * (oldRad + 2.0 * M_PI * wraps);
47void iirfilter::reset(
double a) {
54void iirfilter::setFC(
double fc) {
55 if (std::isnan(fc) || fc <= 0.0)
59 b1 = exp(-2.0 * 3.1415926535897932384626433832795 * fc);
64void iirfilter::setType(
int tp) {
65 wxASSERT(tp == IIRFILTER_TYPE_DEG || tp == IIRFILTER_TYPE_LINEAR ||
66 tp == IIRFILTER_TYPE_RAD);
70double iirfilter::getFc(
void) {
71 if (std::isnan(b1))
return 0.0;
72 double fc = log(b1) / (-2.0 * 3.1415926535897932384626433832795);
76int iirfilter::getType(
void) {
return type; }
78double iirfilter::get(
void) {
79 if (std::isnan(accum))
return accum;
82 case IIRFILTER_TYPE_DEG:
83 while (res < 0) res += 360.0;
84 while (res > 360) res -= 360.0;
87 case IIRFILTER_TYPE_RAD:
88 while (res < 0) res += 2.0 * M_PI;
89 while (res > 2.0 * M_PI) res -= 2.0 * M_PI;
95void iirfilter::unwrapDeg(
double deg) {
96 if (deg - oldDeg > 180) {
98 }
else if (deg - oldDeg < -180) {
104void iirfilter::unwrapRad(
double rad) {
105 if (rad - oldRad > M_PI) {
107 }
else if (rad - oldRad < M_PI) {