Реализация фильтра БИХ довольно проста и проста на любом языке. дизайн БИХ - это сложная и интересная часть. Есть много компромиссов, которые могут быть сделаны. Фильтры Biquad IIR являются довольно хорошими фильтрами второго порядка (которые могут быть настроены с коэффициентами Баттерворта), и для многих приложений этого будет достаточно, однако вы также можете каскадировать их, чтобы создавать фильтры еще более высокого порядка, если вы нужно до.
Первым делом нужно выяснить, что вам действительно нужно, что обычно означает, что вам нужно понять, как шум, который вы хотите фильтровать, выглядит в частотной области, а затем разработать фильтр, который подавляет шум.
Существует множество инструментов, которые позволят вам увидеть, как будет выглядеть частотная характеристика данного набора коэффициентов БИХ.
Вот один из множества из быстрого поиска в Google.
Ключевым параметром является частота выборки источника ваших данных (частота выборки)
Как только вы получите коэффициент, реализация будет очень простой, это просто функция текущей входной выборки и количества предыдущих входов и выходов.
Вы можете найти некоторые детали здесь , но здесь есть функция.
y[n] = b0* x[n] + b1 * x[n-1] + b2 * x[n-2] - a1 * y[n-1] - a2 * y[n-2]
где x [n] - текущая выборка, x [n-1] - предыдущая выборка и т. Д., А y [n] - текущая выходная стоимость, а y [n-1], y [n- 2] являются предыдущими выходами.
Если вы действительно хотите углубиться в детали конструкции фильтра, одним из лучших ресурсов, которые я нашел, является использование SciPy , опять же, есть много уроков о том, как это сделать.
Я не смотрел его, но вот видео на YouTube , описывающее, как создать фильтр Баттерворта в Python.
И, как я сказал ранее, когда у вас есть коэффициенты, реализация на любом языке довольно проста. Например, вот очень простой Biquad, который я сделал на c ++ для фильтрации данных в проекте Arduino. Это может быть легко преобразовано в быстрый или любой другой язык.
class BiQuad {
public:
BiQuad(double b0, double b1, double b2, double a1, double a2)
: b0_(b0), b1_(b1), b2_(b2), a1_(a1), a2_(a2) {}
double processSample(double xn) {
xn_ = xn;
yn_ = b0_ * xn_ + b1_ * xnm1_ + b2_ * xnm2_ - a1_ * ynm1_ - a2_ * ynm2_;
ynm2_ = ynm1_;
ynm1_ = yn_;
xnm2_ = xnm1_;
xnm1_ = xn_;
return yn_;
}
double getCurrentY() { return yn_; }
void prime(double value) {
xn_ = xnm1_ = xnm2_ = yn_ = ynm1_ = ynm2_ = value;
}
private:
double b0_;
double b1_;
double b2_;
double a1_;
double a2_;
double xn_;
double xnm1_ = 0.0;
double xnm2_ = 0.0;
double yn_ = 0.0;
double ynm1_ = 0.0;
double ynm2_ = 0.0;
};
Надеюсь, это поможет.