Быстрое внедрение БИХ-фильтра в диапазоне 0,667 и 3,833 Гц - PullRequest
0 голосов
/ 07 мая 2018

Мне нужно отключить частоты вне диапазона 0,667 - 3,833 Гц (диапазон ЧСС: от 40 до 230 ударов в минуту). Я посмотрел документацию Apple, но вижу только фильтр AVFoundation Butterworth. Очевидно, что «допустимый диапазон значений составляет от 20 Гц до (SampleRate / 2)». Фильтр взят из AVAudioUnitEQ, так что это понятно ... Я не могу найти никаких фильтров, которые работают в диапазоне частот, с которым я работаю.

Должен ли я реализовать свой собственный фильтр Баттерворта или мне чего-то не хватает?

РЕДАКТИРОВАТЬ: Итак, я немного углубился в документацию и нашел БИХ-фильтр и КИХ-фильтр , но это не совсем то, что я ожидал ... БИХ Фильтр - это «каскадный биквадраторный БИХ-фильтр», а не фильтр Баттерворта (что я бы предпочел). Я прочитал небольшое чтение , и я понятия не имею, как этот фильтр должен работать. Могу ли я добиться такой же функции, как фильтр Баттерворта, если поиграюсь с коэффициентами? Если да, то как мне это сделать? Цель состоит в том, чтобы иметь плоскую полосу пропускания без ряби.

Сообщение в блоге, за которым я свободно следую: http://www.ignaciomellado.es/blog/Measuring-heart-rate-with-a-smartphone-camera

Сообщение в блоге с некоторыми советами по биквадорным фильтрам: http://www.ignaciomellado.es/blog/Measuring-heart-rate-with-a-smartphone-camera

1 Ответ

0 голосов
/ 07 мая 2018

Реализация фильтра БИХ довольно проста и проста на любом языке. дизайн БИХ - это сложная и интересная часть. Есть много компромиссов, которые могут быть сделаны. Фильтры 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;
};

Надеюсь, это поможет.

...