Обновить

Комментарии 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, и аналоговые пороги не какие попало.


Да. В самом деле. Можно переписать в виде автомата Мура.

https://docs.google.com/spreadsheets/d/1dAsB0f5b-lm0g4HAjEvebUA9jxHLjEZ7dJht3QiOLoY/edit?gid=636705967#gid=636705967

Если бы не ваше замечание, то я бы до такого не додумался.

Я тоже попробовал ради интереса, и точно такой же LUT получил. Большой, да, но зато регулярный. Значит при большом числе порогов его проще описать формулой, например

state = input / 2 + (input & (state > (input / 2)))

Если и пороги тоже регулярны, то остаётся найти формулу для перевода аналогового сигнала в input.

У нас про это в лекциях было.

Год 90й? ))) только там без микроконтроллера :D

Хех, так скоро до применения мажоритарных элементов дойдём ... и цифровых фильтров)))

Ой, не фильтр это... не фильтр. При шуме выше гистерезиса - на выход будут проходить куски шума. В отличие от фильтров, которые сделают шуму положенные "минус N dB" вне зависимости от текущего значения сигнала.

В фотошопе похожая обработка тоже называется "фильтром", не вижу ничего странного. Нелинейный, не ФНЧ, конечно, но что-то связанное с квантованием.

Причём тут Фотошоп? В обработке сигналов слово "фильтр" имеет совершенно однозначную интерпретацию, и это НЕ фильтр, поскольку у него нет частотной избирательности.

Если сигнал оцифрован и на нём шум - проще всего сделать усредняющий фильтр. Например, скользящее окно шириной в 3 или 5 точек с записью в среднюю точку среднего значения

С поправкой: медианный фильтр отсекает одиночные выбросы, а непрерывные колебания, как на рисунке, не отфильтровывает. Поэтому нужно вычисление среднеарифметического значения

Поэтому нужно вычисление среднеарифметического значения

Тогда получается FIR(КИХ) фильтр скользящего среднего. Это у которого все коэффициенты одинаковые и в сумме дают 1.

Шум бывает и низкочастотным, а вовсе не в виде наивной бахромы на графике. Если б автор не поленился привести пример задачи, где гистерезисная обработка применяется, было бы понятней.

А это обычная обработка аналоговых датчиков положения, абсолютных энкодеров. Ну и в цифровой индикации тоже полезно.

Я вот MIDI- контроллером пользуюсь - там то же самое, напряжение с обычных потенциометров квантуется в 128 уровней. Фильтруют, чтобы без движения цифру не колбасило между двумя соседними значениями, и интерфейс не засорялся.

 Если б автор не поленился привести пример задачи, где гистерезисная обработка применяется, было бы понятней.

Нигде. Просто в 2019 был такой вопрос на собеседовании при устройстве на работу программистом МК.

Очень интересная концепция. Встречали такой фильтр, реализованный в железе/аналоговой схеме? Если его совместить с flash adc, то должен получиться быстрый и помехоустойчивый захват, не требующий устройства выборки/хранения.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации