
Библиотека фильтров бесконечного импульсного отклика (IIR) для Linux, Mac OSX и Windows, которая реализует Butterworth, RBJ, Chebychev Filters и может легко импортировать коэффициенты, генерируемые Python (Scipy).
Фильтр обрабатывает выборку данных по образцу для обработки в реальном времени.
Он использует шаблоны для распределения требуемой памяти, чтобы он мог работать без каких -либо команд Malloc / новых. Память выделяется во время компиляции, так что никогда не существует риска утечек памяти.
Весь код фильтра в реальном времени находится в файлах заголовков, что гарантирует эффективную интеграцию в основную программу, и компилятор может одновременно оптимизировать как код фильтра, так и основную программу.
Добавить следующее включите оператор в ваш код:
#include "Iir.h"
Общий подход кодирования заключается в том, что сначала экземпляры фильтра определяют его порядок, затем параметры устанавливаются с помощью setup функции, а затем он готов использовать для образца путем фильтрации в реальном времени.
Идея состоит в том, чтобы выделить память фильтра во время компиляции с аргументом шаблона, чтобы избежать каких -либо новых команд. Это предотвращает утечки памяти и может быть оптимизировано во время компиляции. order , предоставленный шаблону (например, здесь для фильтра низкого уровня):
Iir::Butterworth::LowPass<order> f;
используется в качестве порядка по умолчанию по команде setup ниже, но может быть переопределен в более низком порядке, если это необходимо.
setupВсе фильтры доступны в виде фильтров LowPass, HighPass, BandPass и Band Stop/Notch. Butterworth/Chebyshev Предлагается также с низким/высоким/полосой с указанным усилением полосы пропускания и усилением 0 дБ в полосе остановки.
Частоты могут быть либо аналоговыми, которые со скоростью отбора проб или нормализованы между 0..1/2, где 1/2 - частота Nyquist. Обратите внимание, что нормализованные частоты являются просто F = F/FS и находятся в единицах 1/образцов. Внутренне библиотека использует нормализованные частоты, а команды настройки просто делятся на скорость отбора проб, если указано. Выберите между:
setup : скорость отбора проб и аналоговые частоты отсеченияsetupN : Нормализованные частоты в 1/образцах между F = 0..1/2, где 1/2 = Nyquist. По умолчанию setup использует заказ, предоставленный аргументом шаблона, но может быть переопределен по приказу о нижних фильтрах.
См. Файлы заголовка в iir или документацию для аргументов команд setup .
Примеры ниже приведены для фильтров низкого уровня:
Butterworth.h стандартный фильтр, подходящий для большинства применений. Монотонный ответ. const int order = 4; // 4th order (=2 biquads)
Iir::Butterworth::LowPass<order> f;
const float samplingrate = 1000; // Hz
const float cutoff_frequency = 5; // Hz
f.setup (samplingrate, cutoff_frequency);
или укажите нормализованную частоту между 0..1/2:
f.setupN(norm_cutoff_frequency);
ChebyshevI.h с допустимой волной полосы пропускания в дБ. Iir::ChebyshevI::LowPass<order> f;
const float passband_ripple_in_db = 5;
f.setup (samplingrate,
cutoff_frequency,
passband_ripple_in_dB);
или укажите нормализованную частоту между 0..1/2:
f.setupN(norm_cutoff_frequency,passband_ripple_in_dB);
ChebyshevII.h с худшим допустимым отказом остановки в дм. Iir::ChebyshevII::LowPass<order> f;
double stopband_ripple_in_dB = 20;
f.setup (samplingrate,
cutoff_frequency,
stopband_ripple_in_dB);
или укажите нормализованную частоту между 0..1/2:
f.setupN(norm_cutoff_frequency,stopband_ripple_in_dB);
RBJ.h 2 -й заказ фильтров с отсечкой и Q -фактором. Iir::RBJ::LowPass f;
const float cutoff_frequency = 100;
const float Q_factor = 5;
f.setup (samplingrate, cutoff_frequency, Q_factor);
или укажите нормализованную частоту между 0..1/2:
f.setupN(norm_cutoff_frequency, Q_factor);
Custom.h ########
# Python
# See "elliptic_design.py" for the complete code.
from scipy import signal
order = 4
sos = signal.ellip(order, 5, 40, 0.2, 'low', output='sos')
print(sos) # copy/paste the coefficients over & replace [] with {}
///////
// C++
// part of "iirdemo.cpp"
const double coeff[][6] = {
{1.665623674062209972e-02,
-3.924801366970616552e-03,
1.665623674062210319e-02,
1.000000000000000000e+00,
-1.715403014004022175e+00,
8.100474793174089472e-01},
{1.000000000000000000e+00,
-1.369778997100624895e+00,
1.000000000000000222e+00,
1.000000000000000000e+00,
-1.605878925999785656e+00,
9.538657786383895054e-01}
};
const int nSOS = sizeof(coeff) / sizeof(coeff[0]); // here: nSOS = 2 = order / 2
Iir::Custom::SOSCascade<nSOS> cust(coeff);
Образцы обрабатываются один за другим. В примере ниже образец x обрабатывается с помощью команды filter , а затем сохраняется в y Типы x и y могут быть либо плавают, либо вдвое больше (целое число также разрешено, но все еще обрабатывается внутри плавающей запятой):
y = f.filter(x);
Затем это повторяется для каждого входящего образца в петле или обработке событий.
Неверные значения, предоставленные на setup() будут выдвинуть исключение. Параметры, предоставленные для setup() , которые приводят к тому, что коэффициенты являются NAN, также выставит исключение.
Вы можете отключить обработку эксплуатации, определив IIR1_NO_EXCEPTIONS через CMAKE или в вашей программе.
Если вы используете Cmake в качестве системы сборки, просто добавьте в свой CMakeLists.txt следующие строки для динамической библиотеки:
find_package(iir)
target_link_libraries(... iir::iir)
или для статического:
find_package(iir)
target_link_libraries(... iir::iir_static)
Свяжите его с динамической библиотекой (Unix/Mac: -liir , Windows: iir.lib ) или статическую библиотеку (Unix/Mac: libiir_static.a , windows: libiir_static.lib ).
Если вы используете Ubuntu LTS, вы можете установить эту библиотеку в качестве предварительно скомпилированного пакета.
Добавьте этот репозиторий в свою систему:
sudo add-apt-repository ppa:berndporr/dsp
Затем установите пакеты:
sudo apt install iir1sudo apt install iir1-devОн доступен для 64 -битной Intel и 32,64 -битной руки (Raspberry Pi и т. Д.). Документация пакета разработки и пример программ находится в:
/usr/share/doc/iir1-dev/
Инструмент сборки- это cmake , который генерирует файлы Make- или Project для различных платформ. cmake доступен для Linux, Windows и Mac. Он также компилируется непосредственно на Raspberry Pi.
Бегать
cmake .
который генерирует makefile. Затем беги:
make
sudo make install
который устанавливает его под /usr/local/lib и /usr/local/include .
И GCC, и Clang были проверены.
cmake -G "Visual Studio 16 2019" -A x64 .
См. cmake для различных строительных норм. Выше предназначен для 64 -битной сборки. Затем запустите Visual C ++ и откройте решение. Это создаст DLL и файлы LIB. Под Windows настоятельно рекомендуется использовать статическую библиотеку и связать ее с прикладной программой.
Запустите модульные тесты, набрав make test или просто ctest . Они испытывают, если после дельта -импульса все фильтры расслабляются до нуля, что их выходы никогда не становятся NAN, и если фильтры прямой формы I & II вычисляют ожидаемые последовательности, сравнивая их из результатов, созданных выходом sosfilt Scipy.
Вы можете отключить генерацию тестов, установив IIR1_BUILD_TESTING OFF.
Самый простой способ учиться - из примеров, которые находятся в demo каталоге. Дельта -импульс как тестовый сигнал отправляется в различные фильтры и сохраняется в файле. С помощью Python Script plot_impulse_fresponse.py вы можете построить частотные ответы.
Вы можете отключить сборник демонстраций, установив IIR1_BUILD_DEMO для выключения.
Также в каталоге, содержащем модульные тесты примеры для каждого типа фильтра.
PDF всех классов, методов и, в частности, функций setup находится в каталоге docs/pdf .
Онлайн -документация здесь: http://berndporr.github.io/iir1
Эти ответы были сгенерированы iirdemo.cpp в каталоге /demo/ , а затем построены с помощью plot_impulse_fresponse.py .







Эта библиотека была дополнительно разработана на основе отличной оригинальной работы Винни Фалько, которую можно найти здесь:
https://github.com/vinniefalco/dspfilters
В то время как оригинальная библиотека обрабатывает звуковые массивы, эта библиотека была адаптирована для быстрого обработки обработки в реальном времени по образцу. Команда setup не требует порядка фильтра и вместо этого помнит его из аргумента шаблона. Структура класса была упрощена, и все функции документированы для доксигена. Вместо того, чтобы иметь утверждения Assert (), что эти ливитные бросают исключения в случае, если параметр неверен. Любая конструкция фильтра, требующая оптимизации (например, эллипские фильтры), была удалена, и вместо этого была добавлена функция, которая может импортировать легко коэффициенты из Scipy.
Bernd Porr - http://www.berndporr.me.uk