
Комментарии 21
Какой же это фильтр "Нижних Частот" - это квантование. Вы АЧХ постройте и сразу будет всё ясно.
Как-то всё сложно у вас получилось. Триггер, конечно, обладает памятью, но состояний схемы ведь всего два: в любой момент времени точка на фазовой диаграмме движется либо по красной ветке гистерезиса, либо по синей. Не важно, сколько там порогов.
Надо чтобы проходил вот такой модульный тест
bool test_hist_filter_proc2(void){
bool res = true;
ASSERT_EQ(0, hist_filter_proc_sample(TEST_HIST_FILTER, 1.0f));
ASSERT_EQ(1, hist_filter_proc_sample(TEST_HIST_FILTER, 20.0f));
ASSERT_EQ(1, hist_filter_proc_sample(TEST_HIST_FILTER, 12.0f));
ASSERT_EQ(3, hist_filter_proc_sample(TEST_HIST_FILTER, 87.0f));
return res;
}
А для этого два триггера должны быть в разных состояниях (TG0=1 TG3=0).
Вариантов выходных состояний, да, побольше, целых 5. Я про количество внутренних состояний, которые нужно помнить. Их явно не 16.
И у вас сделана наивная реализация, имитирующая реальное железо. В железе, да, так удобнее, наверное, потому что оно работает параллельно. Но софт в мк так не умеет, и эффективнее сделать один конечный автомат, а не 4 независимых. И сравнение с порогами сделать оптимальнее. Тем более, что взялись за LUT, и аналоговые пороги не какие попало.
Иначе вот это:
Можно и дальше наращивать квантование добавляя количество отдельных триггеров Шмитта.
приведёт к ужасно медленному коду.
если ему завести ОС и двигать порог у получившегося компаратора, то кажется получится дельта-сигма.... надо собрать как-нибудь на рассыпухе, а то никогда не понимал как оно работает...
Почти с языка сняли) Буквально недавно искал, к чему лишний ОУ в схеме приложить. Попытался индикацию заряда на мигающем светодиоде сделать.
Типа того

Что это за программа в которой Вы схему смоделировали?
Qucs-Spice при поддержке нашего товарища @vv_kuznetsov
Вариантов выходных состояний 5. количество внутренних состояний, которые нужно помнить. Их явно не 16.
И у вас сделана наивная реализация, имитирующая реальное железо. В железе, да, так удобнее, наверное, потому что оно работает параллельно. Но софт в мк так не умеет, и эффективнее сделать один конечный автомат, а не 4 независимых. И сравнение с порогами сделать оптимальнее. Тем более, что взялись за LUT, и аналоговые пороги не какие попало.
Да. В самом деле. Можно переписать в виде автомата Мура.

Если бы не ваше замечание, то я бы до такого не додумался.
Я тоже попробовал ради интереса, и точно такой же LUT получил. Большой, да, но зато регулярный. Значит при большом числе порогов его проще описать формулой, например
state = input / 2 + (input & (state > (input / 2)))
Если и пороги тоже регулярны, то остаётся найти формулу для перевода аналогового сигнала в input.
У нас про это в лекциях было.
Год 90й? ))) только там без микроконтроллера :D
Хех, так скоро до применения мажоритарных элементов дойдём ... и цифровых фильтров)))
Ой, не фильтр это... не фильтр. При шуме выше гистерезиса - на выход будут проходить куски шума. В отличие от фильтров, которые сделают шуму положенные "минус N dB" вне зависимости от текущего значения сигнала.
В фотошопе похожая обработка тоже называется "фильтром", не вижу ничего странного. Нелинейный, не ФНЧ, конечно, но что-то связанное с квантованием.
Если сигнал оцифрован и на нём шум - проще всего сделать усредняющий фильтр. Например, скользящее окно шириной в 3 или 5 точек с записью в среднюю точку среднего значения
То что вы предлагаете это Медианный фильтр https://habr.com/ru/articles/935750/
С поправкой: медианный фильтр отсекает одиночные выбросы, а непрерывные колебания, как на рисунке, не отфильтровывает. Поэтому нужно вычисление среднеарифметического значения
Шум бывает и низкочастотным, а вовсе не в виде наивной бахромы на графике. Если б автор не поленился привести пример задачи, где гистерезисная обработка применяется, было бы понятней.
А это обычная обработка аналоговых датчиков положения, абсолютных энкодеров. Ну и в цифровой индикации тоже полезно.
Я вот MIDI- контроллером пользуюсь - там то же самое, напряжение с обычных потенциометров квантуется в 128 уровней. Фильтруют, чтобы без движения цифру не колбасило между двумя соседними значениями, и интерфейс не засорялся.
Очень интересная концепция. Встречали такой фильтр, реализованный в железе/аналоговой схеме? Если его совместить с flash adc, то должен получиться быстрый и помехоустойчивый захват, не требующий устройства выборки/хранения.
Фильтр на Триггерах Шмитта