Библиотека DSP реального времени для Arduino Печать
Добавил(а) microsin   

В библиотеке Filters реализованы цифровые фильтры, которые пытаются работать так же, как и обычные аналоговые фильтры. Вот классы фильтров, которые есть в библиотеке:

FiltersOnePole реализует цифровой RC-фильтр, как ФНЧ так и ФВЧ.
FiltersTwoPole реализует ФНЧ RLC-фильтр. Поскольку фильтр RLC это по сути демпфированный гармонический генератор, класс FiltersTwoPole можно использовать для реализации генераторов как таковых, если установить множитель качества (quality factor) и резонансную частоту (resonant frequency) в нужные значения.

В дополнение библиотека Filters реализует класс для отслеживания изменяющейся статистики в реальном масштабе времени.

RunningStatistics отслеживает статистику времени по указанному окну времени (так называемое "running window"), вплоть до текущего времени. Класс вычисляет изменение и среднее значение, а также производные значения, такие как стандартная девиация (sigma) и коэффициент изменения.

[Установка библиотеки Filters]

Распакуйте код библиотеки, и поместите его в директорию Arduino/libraries. Если среда разработки Arduino уже запущена, то потребуется её перезапуск, чтобы библиотека была успешно зарегистрирована. Все классы фильтров добавляются в программу добавлением в код директивы подключения заголовочного файла:

#include < Filters.h >

Код библиотеки можно загрузить из репозитория GitHub [2].

[Как использовать библиотеку Filters]

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

Фильтры обновляются постоянными вызовами функции input(newValue) фильтра, и передачей ей нового значения. См. пример ниже, а также примеры кода в библиотеке.

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

// Будут отфильтровываться изменения сигнала, происходящие чаще 5 Гц:
float filterFrequency = 5.0
 
// Создание ФНЧ 1 порядка (RC):
FilterOnePole lowpassFilter( LOWPASS, filterFrequency );
 
while( true )
{
  lowpassFilter.input( analogRead( INPUT_PIN ) );
  // Здесь можно добавить другие действия.
}

[Замечания по реализации]

Фильтры реализованы как IIR (infinite impulse response, фильтр с бесконечной импульсной характеристикой, так называемый БИХ-фильтр), который позволяет работать с сигналом в реальном времени. В стандартной реализации IIR-фильтра шаг времени между выборками постоянен, и известен в начале вычислений.

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

Все фильтры остаются стабильными, даже если input() не вызывается достаточно часто. В случае фильтров 1 порядка (типа RC), значение фильтра будет просто затухать к конечному значению. Фильтр второго порядка использует симуляцию с шагом по времени демпфированного гармонического генератора. Обычно этот тип симуляции может стать нестабильным, если input() вызывается недостаточно часто. Код предотвращает это путем установки максимально допустимого шага времени (примерно шестая часть от периода резонансной частоты генератора). Если input() вызывается реже, чем этот шаг, то шаг времени снижается до этого значения, и генератор остается стабильным.

Классы фильтра реализованы с использованием 32-разрядных чисел с плавающей точкой (float).

[Ссылки]

1. A realtime digital signal processing (DSP) library for Arduino site:playground.arduino.cc.
2. JonHub/Filters Arduino site:github.com.
3. Обработка звука в реальном времени с помощью Arduino.
4. AVR335: цифровой рекордер звука на AVR и DataFlash.