«Фильтр нижних частот» в не-EE, программных контекстах API

12

Я опытный инженер-программист и работаю над датчиками для смартфонов. Я прошел базовые занятия по ЭЭ в DSP и пытаюсь применить свои знания. Я считаю, что понимаю свертку, передаточные функции, z-преобразование и т. Д. Я немного знаю о фильтрах FIR и IIR.

Теперь, читая программные API-интерфейсы и документацию, я вижу, что люди применяют ФНЧ для данных датчика во временной области. Я знаю, что вы делаете это с помощью разностных уравнений (например, y [i] = y [i-1] + 2 * x [i]), но я узнал в своем классе EE, что LPF обычно применяются посредством операции свертки где вы сворачиваете сигнал времени с коэффициентами синусоидальной волны (например) и с определенной частотой среза. Так что разговорное использование «фильтра нижних частот» для меня недостаточно точно.

Например, Google Android API имеет следующую документацию: http://developer.android.com/reference/android/hardware/SensorEvent.html#values

 public void onSensorChanged(SensorEvent event)
 {
      // alpha is calculated as t / (t + dT)
      // with t, the low-pass filter's time-constant
      // and dT, the event delivery rate

      final float alpha = 0.8;

      gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
      gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
      gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];

      linear_acceleration[0] = event.values[0] - gravity[0];
      linear_acceleration[1] = event.values[1] - gravity[1];
      linear_acceleration[2] = event.values[2] - gravity[2];
 }

Как мне интерпретировать этот фильтр нижних частот? Какова частота среза? Какова пропускная способность перехода? Они используют этот LPF исключительно для усреднения?

stackoverflowuser2010
источник
хорошо, что меня это тоже беспокоит
Sibbs Gambling

Ответы:

11

Фильтр в вашем примере - это фильтр с бесконечной импульсной характеристикой (IIR) первого порядка . Его передаточная функция:

H(z)=1α1αz1

что соответствует разностному уравнению:

y[n]=αy[n1]+(1α)x[n]

где - вход фильтра, а - выход фильтра.x[n]y[n]

Этот тип фильтра часто используется как низкочастотный фильтр низкой сложности и часто называется неплотным интегратором . Его предпочитают из-за его простой реализации, низкой вычислительной сложности и его настраиваемости: его частота среза зависит от значения . может принимать значения на интервале . дает никакой фильтрации вообще (выход равен входу); при увеличении частота среза фильтра уменьшается. Вы можете думать о как о граничном случае, когда частота среза бесконечно мала (выход фильтра равен нулю за все время).αα[0,1)α=0αα=1

Вы можете думать об этом интуитивно, заметив, что вход фильтра взвешен на , так что при увеличении параметра величина уменьшается, поэтому каждая входная выборка оказывает меньшее пропорциональное влияние на значение любой конкретной выходной выборки. Это приводит к размытию импульсной характеристики фильтра в течение более длительного периода времени. Суммирование за более длительный период времени аналогично вычислению длинного скользящего среднего. По мере увеличения длины скользящего среднего частота отсечки среднего уменьшается.α1α

Для вашего примера, где , частотная характеристика фильтра выглядит следующим образом: α=0.8введите описание изображения здесь

Из этого примера я бы предположил, что этот фильтр используется для сглаживания высокочастотного шума во временных рядах измерений от датчика, пытаясь выявить сравнительно низкочастотный интересующий сигнал. Это было бы очень типичным приложением для такого рода фильтров.

По другому вашему подвопросу вы правы, что фильтрация часто осуществляется посредством свертки входного сигнала с импульсной характеристикой фильтра. В большинстве случаев это делается только с помощью фильтров с конечной импульсной характеристикой (FIR) . БИХ-фильтры, подобные этому, обычно реализуются с использованием разностного уравнения фильтра; поскольку импульсный отклик системы БИХ бесконечно длинный, вы должны укоротить его до некоторой конечной длины, чтобы свертывание стало возможным, и в этот момент фильтр больше не является БИХ. Формат уравнения разности почти всегда дешевле реализовать в вычислительном отношении, хотя обратная связь, присущая этой структуре, может привести к численным проблемам, которые необходимо решить (например, внутреннее переполнение и накопление ошибок округления).

Джейсон Р
источник
Благодарность! Некоторые дополнительные вопросы: (1) Вы сказали, что ваше уравнение H (z) = ... является разностным уравнением; это действительно передаточная функция, верно? Я думал, что разностное уравнение строго для временной области. (2) В вашем неплотном интеграторе соответствует 1.0 как sampling_frequency / 2 (как в Matlab)? (3) Что касается КИХ против БИХ, верно ли мое понимание того, что разностное уравнение БИХ можно применять в O (N), но свертка - это O (N ^ 2) или O (N lgN) со сверткой на основе БПФ? (4) Можете ли вы порекомендовать книгу для программистов, чтобы реализовать эти идеи DSP? Как то, что делает пример кода Android.
stackoverflowuser2010
(1) Ты прав, я опечатка. Я исправлю ответ. (2) да; ось X находится в нормированной частоте, деленной на , поэтому 1 соответствует , что составляет половину частоты дискретизации. (3) Вычисление выходных данных для конкретной выборки с использованием любого из методов - это , где - порядок фильтра. IIR фильтры просто , как правило , имеют гораздо меньший . (4) Я бы порекомендовал « Понимание DSP» от Lyons; это отличная вводная книга. + π O ( N ) N Nπ+πO(N)NN
Джейсон Р
Я знаю, что (i) применение разностного уравнения - это O (N). Но я думал, что (ii) операция свертки с использованием суммирования по умножению и сложению (songho.ca/dsp/convolution/convolution.html) - это O (N ^ 2) или O (N lgN) с реализацией на основе FFT , Во всех случаях N является порядком фильтра - где я предполагаю, что порядок фильтра и длина сигнала времени имеют одинаковый порядок величины (например, оба 256). Так не отличаются ли (i) и (ii)? Кроме того, я видел эту книгу о Лионе на Amazon.com, но я надеялся, что она будет написана для программистов на C / Java.
stackoverflowuser2010
1
Сложность вычисления однократной временной выборки составляет с разностным уравнением. Если длина входного сигнала также составляет , то общая сложность вычисления выходов для каждой входной выборки становится . Чаще всего для фильтра БИХ длина входного сигнала намного больше, чем поскольку порядок фильтра мал, поэтому сложность можно записать в . Если значительно меньше, чем , вы можете получить некоторую вычислительную выгоду. N O ( N 2 ) M N O ( M N ) M NO(N) NO(N2)MNO(MN)MN
Джейсон Р
Извините, что победил мертвую лошадь. Для уравнения общей разности ( ccrma.stanford.edu/~jos/fp/Difference_Equation_I.html ) действительно сложность не будет , где N - длина входного и выходного сигналов а М это порядок фильтра? Циклы по каждому выходу y [i], , равны O (N), и для каждого y [i] требуется O (N + M) циклов. Я думаю, как вы сказали, в зависимости от относительных размеров N и M, результат будет либо либо . i N O ( N 2 ) O ( N M )O(M×(N+M))iNO(N2)O(NM)
stackoverflowuser2010
2

Подводя итог, можно сказать, что БИХ-фильтры, основанные на простых идеализированных физических моделях, таких как RC-фильтр, имеют небольшое число полюсов и нулей и, таким образом, обычно реализуются как разностное уравнение, поскольку небольшое количество полюсов или нулей подразумевает очень мало арифметических операций. за образец с использованием разностного уравнения.

Поскольку БИХ подразумевает импульсную характеристику бесконечной длины, для свертки потребуется либо вычисление навсегда, либо использование приближения.

КИХ-фильтры обычно реализуются путем свертки с импульсной характеристикой конечной длины (или путем быстрой свертки БПФ, если фильтр достаточно длинный для того, чтобы это было вычислительно эффективным). Эти типы фильтров чаще используются, когда можно приблизить желаемую характеристику частотной характеристики с импульсной характеристикой конечной длины, вместо того, чтобы знать, где могут находиться полюсы и нули Z-плоскости.

Однако, поскольку фильтр с четкой спецификацией подразумевает длительную свертку КИХ, реализация фильтров КИХ может быть намного медленнее, и настройка может включать гораздо больше строк кода, что может быть причиной того, что фильтры КИХ могут использоваться не так часто в простом программном обеспечении. Примеры.

hotpaw2
источник
0

Я снова и снова возвращаюсь к этому посту. Спасибо, что задали вопрос. Вот отличная, дружественная к вычислениям реализация интегратора с утечками в C (предназначенного для микроконтроллера).

Во-первых, некоторая перестановка: y = α * x + (1 - α) * y_last = α * (x - y_last) + y_last

если мы ограничим α до 12%, 25%, 50% (1/8, 1/4, 1/2, ...). Мы можем воспользоваться некоторым эффективным сдвигом битов. Принимая случай 1/8, 8 => 2 ^ 3 => (пониженная передача 3 раза)

= (x - y_last) / 8 + y_last

#define SMOOTHING_FACTOR       (3)

int16_t FilterSample(int16_t new_sample)
{
  static int16_t last_result = 0;

  // Each bit shift down is equivalent to dividing-by-two
  last_result = (new_sample - last_result) >> SMOOTHING_FACTOR) + last_result;

  return last_result;
}

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

tarabyte
источник