Гневисть, спасибо за видео! Пишу на ASM X86, работаю в основном с ПЛИС при помощи языка проектирования Verilog. Ты - один из немногих, кто понимает о чем говорит и называет вещи своими именами, тебя интересно смотреть не только новичку в этом деле, но и инженеру с опытом.
Спасибо! Доходчиво всё объяснили, так очень редкий преподаватель сможет донести для студентов излагаемый предмет. Хотелось бы увидеть в ближайших видео как осуществить дельта-сигма модуляцию, скажем, речевого сигнала.
Если сказать Огромное СПАСИБО!, то это будет только половина благодарности! Всегда рад Вашим видео! Как раз пишу свой велосипед для открытия дверей теплицы по показаниям температуры, и тут теория подъехала... Спасибо еще раз!
делал измерение по формуле пять измерений, все сложить и на пять разделить, подчет делал по схеме сдвига , последние из пятерки выходит а измеряемое в первое входит. алгоритм полечился простой и очень практичный. количество измерени выбрал от требуемого среза верхних частот которое задавалась внешне программно
SMA считается по O(n) , не надо там каждый раз считать сумму всех элементов массива , достаточно поддерживать переменную суммы, вычитая из нее самое старое значение и добавляя новое
Так всегда и есть - я когда-то, по молодости, терпеть не мог готовые библиотеки - "все сам напишу!!!", спустя годы стараюсь побольше использовать именно готовые - ибо кто-то до меня уже набил шишки и все отладил, зачем мне повторять его опыт? Мне нужно макрозадачу решить, а микрозадачи - они все решены до нас =)))
7:25 алгоритм можно упростить и ускорить. Сдвигать элементы массива нет никакой нужды. Достаточно хранить указатель на текущую ячейку, и при новом измерении записывать в неё значение и сдвигать указатель дальше. Ну и, естессна, следить, чтобы он не ушёл куда глаза глядят, вовремя возвращая его домой)) Таким образом, первая часть с кучей пустого перемешивания нулей и единиц в памяти превращается в две с половиной команды: запись в массив, инкремент указателя и проверку его на выход за границы. Далее, сумму считать каждый раз нет необходимости: перед перезаписью элемента массива новым числом, вычитаем это значение из суммы, а затем добавляем свеже пришедшее к сумме и кладём в массив на текущую позицию.
Представляется, что EMA_Filter в целочисленной арифметике можно реализовать с меньшим количеством операций. А если в качестве параметра alpha выбирать степени двойки (1/2, 1/4, 1/8, ...), то для вычисления каждого нового отфильтрованного значения потребуется всего лишь две операции сложения и две операции сдвига (умножения на степень двойки). Стоит отметить, что одну операцию сдвига (умножения/деления) следует выполнять только в случае, когда необходимо вывести отфильтрованное значение на экран. Это так и в Вашей программе. Т.е. для Вашей рекурентной формулы Yprev=(Xx*10*alpha+Yprev*(1000-alpha))/1000, значение Yy=Yprev/10 не требуется. Просто хотелось отделить вывод на дисплей фильтрованного значения от самой фильтрации. Yprev, в принципе, ничем не хуже Yy, и его можно использовать в внутри программы (например для управления чем либо). Для вычисления скользящего среднего значения требуется всего два сложения и один сдвиг. В смысле вычисления - формально чуть проще. Но нужно хранить массив измерений, и следить за индексом кольцевого буфера, что еще одна операция сложения. Не знаю насколько это большое ограничение сейчас для микроконтроллеров. Еще, среди очень простых фильтров (с точки зрения программирования микроконтроллеров и требования к ресурсам), нужно отметить EMA (Exponential Moving Average) - фильтры более высоких порядков (Double Exponential Smoothing, Triple Exponential Smoothing, ...). Особенно это полезно в случае необходимости оценки производной функции измеряемого процесса. Кроме того, как правило, задержка сигнала, связанная с фильтрацией, становится меньше. Количество операций здесь минимально, и память для хранения массива измерений тоже не требуются.
Видео супер. Не сказано в этом уроке что такое n. Период фильтрации (n) - это количество замеров, которые будут усреднены. Грубо говоря, если n=1, то нет усреднения(каждый замер на входе попадает без изменений на выходе). Если n=2, то берет среднее из 2х значений(предыдущее + текущее значение / 2). Если n=100, то среднее из 100 замеров. Вангую забавную аббревиатуру PIDR (proportional-integral-derivative regulator) в следующем уроке.
Наконец-то подошли к концу мини сериала про АЦП???? Да нет, не разу не наконец-то..... Здрасьте кстати 😅 Автор как всегда отбойный молоток но Михалыч это космос 😂 Счастья, любви, здоровья, удачи👍
Спасибо! =)))) Ну, можт и продолжится этот сериал в виде эммм... Спин-оффов, или как это в киноиндустрии сейчас модно так называется? =))))) Счастья, здоровья, сил, любви, и всего-всего =))))))
Если сигнал выглядит так, как на 1:25, то нужно не фильтрацию делать, а гнать разработчика этой схемы ссаными тряпками! Потому что он не умеет грамотно развести земли и разделить их на цифровую и аналоговую.
Знаете где это может пригодится? Для оверсемплинга 10 битных АЦП. Есть документ от микрочип: AVR121:Enhancing ADC resolution by oversampling. Можно увеличить разрядность и точность АЦП. Благодаря этому видео я ещё больше понял этот документ. И вообще возможно автор видео захочет показать пример оверсемплинга на PIC/AVR, где используются именно эти формулы. А теории от 10 битного АЦП можно получить точность в 3-4 знака после запятой.
Не ошибается тот, кто ничего не делает? Но разве ничего не делать - это уже не ошибка? :) А выпуск супер!!! Не знал, что можно и в цифре так сделать, сам бы на аналоге мутил перед самым входом (RC или LC, скорей первый, а то L иногда плюётся некрасиво, ещё C обидится, или датчик). Спасибо, просвещаете нас дремучих. 👍👍
"Ничего не делать" - это целая жизненная философия, с которой я не согласен, ибо скучно это =)))))) RC фильтр неплохой вариант, но можно замучиться подбирать номиналы, а при отладке на объекте это скушает много времени, плюс лишние детали (еще и вопрос сертификацией может возникнуть). С программным усреднением проще - коэффициент/период подобрал на глаз - и норм =)))))))
А я ФНЧ Бесселя 2-го порядка сделал на ОУ. В умных книгах написано, что надо аналоговый фильтр + цифровой фильтр. Некоторая дополнительная полезная информация есть на канале TDM Lab ua-cam.com/video/Y_CQp6ENwS0/v-deo.html
А я голову ломал, зачем в свое время Гайвер использовал для сглаживания метод усреднения квадратов? Теперь убедился, что всё проще и надеждее. Спасибо!
Как объяснение сути фильтрации для несведущих - отличный материал. Как пример реального кода - моветон, и вот почему: Использование массива в скользящем среднем это показатель быдлокодинга, т.е. автор кода не понимает ценности ОЗУ и затрачиваемого процессорного времени на вычисления. При каждом новом измерении происходит суммирование всего массива в какую-то "большую" переменную, при том, что большинство ПЛКшек на сегодняшний день остаются восьмибитными, т.е. киличество тактов процессора затрачиваемого на один цикл суммирования кратно равно количеству октетов в "большой" переменной. Получается, если мне нужно фильтровать показания с двадцати-тридцати-пятидесяти датчиков, то ОЗУ "до свидания", а ЦП большую часть времени выполняет бесполезный однообразный код и ничего другого просто сделать не успевает. Целый дорогущий процессорный блок на несчастную жменю датчиков. У Гайвера на канале "Заметки ардуинщика" есть видео про фильтрацию измеренных значений, где объясняется как именно нужно применять фильтр бегущего среднего.
Спасибо за развернутый комментарий, но вынужден уточнить детали: Естественно, это простой пример для начинающих, в котором формула воплощена "as is" для наглядности, и кушоеть много памяти и ресурсов, но! Тот недорогой ПЛК, который я использовал в примере, обладает 8 мегабайтами ОЗУ для пользовательских данных. Заманаюсь экономить =))))) И, простите, откуда инфа про восемь бит? Вполне "взрослые" микропроцессорные комплекты используются у всех лидеров рынка... Второе - скорость выполнения программы, он же сканцикл, при использовании моего метода, плюс с подгруженной веб-визуализацией, он не выходил из значений "холостого хода" - 300мкс. Да и в целом, ни разу не удалось его "прогрузить", чтобы он вышел на "человеческие" 10мс хотя бы =)))) даже если вместе с управлением приходилось решать задачи по даталоггингу, составлению отчетов с чтением/записью файлов и обмену этих файлов через FTP. И в третьих, сегодня у многих крупных клиентов в приложении к договору (т.н. Project Specification) прописывается требование об оформлении кода - декларируется использования конкретных языков программирования для решения каждого круга задач, и особенно в части написания формул - требуется максимальная наглядность и читаемость; ресурсов чтобы обработать такой "быдлокод" у современных машин "за глаза"... Увы, оптимизация уходит в прошлое и в промавтоматике, с другой стороны - может это и к лучшему, ведь становится проще разобрать логику построения чужой программы =))
@@Gnevistj У меня в эксплуатации находятся, кроме прочего, контроллеры покупки 2008 года Siemens SIMATIC S7-400 (это тот случай, когда работает - не трогай). На поверку при вскрытии выясняется, что вычислительная элементная база построена на контроллерах Atmel AVR серии (при этом есть подозрения на распределённые вычисления, т.к. один контроллер не способен обрабатывать такое количество кода). Снижение проходного уровня это хорошо, в том числе и я проник в АСУП благодаря упрощению написания кода и как следствие более быстрому выполнению проектов. С другой стороны я же сам и зарабатываю на жизнь перерабатывая проекты написанные "очень простым языком". К примеру, в существующую АСУ необходимо добавить какой-нибудь новый агрегат, а АСУ построена на трёхсотой серии и запас на расширение уже истрачен. Так вот, переход от Вашего способа фильтрации к формуле из видео Гайвера позволил мне примерно в два раза сократить время единичного измерения и сэкономить ОЗУ. Ну и напоследок, привет из Мариуполя, комбинат имени Ильича. В 2016 году у нас случился вирус Petya. "Лягли" все ПК как постов управления в частности, так и всей бизнес-сети комбината. Но наш ЛПЦ "Стан 3000", у которого посты управления выполнены на машинах 86 года, продолжил исправно работать, ибо нет такого вируса, который бы положил столь больших "старичков". Уцелели трубопрокатные линии с системой 93-го года, МНЛЗ 92-93-го года запуска так же продолжала работать. ICP DAS серии ICP CON вообще моё почтение, третий десяток лет трудятся и хоть бы хны. Это я всё к тому, что да, есть новые мощные контроллеры, но и старых на местах полно, а убедить собственника в смене "железной" части без какого-то качественного или экономического изменения крайне сложно.
Если поставить фильтр низких частот в виде RC цепочки на выход датчика и сигнал с фильтра подавать на вход ацп, разве не получится то же самое, только без заморочек с кодом?
Привет. Как слелать вольметр, показание которого не скачет? Например при величине близкой, к 23 и 24 всн равно показания с обоими фильтрами скачат между 23 и 24 (ну или сколько там). И так в почти всех цифровых вольметрах (амперметрах). Что сделать чтоб показания не скакали (ударение на вторую "а")
Грубо говоря, хранить значение с одной цифрой после запятой, и менять выводимое значение, если истинное изменилось более, чем на 0.1. Прыгать резко станет реже.
Так и было!! ардуина считывала сопротивление терморезистора, на столе все работало норм. Но ночью, когда все уснули а датчик закрепился на батарее той-же комнаты, сработала тревога))
Не нашел нигде в интернете как синхронизировать аудио с анимацией на oled дисплее i2c 128*64(да и в принципе на любом другом). Буду благодарен если снимешь урок на эту тему! (Пример: на дисплее включается анимация 2сек, и при включении анимации включается определенный звук с такой же продолжительностью. Включается другая рандомная анимация, и также соответственно включается звук присвоенный именно этой анимации)
Отличный видос, хоть я и знаю всё это давно, однозначно смотрю с удовольствием. У меня только один вопрос: какого хрена уведомления не приходят? Раньше приходили, а сейчас нет. И это, я в молодости фильтровал аналоговые сигналы с помощью аналоговых фильтров, как ни странно 😂😂😂 RC/LC в зависимости от ситуации, только постоянную времени посчитать
Это всё конечно классика. Но что реально интересно, это когда АЦП 16, 24 бита, используется буферный ОУ и опорник. Настройка диф режима и фильтрация и размах с помощью ОУ, для высокой точности
Не знаю, на своём бойлере сделал терморегулятор на обычном китайском термисторе, Меga8 и импульсном пропитании. Никакие помехи и наводки ему не мешают. Темперадуру держит в пределах 2-3°C. Единственно, при переходе с одного градуса на другой начинался дребезг. Проблема решилась уменьшением частоты измерения темперадуры: подбором времени задержки. Всё работает чётко.
Уважаемый коллега, я несколько лет использую некий фильтр и назвал его TDS (Tracking filter with Differential output step), а Вы мне открыли глаза и указали, что он называется EMA. Только формула у меня Yt = Yt-1 + (Xt - Yt-1)*a. Не могу их одну в другую преобразовать.
Здравствуйте, коллега! Да, это один из вариантов формулы ЭМА, не "канонический", как в Википедии, например, но это именно она, один в один. В показанной мною формуле откройте скобки, и после, соберите скобки по множителю "а", и вы получите ваш вариант формулы =))
Успешно собрал :) Реально на практике использую упрощённую формулу и обозвал её TRS. Yt = Yt-1 + ((Xt > Yt-1) - (Xt < Yt-1))*a. То есть не экспоненциально, а линейно изменяем выходную величину. И нету умножения, а сравнение. Таким образом 8-битный контроллер делает эту фильтрацию десятком команд.
Не нужно для скользящего среднего при каждом отсчёте пересчитывать сумму и делить её на количество отсчётов усреднения: При запуске домножаем значения уставок для включения и выключения на длину массива; При каждом отсчёте отнимаем из переменной суммы значения из хвоста массива, сдвигаем массив (я просто сдвигаю указатели на начало и конец кольцевого массива), вставляем в голову новое значение и прибавляем его же к сумме; Всё. Сумму можно сравнивать с уставками ;)
С плавающей точкой при таком способе может накапливаться ошибка округления, а с целочисленными вообще никаких проблем. Я так считаю среднее квадратическое - там при каждом отсчёте, вообще, нужно было бы считать квадратный корень... но зачем, если можно уставку заранее возвести в крадрат и умножить на длину буфера? :)
Спасибо автору видео. Можете показать как работать с платами wifi D1 для ардуино Uno. Хочу создать систему умный дом для ардуино. С платой D1 не могу разобраться( подключить) и т.д.
Ну это жесть конечно на каждом цикле двигать весь массив. Так не стоит делать даже для упрощения понимания при демонстрации 🙂 Нужно завести ещё одну переменную-индекс на следующую позицию, далее записываем новое значение в ячейку куда указывает этот индекс, потом увеличиваем индекс на единицу и проверяем не вышел ли он за границу массива. Если вышел - обнулям. Ну а дальше суммируем. Хотя и по большому счёту и второй цикл суммирования массива лишний. Достаточно при старте заплнить весь массив, потом посчитать его сумму и уже оперировать только с этой суммой: перед тем как записывать новое значение в ячейку массива, из имеющийся суммы вычитаем значение этой ячейки и добаляем к сумме новое значение.
Есть еще средне-взвешенная средняя. там последним данным больший вес в формуле придается. и еще можно сгладить шумы если на входе интегратор из конденсатора и резистора поставить.
От оно как, оказывается нада... а мы по старинке при достижении измериловом заданного порогового значения запускаем таймер, напрочь забывая про сигнал, по прерыванию из таймера переизмеряемся, снова запускаем таймер если сигнал находится за порогом... и так цикл сколько нам надо на устранение условной помехи, и только после запускаем исполнителя. При нескольких различных пороговых уровнях длительность и число циклов может быть различным. Наследство тех времён, когда приходилось считать каждый байт и каждый такт...
Вот напрочь забыл его упомянуть, хотя использовал совсем недавно аналогичный подход!!! Каюсь, виноват, спасибо за дополнение! =))) Метод никак не устаревший, он живее всех живых, и действительно прост в реализации, но есть одно ограничение - сей способ подходит только для управления посредством компараторов, сравнения с некоторой уставкой - в этом случае сей метод царь и Бог по простоте и быстродействию =))) Показанные мною методы больше подходят в случае если кроме управления нужна "не прыгающая" индикация, ну и в случае пропорционального управления они становятся незаменимы.
@@Gnevistj Когда надо получить усреднёнку для красивешной индикации, обычно берётся дискретизация выборки измерений 4-100Х от цикла обновления индикации. Редко когда делал обновление индикатора чаще раза в секунду. Часто это была совершенно отдельная подпрограмма, не завязанная на управление, живущая на отдельном таймере. Одна из важных фишек, не мешать вместе исполнительный код разных функций. Записываем значение АЦП в аккум (или выделенную ячейку памяти) при следующем измерении складываем это и старое, сдвиг аккума вниз (делим на два). Цикл повторяется. В момент обновления индикации имеющееся значение пихаем в регистр индикатора. Да, в принципе-то всё то же самое, что и у вас, но без математики в коде. Да, опять же наследие асма.
А я усреднение среднего пользуюсь, это когда предыдущий результат складывается с тёкшим и делится на 2, затем он складывается с таким же средним и делится на количество заданных измерений. При 50 замерах раз в 100 мкС показания вольтметра стоят как вкопанные.
Зачастую, бОльшую часть можно отфильтровать аналоговыми цепями. А FFT и, например, в обработке звука стараются не применять. Рекурсивные цифровые фильтры куда более распространены. Есть, между прочим, очень простой способ усиления НЧ и ВЧ с помощью банального сложения и вычитания двух соседних отсчётов. При сложении всё, что осталось неизменным (НЧ) удваивается, а при вычитании -- уничтожается. Кстати, практически все формулы, которые так любят приводить в учебниках, для микроконтроллеров подходят плохо, потому что требуют арифметику с плавающей точкой, а простенькие МК её жуть, как не любят. Большинство даже и целочисленное деление выполняют через костыли, не говоря уже о FP.
В программировании МК недавно, ещё учусь. Но блин, экономить вычислительный ресурс МК считывая значения раз в секунду - это мягко говоря тупо. Из всех уроков что я прошёл - большую часть кода, и соответственно, вычислительной мощности, тратится на то, что бы полученный результат донести до оператора изделия. А не выполнить какую либо автоматическую функцию... Опять же пример - бойлер, что бы клацать релюшкой, нужно, грубо говоря, 15 строк кода, остальное - это показать человеку температуру, обработать нажатия и пр. взаимодействие. Уход от плавающей запятой тоже такой применял. Смотрел как в уроке, понимал что это тупо (учу АВР, естественно Атмега8), переписывал код под "фиксированную" запятую. Итог - меньше памяти занято, удобнее читать код, сразу объявляются типы данных, а не как иногда бывает "ой, что то не работает..." *прошло пол часа* "...ааааа, тут нужно было присвоить другой тип данных" *пихается присвоение типа данных в середину кода*.
Хорошо продвигаетесь, так держать! Будет подезно, если еще таких привычек не приобрели, если в си пишете: 1. Сразу ставить (), {}, [ ], обе скобки. Никогда не забудете, их потавить. 2. Использовать структуры. 3. Создавать свои типы данных. 4. Испоьзовать тип union. 5. Использовать указатели. Эффективность и читаемость повысятся в разы.
SUPER! Teperj nado perehoditj na BK kompjuteri! 🎉 A cto s SVO? Gatov ktoto k mogilizaciji ili luche putlera v Gagskij tribunal pislatj i zitj dalshe mirno?🎉
В чем проблема программно исключить ошибки во входных данных? Если анализировать не только величину значений, а и разницу между ними, то легко заметить, что некоторые из них на порядок выше обычных.
О, сразу видно советского инженера! Все сигналы у него меняются медленно, поэтому их можно зафильтровать. Особенно температура. Поэтому когда я на своей Весте выезжаю зимой со стоянки торгового центра, то она показывает температуру +12 даже когда я уже оказался на улице, а до -15 она дойдёт хорошо если минут через пять. А если вы делаете датчик натяжения троса для подъемного крана, у вас тоже сигнал меняется медленно? Ну, груз же просто висит, надо показать натяжение. Вот только если возникнет затяжка, то вы должны СРАЗУ ЖЕ показать превышение, чтобы автоматика СРАЗУ выключила двигатель. А если вы его зафильтруете, то трос оборвется когда показания будут ещё далеко от критических.
@@Gnevistj согласен, но куда не плюнь, если сколзящее среднее, в ПО то массивы, даже в пром. ПЛК не парятся. Поэтому и ограничены лимиты 32-128. Для выборками. Для давлений допустим в вентканалах с сумасшедшей турбулентностью, 32 выборки мало как у сименс например. Там 32, ещё и 100 сверху добавлять приходится. Ну в в общем видео ваше и вам решать о чём рассказывать. Хорошее дело делаете! )
@@Gnevistj Я Вас тоже понимаю, сложно сценарий писать и всё в голове удержать. Если есть возможность запилите передачу про рекуррентные формулы, для чайников будет полезно, а то все боятся их как и математики. А по итогу страшный ПИД сводится к сложению и умножению! )
@@Gnevistj ПИД просто как пример, рекуррентных формул(к примеру википедия). Сам в относительно не давно свой первый ПИД написал т.к. в любой среде они есть уже готовые. Но тут по бюджету захотели ПЛК EKF. Хотя работал до этого с Сименс и КодеСис совместимыми контроллерами. По итогу в среде разработки EKF, забыл сейчас аналоги(при чем продаются в РФ и даже дешевле), видимо кто-то списал тупо ПИД из гит-хмб, у Гайвера, по итогу ПИД если один, работает нормально, если два конфликтуют, т.к. переменные в функции static. Другой вопрос в FBD комменнтов даже нет, есть только в Lad и ограничения на входах функции три выхода и что-то в районе 10 входов, вход/выход туда же входят. Остальное всё переменные для внутренней памяти функции а их 32, с учётом входов и выходов. Короче весело! Плюс когда надо обрзначить маски в WORD, а у них есть только INT по итогу надо пересчитать число в Int со знаком короче весело! По этому то и написал, что готовить тех кому это интересно надо тупо к лютой жести! Мы же асушники! Плюс нашей профессии, много асушников ушло в IT и мы сможем скоро тупо как в Крёстном отце назначать свою цену. Сцена с котом! ) Если подкачал с грамматикой - это всё пивас! )
Да уж, цифровая фильтрация тема интересная и сложная. Как-то пытался сделать цифровой фильтр «по учепнику», всё по формулам преобразований (для аудиофайла в матлабе). Получил на выходе массив комплексных чисел. А как подать комплексный сигнал на ЦАП (ну или в данном случае записать в аудиофайл) нигде в «учепниках» не рассматривается🤣🤣🤣 Теория как-то отделена от практики😁 Нужен личный практический опыт, потом эти «учепники» уже переосмысляешь
Когда увидел := - уже затошнило от флешбеков Паскаля со времён школы. А здесь этот Бейсик или не пойми что, в отличие от школовского Паскаля - ещё и отвратительно читается. Вы, батенька, мазохист? Чем обычные си не угодили? На коболе писать не пробовали? Наверное, вам понравится
Да ладно вам... По первой же формуле, показанной альтер-эго автора канала, было понятно, о чём пойдёт речь 😁 p.s.: или я просто уделяю слишком много времени машинному обучению и статистике 🙄
Не-не-не, не путайте пожалуйста полноценную ЦОС и фильтрацию сигналов в автоматике - совершенно разные цели, подходы, и постоянные времени. Это близкие по функционалу только на первый взгляд области, и если я правильно помню теорию, то скользящие средние являются лишь упрощенной реализацией фильтра с КИХ =)))
Ничерта не шарю в программировании, но мужик на столько мне заходит, такой веселый и много умных слов говорит, что я его смотрю постоянно!
Блин, я давно все знаю это, но автор настолько крутой, что смотрю с удовольствием
Я не знаю даже кто я такой но автора смотрю 🤣
Спасибо, ребят! Буду стараться радовать вас дальше! =)))
@@Gnevistjздравствуйте! Можно обратиться к Вам по программированию?
Гневисть, спасибо за видео! Пишу на ASM X86, работаю в основном с ПЛИС при помощи языка проектирования Verilog. Ты - один из немногих, кто понимает о чем говорит и называет вещи своими именами, тебя интересно смотреть не только новичку в этом деле, но и инженеру с опытом.
Изумительная подача материала , браво ! Спасибо.
Спасибо "Санычу". Про "скользящее среднее" и "скользящее экспоненциальное среднее" я вроде в курсе.
Друг, продолжай делать ролики. Спасибо.
Народ соскучился по умным преподавателям.
Спасибо! Буду продолжать =)
Спасибо! Доходчиво всё объяснили, так очень редкий преподаватель сможет донести для студентов излагаемый предмет. Хотелось бы увидеть в ближайших видео как осуществить дельта-сигма модуляцию, скажем, речевого сигнала.
Если сказать Огромное СПАСИБО!, то это будет только половина благодарности! Всегда рад Вашим видео! Как раз пишу свой велосипед для открытия дверей теплицы по показаниям температуры, и тут теория подъехала... Спасибо еще раз!
16:26 - лучше делать кратно степени двойки и переходить от деления к сдвигам.
Информативно!
Очень интересная подача!
Годнота подъехала. Жму руку и желаю успехов во всех начинаниях!
делал измерение по формуле пять измерений, все сложить и на пять разделить, подчет делал по схеме сдвига , последние из пятерки выходит а измеряемое в первое входит. алгоритм полечился простой и очень практичный. количество измерени выбрал от требуемого среза верхних частот которое задавалась внешне программно
SMA считается по O(n) , не надо там каждый раз считать сумму всех элементов массива , достаточно поддерживать переменную суммы, вычитая из нее самое старое значение и добавляя новое
да и массив не надо каждый раз перетряхивать, просто хранить текущий индекс и двигать его при каждой записи.
За что нравится Саныч - объясняет за пару секунд. Уважаем! 😂
Отличная подача матеряла. Смотрится с удовольствием и на одном дыхании.
Красиво объяснил. Спасибо. С опытом, через боль доходим до этого. Разрабатываем алгоритм. А потом оказывается это всё уже давно придумано до нас.
Так всегда и есть - я когда-то, по молодости, терпеть не мог готовые библиотеки - "все сам напишу!!!", спустя годы стараюсь побольше использовать именно готовые - ибо кто-то до меня уже набил шишки и все отладил, зачем мне повторять его опыт? Мне нужно макрозадачу решить, а микрозадачи - они все решены до нас =)))
Молодец😊
7:25 алгоритм можно упростить и ускорить.
Сдвигать элементы массива нет никакой нужды. Достаточно хранить указатель на текущую ячейку, и при новом измерении записывать в неё значение и сдвигать указатель дальше. Ну и, естессна, следить, чтобы он не ушёл куда глаза глядят, вовремя возвращая его домой)) Таким образом, первая часть с кучей пустого перемешивания нулей и единиц в памяти превращается в две с половиной команды: запись в массив, инкремент указателя и проверку его на выход за границы.
Далее, сумму считать каждый раз нет необходимости: перед перезаписью элемента массива новым числом, вычитаем это значение из суммы, а затем добавляем свеже пришедшее к сумме и кладём в массив на текущую позицию.
Хорошо, что я нашел Ваш. канал, большое спасибо за видухи .
Випадково забрів,але вже давно наблюдаю,ноут і жменя мк теж є,цікава подача,що зацікавлює.
Первое полезное видео на канале. До этого радовала подача материала )))
Раскажите угол открывания тиристоров для чего такие углы что происходит при разных начальных углах аналоговые схемы типа тпе 😮
Прекрасный ролик, спасибо. И гневисть есть в нужном количестве.
Доставляет удовольствие следить за мыслью умного человека
Классно. Спасибо за очередной шедевр. Особенно аутро повеселило 🔝
Удачно я зашел!!!)))) Подписался, поставил лайк, сижу и радуюсь!)))
Спасибо! Все по полочкам! Так держать!
Саныч как всегда прав, спаасибо за видео!
Спасибо за подготовку материала!!! 💪💪💪💪✌✌✌✌!!!!
Представляется, что EMA_Filter в целочисленной арифметике можно реализовать с меньшим количеством операций. А если в качестве параметра alpha выбирать степени двойки (1/2, 1/4, 1/8, ...), то для вычисления каждого нового отфильтрованного значения потребуется всего лишь две операции сложения и две операции сдвига (умножения на степень двойки).
Стоит отметить, что одну операцию сдвига (умножения/деления) следует выполнять только в случае, когда необходимо вывести отфильтрованное значение на экран. Это так и в Вашей программе. Т.е. для Вашей рекурентной формулы Yprev=(Xx*10*alpha+Yprev*(1000-alpha))/1000, значение Yy=Yprev/10 не требуется. Просто хотелось отделить вывод на дисплей фильтрованного значения от самой фильтрации. Yprev, в принципе, ничем не хуже Yy, и его можно использовать в внутри программы (например для управления чем либо).
Для вычисления скользящего среднего значения требуется всего два сложения и один сдвиг. В смысле вычисления - формально чуть проще. Но нужно хранить массив измерений, и следить за индексом кольцевого буфера, что еще одна операция сложения. Не знаю насколько это большое ограничение сейчас для микроконтроллеров.
Еще, среди очень простых фильтров (с точки зрения программирования микроконтроллеров и требования к ресурсам), нужно отметить EMA (Exponential Moving Average) - фильтры более высоких порядков (Double Exponential Smoothing, Triple Exponential Smoothing, ...). Особенно это полезно в случае необходимости оценки производной функции измеряемого процесса. Кроме того, как правило, задержка сигнала, связанная с фильтрацией, становится меньше. Количество операций здесь минимально, и память для хранения массива измерений тоже не требуются.
как всегда очень познавательно и интересно. спасибо. здравствуйте кстати)
Интересно, доходчиво! Как жаль что мало)))
Тут можно ставить лайк не глядя. Заходит на ура.
Сделай ролик про ПИД регулирование например с термопарой.
Одна из достойных освещения, методик фильтрации: медианный фильтр.
Реализуется просто, задержек минимум, шумы фильтрует очень хорошо.
Да, но это один из вариантов скользящей средней, поэтому я его не упомянул в этом выпуске =)
Массив требует сортировки при каждом отсчёте...
Спасибо большое!
Эээээээ! Я еще прошлые ролики не посмотрел! Хороший темп. Так держать!
Они никуда не исчезнут, прошлые ролики, не переживайте! =)))
Постараюсь радовать и дальше =)
Видео супер. Не сказано в этом уроке что такое n. Период фильтрации (n) - это количество замеров, которые будут усреднены. Грубо говоря, если n=1, то нет усреднения(каждый замер на входе попадает без изменений на выходе). Если n=2, то берет среднее из 2х значений(предыдущее + текущее значение / 2). Если n=100, то среднее из 100 замеров.
Вангую забавную аббревиатуру PIDR (proportional-integral-derivative regulator) в следующем уроке.
Обычно пишут regulator, не включая в аббревиатуру.
Если есть лишние ресурсы МК - выбираю для себя фильтр Калмана. В свое время очень помог с тензодатчиками.
👍👍👍👍👍
Кайфово что Хэтфилд выучил русский и поясняет за электронику
Наконец-то подошли к концу мини сериала про АЦП???? Да нет, не разу не наконец-то.....
Здрасьте кстати 😅
Автор как всегда отбойный молоток но Михалыч это космос 😂
Счастья, любви, здоровья, удачи👍
Спасибо! =))))
Ну, можт и продолжится этот сериал в виде эммм... Спин-оффов, или как это в киноиндустрии сейчас модно так называется? =)))))
Счастья, здоровья, сил, любви, и всего-всего =))))))
Здесь только IIR упомянули. А вот FIR, median - не, не слышали. О Калмана (кстати, часто юзаю) - вообще молчу
Если сигнал выглядит так, как на 1:25, то нужно не фильтрацию делать, а гнать разработчика этой схемы ссаными тряпками! Потому что он не умеет грамотно развести земли и разделить их на цифровую и аналоговую.
Знаете где это может пригодится? Для оверсемплинга 10 битных АЦП. Есть документ от микрочип: AVR121:Enhancing ADC resolution by oversampling. Можно увеличить разрядность и точность АЦП. Благодаря этому видео я ещё больше понял этот документ. И вообще возможно автор видео захочет показать пример оверсемплинга на PIC/AVR, где используются именно эти формулы. А теории от 10 битного АЦП можно получить точность в 3-4 знака после запятой.
Не ошибается тот, кто ничего не делает? Но разве ничего не делать - это уже не ошибка? :)
А выпуск супер!!! Не знал, что можно и в цифре так сделать, сам бы на аналоге мутил перед самым входом (RC или LC, скорей первый, а то L иногда плюётся некрасиво, ещё C обидится, или датчик). Спасибо, просвещаете нас дремучих. 👍👍
"Ничего не делать" - это целая жизненная философия, с которой я не согласен, ибо скучно это =))))))
RC фильтр неплохой вариант, но можно замучиться подбирать номиналы, а при отладке на объекте это скушает много времени, плюс лишние детали (еще и вопрос сертификацией может возникнуть). С программным усреднением проще - коэффициент/период подобрал на глаз - и норм =)))))))
А я ФНЧ Бесселя 2-го порядка сделал на ОУ. В умных книгах написано, что надо аналоговый фильтр + цифровой фильтр. Некоторая дополнительная полезная информация есть на канале TDM Lab ua-cam.com/video/Y_CQp6ENwS0/v-deo.html
А я голову ломал, зачем в свое время Гайвер использовал для сглаживания метод усреднения квадратов? Теперь убедился, что всё проще и надеждее. Спасибо!
Больше Саныча! Пусть задвинет лекцию за ассемблер!
Как-нибудь попробую сорганизовать =))))))))
Доброго, Вам в личку вопросы можно написать по теме ?
Как объяснение сути фильтрации для несведущих - отличный материал. Как пример реального кода - моветон, и вот почему:
Использование массива в скользящем среднем это показатель быдлокодинга, т.е. автор кода не понимает ценности ОЗУ и затрачиваемого процессорного времени на вычисления. При каждом новом измерении происходит суммирование всего массива в какую-то "большую" переменную, при том, что большинство ПЛКшек на сегодняшний день остаются восьмибитными, т.е. киличество тактов процессора затрачиваемого на один цикл суммирования кратно равно количеству октетов в "большой" переменной. Получается, если мне нужно фильтровать показания с двадцати-тридцати-пятидесяти датчиков, то ОЗУ "до свидания", а ЦП большую часть времени выполняет бесполезный однообразный код и ничего другого просто сделать не успевает. Целый дорогущий процессорный блок на несчастную жменю датчиков.
У Гайвера на канале "Заметки ардуинщика" есть видео про фильтрацию измеренных значений, где объясняется как именно нужно применять фильтр бегущего среднего.
Спасибо за развернутый комментарий, но вынужден уточнить детали:
Естественно, это простой пример для начинающих, в котором формула воплощена "as is" для наглядности, и кушоеть много памяти и ресурсов, но! Тот недорогой ПЛК, который я использовал в примере, обладает 8 мегабайтами ОЗУ для пользовательских данных. Заманаюсь экономить =))))) И, простите, откуда инфа про восемь бит? Вполне "взрослые" микропроцессорные комплекты используются у всех лидеров рынка...
Второе - скорость выполнения программы, он же сканцикл, при использовании моего метода, плюс с подгруженной веб-визуализацией, он не выходил из значений "холостого хода" - 300мкс. Да и в целом, ни разу не удалось его "прогрузить", чтобы он вышел на "человеческие" 10мс хотя бы =)))) даже если вместе с управлением приходилось решать задачи по даталоггингу, составлению отчетов с чтением/записью файлов и обмену этих файлов через FTP.
И в третьих, сегодня у многих крупных клиентов в приложении к договору (т.н. Project Specification) прописывается требование об оформлении кода - декларируется использования конкретных языков программирования для решения каждого круга задач, и особенно в части написания формул - требуется максимальная наглядность и читаемость; ресурсов чтобы обработать такой "быдлокод" у современных машин "за глаза"...
Увы, оптимизация уходит в прошлое и в промавтоматике, с другой стороны - может это и к лучшему, ведь становится проще разобрать логику построения чужой программы =))
@@Gnevistj У меня в эксплуатации находятся, кроме прочего, контроллеры покупки 2008 года Siemens SIMATIC S7-400 (это тот случай, когда работает - не трогай). На поверку при вскрытии выясняется, что вычислительная элементная база построена на контроллерах Atmel AVR серии (при этом есть подозрения на распределённые вычисления, т.к. один контроллер не способен обрабатывать такое количество кода).
Снижение проходного уровня это хорошо, в том числе и я проник в АСУП благодаря упрощению написания кода и как следствие более быстрому выполнению проектов.
С другой стороны я же сам и зарабатываю на жизнь перерабатывая проекты написанные "очень простым языком". К примеру, в существующую АСУ необходимо добавить какой-нибудь новый агрегат, а АСУ построена на трёхсотой серии и запас на расширение уже истрачен. Так вот, переход от Вашего способа фильтрации к формуле из видео Гайвера позволил мне примерно в два раза сократить время единичного измерения и сэкономить ОЗУ.
Ну и напоследок, привет из Мариуполя, комбинат имени Ильича. В 2016 году у нас случился вирус Petya. "Лягли" все ПК как постов управления в частности, так и всей бизнес-сети комбината. Но наш ЛПЦ "Стан 3000", у которого посты управления выполнены на машинах 86 года, продолжил исправно работать, ибо нет такого вируса, который бы положил столь больших "старичков". Уцелели трубопрокатные линии с системой 93-го года, МНЛЗ 92-93-го года запуска так же продолжала работать. ICP DAS серии ICP CON вообще моё почтение, третий десяток лет трудятся и хоть бы хны. Это я всё к тому, что да, есть новые мощные контроллеры, но и старых на местах полно, а убедить собственника в смене "железной" части без какого-то качественного или экономического изменения крайне сложно.
Если поставить фильтр низких частот в виде RC цепочки на выход датчика и сигнал с фильтра подавать на вход ацп, разве не получится то же самое, только без заморочек с кодом?
Привет. Как слелать вольметр, показание которого не скачет? Например при величине близкой, к 23 и 24 всн равно показания с обоими фильтрами скачат между 23 и 24 (ну или сколько там). И так в почти всех цифровых вольметрах (амперметрах). Что сделать чтоб показания не скакали (ударение на вторую "а")
Грубо говоря, хранить значение с одной цифрой после запятой, и менять выводимое значение, если истинное изменилось более, чем на 0.1. Прыгать резко станет реже.
Так и было!! ардуина считывала сопротивление терморезистора, на столе все работало норм. Но ночью, когда все уснули а датчик закрепился на батарее той-же комнаты, сработала тревога))
Не нашел нигде в интернете как синхронизировать аудио с анимацией на oled дисплее i2c 128*64(да и в принципе на любом другом). Буду благодарен если снимешь урок на эту тему! (Пример: на дисплее включается анимация 2сек, и при включении анимации включается определенный звук с такой же продолжительностью. Включается другая рандомная анимация, и также соответственно включается звук присвоенный именно этой анимации)
Гневисть привет.
Все умно и доходчиво, а как нам наладить диалог есть коммерческие темы.
Отличный видос, хоть я и знаю всё это давно, однозначно смотрю с удовольствием. У меня только один вопрос: какого хрена уведомления не приходят? Раньше приходили, а сейчас нет. И это, я в молодости фильтровал аналоговые сигналы с помощью аналоговых фильтров, как ни странно 😂😂😂 RC/LC в зависимости от ситуации, только постоянную времени посчитать
Это всё конечно классика. Но что реально интересно, это когда АЦП 16, 24 бита, используется буферный ОУ и опорник. Настройка диф режима и фильтрация и размах с помощью ОУ, для высокой точности
Не знаю, на своём бойлере сделал терморегулятор на обычном китайском термисторе, Меga8 и импульсном пропитании. Никакие помехи и наводки ему не мешают. Темперадуру держит в пределах 2-3°C. Единственно, при переходе с одного градуса на другой начинался дребезг. Проблема решилась уменьшением частоты измерения темперадуры: подбором времени задержки. Всё работает чётко.
Гистерезис в пару-тройку градусов для таких вещей надо оставлять.
Уважаемый коллега, я несколько лет использую некий фильтр и назвал его TDS (Tracking filter with Differential output step), а Вы мне открыли глаза и указали, что он называется EMA. Только формула у меня Yt = Yt-1 + (Xt - Yt-1)*a. Не могу их одну в другую преобразовать.
Здравствуйте, коллега! Да, это один из вариантов формулы ЭМА, не "канонический", как в Википедии, например, но это именно она, один в один. В показанной мною формуле откройте скобки, и после, соберите скобки по множителю "а", и вы получите ваш вариант формулы =))
Успешно собрал :) Реально на практике использую упрощённую формулу и обозвал её TRS. Yt = Yt-1 + ((Xt > Yt-1) - (Xt < Yt-1))*a. То есть не экспоненциально, а линейно изменяем выходную величину. И нету умножения, а сравнение. Таким образом 8-битный контроллер делает эту фильтрацию десятком команд.
Не нужно для скользящего среднего при каждом отсчёте пересчитывать сумму и делить её на количество отсчётов усреднения:
При запуске домножаем значения уставок для включения и выключения на длину массива;
При каждом отсчёте отнимаем из переменной суммы значения из хвоста массива, сдвигаем массив (я просто сдвигаю указатели на начало и конец кольцевого массива), вставляем в голову новое значение и прибавляем его же к сумме;
Всё. Сумму можно сравнивать с уставками ;)
С плавающей точкой при таком способе может накапливаться ошибка округления, а с целочисленными вообще никаких проблем.
Я так считаю среднее квадратическое - там при каждом отсчёте, вообще, нужно было бы считать квадратный корень... но зачем, если можно уставку заранее возвести в крадрат и умножить на длину буфера? :)
Спасибо автору видео. Можете показать как работать с платами wifi D1 для ардуино Uno. Хочу создать систему умный дом для ардуино. С платой D1 не могу разобраться( подключить) и т.д.
Честно скажу - пока в планах не было, но, планы эти весьма динамично порой меняются =))))
Может и будет такой выпуск =))))))
Здраствуйте, есть инстаграм или ТГ?Есть предложение
Расскажи про ЧПУ-шку, что у тебя за спиной стоит. Платы сам делаешь на нём?
Клевые видео!
Спасибо!
Друг!) Расскажи про P, PD, PI, PID регуляторы...
Ну это жесть конечно на каждом цикле двигать весь массив. Так не стоит делать даже для упрощения понимания при демонстрации 🙂
Нужно завести ещё одну переменную-индекс на следующую позицию, далее записываем новое значение в ячейку куда указывает этот индекс, потом увеличиваем индекс на единицу и проверяем не вышел ли он за границу массива. Если вышел - обнулям. Ну а дальше суммируем. Хотя и по большому счёту и второй цикл суммирования массива лишний. Достаточно при старте заплнить весь массив, потом посчитать его сумму и уже оперировать только с этой суммой: перед тем как записывать новое значение в ячейку массива, из имеющийся суммы вычитаем значение этой ячейки и добаляем к сумме новое значение.
во блин завернул)
@@UA3USY
Ага! Объясняя фразу "на каждом цикле двигать весь массив". А сколько багов ожидается на этом пути!
Есть еще средне-взвешенная средняя. там последним данным больший вес в формуле придается. и еще можно сгладить шумы если на входе интегратор из конденсатора и резистора поставить.
Спасибо.
А PID фильтрация?
pid регулирование, а тут за фильтрацию
Наш человек
Это про схемотехнику?
Медианный фильтр чаще всего лучше всего из простых. Именно нечувствительностью к выбросам
От оно как, оказывается нада... а мы по старинке при достижении измериловом заданного порогового значения запускаем таймер, напрочь забывая про сигнал, по прерыванию из таймера переизмеряемся, снова запускаем таймер если сигнал находится за порогом... и так цикл сколько нам надо на устранение условной помехи, и только после запускаем исполнителя. При нескольких различных пороговых уровнях длительность и число циклов может быть различным. Наследство тех времён, когда приходилось считать каждый байт и каждый такт...
Вот напрочь забыл его упомянуть, хотя использовал совсем недавно аналогичный подход!!! Каюсь, виноват, спасибо за дополнение! =)))
Метод никак не устаревший, он живее всех живых, и действительно прост в реализации, но есть одно ограничение - сей способ подходит только для управления посредством компараторов, сравнения с некоторой уставкой - в этом случае сей метод царь и Бог по простоте и быстродействию =)))
Показанные мною методы больше подходят в случае если кроме управления нужна "не прыгающая" индикация, ну и в случае пропорционального управления они становятся незаменимы.
@@Gnevistj Когда надо получить усреднёнку для красивешной индикации, обычно берётся дискретизация выборки измерений 4-100Х от цикла обновления индикации. Редко когда делал обновление индикатора чаще раза в секунду. Часто это была совершенно отдельная подпрограмма, не завязанная на управление, живущая на отдельном таймере. Одна из важных фишек, не мешать вместе исполнительный код разных функций. Записываем значение АЦП в аккум (или выделенную ячейку памяти) при следующем измерении складываем это и старое, сдвиг аккума вниз (делим на два). Цикл повторяется. В момент обновления индикации имеющееся значение пихаем в регистр индикатора. Да, в принципе-то всё то же самое, что и у вас, но без математики в коде. Да, опять же наследие асма.
По фильтрам в своих свистоперделках пользую обычно "filt = (A * filt + signal) >> k;" подсмотрено у "гайвер фильтры" кстати там же хорошая статья есть
Так а чего б не написать это всё на Си, где нет никаких проблем с плавающей точкой.
тем более в родной микрочип студио)
А я усреднение среднего пользуюсь, это когда предыдущий результат складывается с тёкшим и делится на 2, затем он складывается с таким же средним и делится на количество заданных измерений. При 50 замерах раз в 100 мкС показания вольтметра стоят как вкопанные.
Если не ошибаюсь, этот метод называется скользящей медианой =) Принцип у них у всех похож, главное чтобы результат радовал =)
@@GnevistjБольше похоже на скользящие среднее, а в остальном Согласен на все 100 😁😁👍👍😉😉
Другие методики
Фильтр низких частот вошел в чат
Не Саныч непонятно объяснил, похоже у него интеллект намного выше моего 😂
Зачастую, бОльшую часть можно отфильтровать аналоговыми цепями. А FFT и, например, в обработке звука стараются не применять. Рекурсивные цифровые фильтры куда более распространены. Есть, между прочим, очень простой способ усиления НЧ и ВЧ с помощью банального сложения и вычитания двух соседних отсчётов. При сложении всё, что осталось неизменным (НЧ) удваивается, а при вычитании -- уничтожается. Кстати, практически все формулы, которые так любят приводить в учебниках, для микроконтроллеров подходят плохо, потому что требуют арифметику с плавающей точкой, а простенькие МК её жуть, как не любят. Большинство даже и целочисленное деление выполняют через костыли, не говоря уже о FP.
На 9:48 где-то горько заплакал float :)
Чет новое узнал
Ничего не понял, но интересно.)))
Теперь я знаю :-)
Это перезалив? Я вчера этот ролик смотрел или сегодня утром😕
Нет, не перезалив, выложил сегодня утром =)
В программировании МК недавно, ещё учусь. Но блин, экономить вычислительный ресурс МК считывая значения раз в секунду - это мягко говоря тупо. Из всех уроков что я прошёл - большую часть кода, и соответственно, вычислительной мощности, тратится на то, что бы полученный результат донести до оператора изделия. А не выполнить какую либо автоматическую функцию... Опять же пример - бойлер, что бы клацать релюшкой, нужно, грубо говоря, 15 строк кода, остальное - это показать человеку температуру, обработать нажатия и пр. взаимодействие.
Уход от плавающей запятой тоже такой применял. Смотрел как в уроке, понимал что это тупо (учу АВР, естественно Атмега8), переписывал код под "фиксированную" запятую. Итог - меньше памяти занято, удобнее читать код, сразу объявляются типы данных, а не как иногда бывает "ой, что то не работает..." *прошло пол часа* "...ааааа, тут нужно было присвоить другой тип данных" *пихается присвоение типа данных в середину кода*.
Хорошо продвигаетесь, так держать!
Будет подезно, если еще таких привычек не приобрели, если в си пишете:
1. Сразу ставить (), {}, [ ], обе скобки.
Никогда не забудете, их потавить.
2. Использовать структуры.
3. Создавать свои типы данных.
4. Испоьзовать тип union.
5. Использовать указатели.
Эффективность и читаемость повысятся в разы.
SUPER!
Teperj nado perehoditj na BK kompjuteri! 🎉
A cto s SVO?
Gatov ktoto k mogilizaciji ili luche putlera v Gagskij tribunal pislatj i zitj dalshe mirno?🎉
В чем проблема программно исключить ошибки во входных данных? Если анализировать не только величину значений, а и разницу между ними, то легко заметить, что некоторые из них на порядок выше обычных.
О, сразу видно советского инженера! Все сигналы у него меняются медленно, поэтому их можно зафильтровать. Особенно температура. Поэтому когда я на своей Весте выезжаю зимой со стоянки торгового центра, то она показывает температуру +12 даже когда я уже оказался на улице, а до -15 она дойдёт хорошо если минут через пять.
А если вы делаете датчик натяжения троса для подъемного крана, у вас тоже сигнал меняется медленно? Ну, груз же просто висит, надо показать натяжение. Вот только если возникнет затяжка, то вы должны СРАЗУ ЖЕ показать превышение, чтобы автоматика СРАЗУ выключила двигатель. А если вы его зафильтруете, то трос оборвется когда показания будут ещё далеко от критических.
СМА можно написать и на 3-4 переменных, тогда вообще коэффициент фильтрации не ограничен. Короче от массива в 100,1000 и т.д. можно отказаться совсем.
Безусловно. Но не будет так наглядно =)
@@Gnevistj согласен, но куда не плюнь, если сколзящее среднее, в ПО то массивы, даже в пром. ПЛК не парятся. Поэтому и ограничены лимиты 32-128. Для выборками. Для давлений допустим в вентканалах с сумасшедшей турбулентностью, 32 выборки мало как у сименс например. Там 32, ещё и 100 сверху добавлять приходится.
Ну в в общем видео ваше и вам решать о чём рассказывать. Хорошее дело делаете! )
thx
Yt-1 надо объяснять для чайников, что это Y сохраненный на предыдущем цикле или предыдущем вызове подпрограммы.
Принимаю! Мои извинения, не всегда легко удержать нужный уровень детализации при рассказе =)
@@Gnevistj Я Вас тоже понимаю, сложно сценарий писать и всё в голове удержать. Если есть возможность запилите передачу про рекуррентные формулы, для чайников будет полезно, а то все боятся их как и математики. А по итогу страшный ПИД сводится к сложению и умножению! )
@@ЮрийСамофал-ю9ь , если речь идет именно про ПИД - то такие выпуски планируются; возможно успею еще в этом году =)))
@@Gnevistj ПИД просто как пример, рекуррентных формул(к примеру википедия). Сам в относительно не давно свой первый ПИД написал т.к. в любой среде они есть уже готовые. Но тут по бюджету захотели ПЛК EKF. Хотя работал до этого с Сименс и КодеСис совместимыми контроллерами. По итогу в среде разработки EKF, забыл сейчас аналоги(при чем продаются в РФ и даже дешевле), видимо кто-то списал тупо ПИД из гит-хмб, у Гайвера, по итогу ПИД если один, работает нормально, если два конфликтуют, т.к. переменные в функции static. Другой вопрос в FBD комменнтов даже нет, есть только в Lad и ограничения на входах функции три выхода и что-то в районе 10 входов, вход/выход туда же входят. Остальное всё переменные для внутренней памяти функции а их 32, с учётом входов и выходов. Короче весело! Плюс когда надо обрзначить маски в WORD, а у них есть только INT по итогу надо пересчитать число в Int со знаком короче весело! По этому то и написал, что готовить тех кому это интересно надо тупо к лютой жести! Мы же асушники! Плюс нашей профессии, много асушников ушло в IT и мы сможем скоро тупо как в Крёстном отце назначать свою цену. Сцена с котом! ) Если подкачал с грамматикой - это всё пивас! )
@@Gnevistj да и ПИД делал с мёртвой зоной, ограничениями входных и выходных значений.
На асме не програмирую.Усреднение всегда тормозит программу.
Да уж, цифровая фильтрация тема интересная и сложная. Как-то пытался сделать цифровой фильтр «по учепнику», всё по формулам преобразований (для аудиофайла в матлабе). Получил на выходе массив комплексных чисел. А как подать комплексный сигнал на ЦАП (ну или в данном случае записать в аудиофайл) нигде в «учепниках» не рассматривается🤣🤣🤣 Теория как-то отделена от практики😁 Нужен личный практический опыт, потом эти «учепники» уже переосмысляешь
Без практики никак, полностью согласен. Учебник всегда дает "базу", скелет эдакий, который во время работы обращиваешь "мяском" опыта =)))))
Пасиба Санычу! Коротко все, доступно.
[шутка]Аффтар пади пастрижысь, патлатый как тьолка лять[/шутка]
Нимагу пастричься - мну мотоциклист, мну по закону положено быть патлатым =))))))))))))
@@Gnevistj Поддерживаю. Рокерам и мотоциклистам положено. А если и тот и другой сразу - то 2 раза положено, даже на пиво скидку дают 😆
@@Gnevistj мой знакомый Кирилл говорит что он мацалтыклист (на мацалтыкале ездит)
Очень похоже на ПИД регулятор, которые есть в промышленности, и нет нужды лепить их на микроконтроллере.
А зачем для фильтрации аналоговых сигналов, опрессовщик металло-пластиковых фитингов???
В нормальном устройстве шумы и прочие непотребства отсекаются до входа АЦП.
да уж.. хотелось бы посмотреть что у него за пром устройства такие, которые он нормальными считает
Кажется Саныч больше практик чем теоретик ?😁
Когда увидел := - уже затошнило от флешбеков Паскаля со времён школы. А здесь этот Бейсик или не пойми что, в отличие от школовского Паскаля - ещё и отвратительно читается. Вы, батенька, мазохист? Чем обычные си не угодили? На коболе писать не пробовали? Наверное, вам понравится
Зато можно весело сражаться с отсутствием float))
Напомнил мне алгебру-чото не понял и дальше уже ничего не понятно .
Да ладно вам...
По первой же формуле, показанной альтер-эго автора канала, было понятно, о чём пойдёт речь 😁
p.s.: или я просто уделяю слишком много времени машинному обучению и статистике 🙄
Вот засрал мозг! Ставишь RC-фильтр и не жрёшь процессорное время!
ЦОС КИХ БИХ
Не-не-не, не путайте пожалуйста полноценную ЦОС и фильтрацию сигналов в автоматике - совершенно разные цели, подходы, и постоянные времени. Это близкие по функционалу только на первый взгляд области, и если я правильно помню теорию, то скользящие средние являются лишь упрощенной реализацией фильтра с КИХ =)))