Где посмотреть цифровой фильтр ФНЧ? (скетч и объяснения)
- Войдите на сайт для отправки комментариев
Собственно задача типовая :-( - есть аналоговый сигнал (потенциометр), считываемая с него напруга - шумновата. Полезный сигнал - низкочастотный. Получаю показания с delay 50мс (то есть, как я понимаю, это 20Гц) - вроде визуально по графикам в serialplotter кривая не такая "мохнатая" - но задницей чувствую что это не правильно. Чувствую что надо собирать больше информации а потом фильтровать. Вернее не "потом" - а сразу.
То есть повысить частоту сбора сигнала например до 200Гц , где-то хранить последние 10 отсчетов, а отфильтрованным сигналом считать среднее по этим 10 отсчетам.
Где пример посмотреть?
пс. насколько я понимаю - усредняющий фильтр есть суть ФНЧ, то бишь интегрирующее звено? (А ФВЧ - дифференцирующее звено?).
spy4ik, вам нужен оверсэмплинг пример
А если вот так?
Первая же ссылка - http://www.poprobot.ru/theory/low_pass_filter
А если вот так?
Первая же ссылка - http://www.poprobot.ru/theory/low_pass_filter
и что тут к чему?
То есть повысить частоту сбора сигнала например до 200Гц , где-то хранить последние 10 отсчетов, а отфильтрованным сигналом считать среднее по этим 10 отсчетам.
Да какой еще фильтр ...
Псевдокод, если что )))
Все правильно там по ссылке написано, только не оптимально, "ключница делала". Все что надо знать про ФНЧ начального уровня:
Для каждого введеного прогоняем и получаем отфильтрованое значение. Степень фильтрации определяется значением n.
Собственно это то что по ссылке если считать к=1/2^n. Следить за разрядностю чисел, чтоб исключить переполнение. Можно включать последовательно несколько фильтров, выход одного на вход другого, для усиления фильтрации. Можно включать паралельно два фильтра с разными значениями n и брать разницу с выходов, получим очень неплохой ФВЧ (скорей даже полосовой в области ВЧ).
Такой фильтр ФНЧ - штука оч полезная во многих случаях, например дребезг давить с цифроаого вход, даем на вход digitalRead(A)?100:0 и на выходе получаем состояние входа в процентах, т.е. постоянно low - на выходе 0, постоянно high на выходе -100, а дребезжит - процент high в общем числе вводов. Жаль только diakin как и 99% пишущих на форум ничерта о цифровых фильтрах не знают и знать не хотят.
Фильтры более высокого порядка я бы не советовал делать (если кто теории начитается :), нужен расчет коэффициентов, умножение на них, не для ардуино и не для любителей это.
Есть такая программа winfilter.
В ней выбираешь параметры цифрового фильтра и программа генерит код, который можно напрямую вставить в скетч. )
Например
Все автогенераторы кода страдают одним недостатком, код херовый генерят )))
Здесь городить что-то более сложное, чем вычисление среднего не требуется.
В противном случае ТС должен ставить задачу по полной программе - полоса пропускания, крутизна спада фильтра и т.д.
Здесь даже лучше не среднее, а медиана.
Здесь городить что-то более сложное, чем вычисление среднего не требуется.
В противном случае ТС должен ставить задачу по полной программе - полоса пропускания, крутизна спада фильтра и т.д.
С какого будуна именно так? Аргументируйте шоле.
Обе реализации приведены выше, чем среднее предпочтительней? Чем фильтр сложней?
Здесь даже лучше не среднее, а медиана.
Оба хуже фильтра, т.к. если считать их по очередным N-значениям, как в #4, то результат будет нестабильным из за несинхронности изменения сигнала и моментов завершения выборки N элементов. И частота этой нестабильности будет равна разности частот. В общем мрак. Если считать по скользящей выборке (последние N ) то этого можна избежать но потребуется циклический буфер. К медиане это тоже относится.
Оба хуже фильтра, т.к. если считать их по очередным N-значениям, как в #4, то результат будет нестабильным из за несинхронности изменения сигнала и моментов завершения выборки N элементов. И частота этой нестабильности будет равна разности частот. В общем мрак. Если считать по скользящей выборке (последние N ) то этого можна избежать но потребуется циклический буфер. К медиане это тоже относится.
Сколько интересных выводов оказывается можно сделать, даже ничего не зная о параметрах сигнала ;-)
Разумеется. Обсуждаются ведть алгоритмы. Вас сравнение алгоритмов сортировки просто изумит ;-) Там даже во сколько тот или иной быстрей определяется совершенно без сортируемых значений.
Поясните, с чего следует Ваше утверждение " ТС должен ставить задачу по полной программе - полоса пропускания, крутизна спада фильтра и т.д."
http://www.youtube.com/watch?v=CPpOJsHuMsM
http://www.norwegiancreations.com/2016/03/arduino-tutorial-simple-high-p...
ага. в матлабе оно легко считается. но не стоит и вот почему. В случае ТС на вход прийдется задавать данные если и не отфонарные, то плюсминус лапоть. Т.е. за точностю коэффициентов гнатся нет смысла и проще выбрать из ряда 1/2^n чего подходящего, тогда второй коэффициент будет 1-1/2^n, и умножение с плавающей точкой превращается в сдвиги в фиксированой, что очень гуд для скорости. А если фильтрует слабо - увеличим n, если сильно - уменьшим. Все просто.
Полезный сигнал - низкочастотный. Получаю показания с delay 50мс (то есть, как я понимаю, это 20Гц) - вроде визуально по графикам в serialplotter кривая не такая "мохнатая" - но задницей чувствую что это не правильно.
Низкочастотный сигнал - это какой?
Поскольку частота дискретизации 20Гц ТС устраивает, то можно сделать вывод, что ширина спектра сигнала 10Гц. Теоретически. То есть все, что выше надо фильтровать. А практически верхняя частота еще ниже, пусть будет 5 Гц. С учетом крутизны спада антиалиасингового фильтра.
И что за потенциометр? Крутят ручку и выставляют уровень.. постоянного напряжения? Или чего?
Какой уровень сигнала подается на вход АЦП?
Откуда берутся шумы? Это наводка 50Гц или что-то еще?
если считать их по очередным N-значениям, как в #4, то результат будет нестабильным из за несинхронности изменения сигнала и моментов завершения выборки N элементов. И частота этой нестабильности будет равна разности частот. ...
Что это за несинхронность? Что имеется в виду?
//Что это за несинхронность? Что имеется в виду?
Моменты когда завершения подсчета выборки, в примере #4 когда после 10 отсчетов закончится цикл. Частота таких событий оказывается ниже (в примере в 10 раз) частоты ввода (т.е. частоты дискретизации в примере) . И соответственно оказывается в области входного сигнала. Вот с ним она не синхронизирована (что в общем очевидно) и близка по частоте. Отсюда нестабильность - при одинаковой форме сигнала на входе на выходе различная. В аналоговой технике это биением частот называют.
///Поскольку частота дискретизации 20Гц ТС устраивает, то можно сделать вывод, что ширина спектра сигнала 10Гц. Теоретически.
Теоретик без теории.. Учите матчасть в цифровых фильтрах частоты меряют в долях от частоты дискретизации.
Как регулировать фильтрацию я писал выше, одним параметром подбирается если расчитывать влом.
// крутизны спада антиалиасингового фильтра.То есть все, что выше надо фильтровать. А практически верхняя частота еще ниже, пусть будет 5 Гц. С учетом крутизны спада антиалиасингового фильтра.
Вы бредите? Там потанциометр на входе, какие 5Гц? Какой "спада антиалиасингового фильтра" у АЦП ардуино на 20Гц?
Logik, включите логику. Причем тут частота АЦП ардуино? Если частота отсчетов 20Гц, причем тут скорость АЦП?
Наверно Вы гдето в другом месте читаете, а пишете сюда. Жмем ctrl+f, поиск "частота АЦП ардуино" присутствует в теме один раз в #19 в Вашем же вопросе. Аналогично "скорость АЦП" - Вы первый кто её упомянули и спрашиваете "причем?". Весело.
Теперь отвечу на ваши вопросы.
///Причем тут частота АЦП ардуино? Если частота отсчетов 20Гц, причем тут скорость АЦП?
Совершенно нипричем, Вы высосали это с хера (или с потолка или с другой темы или из истории своей болезни, откуда точно не знаю) До этого в теме вопросы "частота АЦП ардуино" и "скорость АЦП" не обсуждались и к цифровомы фильтру непосредственно не имеют отношения.
Надеюсь ответом удовлетворены.
Думаю Вы уже проспались и теперь сможете внятно отвечать. Повторю вопрос.
/////// крутизны спада антиалиасингового фильтра.То есть все, что выше надо фильтровать. А практически верхняя частота еще ниже, пусть будет 5 Гц. С учетом крутизны спада антиалиасингового фильтра.
1. какие 5Гц? (На каком основании Вы так решили, а может 0,5Гц и все что выше - уже помеха, для её подавления и нужен ФНЧ. Он легко регулируема, как я писал выше. Зачем эта пустопорожнее допущение о 5 Гц? Использующий сам отрегулирует как ему нужно будет.)
2.Какой "спада антиалиасингового фильтра" у АЦП ардуино на 20Гц? ( Вы понимаете хороше о чем пишете, чему ж равна крутизна спада антиалиасингового фильтра в данном случае? Он, фильтр антиалиасинга, там есть вобще у автора темы? А он там нужен?)
ПС. Вы вероятно считаете себя сенсеем интернет-срача раз позволяете себе игнорировать вопросы собеседника и отвечать бредятиной. Здесь таких много было, они были посланы, и пошли, кроме тех, кто вовремя одумался.
1. какие 5Гц? (На каком основании Вы так решили, а может 0,5Гц)
Может и 0.5. Но не выше 10Гц. ТС о сигнале ничего не говорил. О чем и я писал с самого начала.
2. Какой "спада антиалиасингового фильтра" у АЦП ардуино на 20Гц?
Logik, если частота дискретизации 20 Гц, антиалиасинговый фильтр "у АЦП ардуино" не нужен?
//Что это за несинхронность? Что имеется в виду?
>Моменты когда завершения подсчета выборки, в примере #4 когда после 10 отсчетов закончится цикл. Частота таких событий оказывается >ниже (в примере в 10 раз) частоты ввода (т.е. частоты дискретизации в примере) . И соответственно оказывается в области входного >сигнала. Вот с ним она не синхронизирована (что в общем очевидно) и близка по частоте. Отсюда нестабильность - при одинаковой >форме сигнала на входе на выходе различная. В аналоговой технике это биением частот называют.
Кто с кем бьет-то? "близка по частоте" к кому\чему?
ps. Воздержитесь от срача plz, сосредоточтесь на технической стороне вопроса.
1. какие 5Гц? (На каком основании Вы так решили, а может 0,5Гц)
Может и 0.5. Но не выше 10Гц. ТС о сигнале ничего не говорил. О чем и я писал с самого начала.
Ну и нече фантазировать и предполагать вещи не влияющие.
2. Какой "спада антиалиасингового фильтра" у АЦП ардуино на 20Гц?
Logik, если частота дискретизации 20 Гц, антиалиасинговый фильтр "у АЦП ардуино" не нужен?
Вижу вас хватило ровно на один вопрос. Скажите, Вы еврей? Постоянно отвечать вопросом на вопрос в их привычке.
Очевидное решение - Ваши вопросы я тоже начинаю игнорировать.
Почему на входе АЦП должен стоять антиалиасинговый фильтр.
Если будем брать отсчеты с меньшей частотой, чем требуется по теореме Котельникова, то в этом случае возникает эффект "алиасинга" (он же стробоскопический эффект, муаровый эффект), при котором сигнал высокой частоты после оцифровки превращается в сигнал низкой частоты, которого на самом деле не существует. На рис. красная синусоида высокой частоты - это реальный сигнал. Синяя синусоида более низкой частоты - фиктивный сигнал, возникающий вследствие того, за время взятия отсчета успевает пройти больше, чем пол-периода высокочастотного сигнала.
Для частоты дискретизации 20Гц это может быть тем более существенно, поскольку сетевая наводка 50 Гц может быть перенесена в низкочастотную облать. Чтобы избежать эффекта алиасинга перед АЦП ставят специальный антиалиасинговый фильтр - ФНЧ (фильтр нижних частот), который пропускает частоты ниже половины частоты дискретизации АЦП, а более высокие частоты "зарезает".
То есть схема должна быть примерно такой.
Это простая RC цепочка, параметры которой можно посчитать например здесь http://vt-tech.eu/articles/calculators/165-simple-rl-filters.html
Но нужно понимать,что при перемещении движка потенциометра, эквивалентное R будет меняться от 0.5*R1+R2 до R2, поэтому частота среза тоже будет меняться. Например при R2= 5кОм частота среза будет меняться от 0.3 до 3 Гц.
По хорошему R1 надо брать более низкоомный чем R2. Но сильно уменьшать R1 нельзя, чтобы не увеличивать ток потребления, а сильно увеличивать R2 нельзя, чтобы не начало сказываться входное сопротивление аналогового входа.
Возможно фильтр на входе решит и проблему шумов и доп. программная обработка не потребуется.
Не знаю, что тут такое заумное обсуждается, мне всегда хватало "бегущего среднего" с ослаблением накопления по степеням двойки. Имеем постоянно усредненное значение на 3,7,15 выборках и этого как правило хватало. Чем бегущее среднее не устраивает?
Бегущее среднее - это только часть.
Обсуждение идет вокруг того, что нужно кроме бегущего среднего либо независимо от него.
Чего же часть. Бегущее среднее просто ненадо если есть цифровая фильтрация. Его недостаток на картинке
Красным обведено амплитудное значение. ФНЧ (зеленый) выдает его стабильным каждый раз а среднее (синий) пляшет от раза к разу. Если последующий алгоритм будет искать амплитуду то это скажется. Если определять период как время между двумя максимумами - сильно скажется, если дифференциировать - скажется безобразно.
ФНЧ здесь n=3 (т.е. 2^n=8) и среднее по 8 точкам. Сигнал дискретизирован около 64 точек на период. Видно что ФНЧ начал чутьчуть уже подрезать сигнал.
Очевидно что фильтрованое значение вцелом лучше передает форму входного сигнала.
На третей волне добавил помеху чтоб было видно реакции на неё.
То, что Вы нарисовали синим - не есть "бегущее среднее". Бегущее среднее - усредняет заданное количество последних замеров, а не "пачками".
Простое скользящее среднее, или арифметическое скользящее среднее (англ. simple moving average, англ. SMA) численно равно среднему арифметическому значений исходной функции за установленный период. Полученное значение простой скользящей средней относится к середине выбранного интервала[1], однако, традиционно его относят к последней точке интервала[2].
(с) Wiki
Когда обработка идет в реальном времени, то среднее можно вычислить только когда будет известна последняя точка интервала, т.е. с задержкой. Поэтому его относят к последней точке интервала.
Если идет постобработка, то значние среднего относят к середине интервала.
Скользящее среднее определено в каждой точке ( для каждого отсчета), за исключением отрезков по краям выборки.
//То, что Вы нарисовали синим - не есть "бегущее среднее". Бегущее среднее - усредняет заданное количество последних замеров, а не "пачками".
Так то вобще безнадежно. Там массив нужен для хранения последних замеров. И циклический. Забудте. Я в #11 писал о двух подходах к "среднему" уже. Хотя ха-ки у него конечно на уровне, а вот потребные ресурсы - нет. На таких ресурсах фильтр высокого порядка уже делают, он по хар-кам для других методов недостижим, крутизна спада АЧХ у него бешеная будет и режекция на потенциальную помеху, к примеру 50Гц можно добавить. Мало того, такой среднее по сути цифровой ФНЧ (только с КИХ) и коэффициентами 1/число элементов )) Так что коэффициентики подправить да умножение на них добавить, а не результат сразу умножать на один общий. Но это уже не для ардуино и любительства. Ладно еще среднее по 4-8 элементов можна делать средним скользящим, хоть всеравно неясно зачем, если ФНЧ с посути такойже харк-кой проще быстрей и памяти меьше жрет. А если полоса узкая усреднять шоле за 1024 элемента. Где память брать?
Там массив нужен для хранения последних замеров.
Хранить одну сумму элементов разве не достаточно?
А это Вы с Arhat109-2 обсудите )) Какой из подходов кто из вас под "средним" понимает и для кого чего достаточно )) См.#11
Добавлю желтеньким скользящий, чтоб без претензий. Масштаб увеличил.
Ну вот, это уже похоже. Осталось определиться с глубиной усреднения и дело в шляпе. Да, и никакой массив там не нужен. Скользящее среднее вычисляется как текущая сумма "набегающим итогом" .. что-то типа S = (S*K1 + X*K2)/K3, где S- новое и предыдущее среднее, K1,K2,K3 -- весовые к-ты "глубины усреднения". Чему они должны быть равны можете вывести самостоятельно, посчитав и разложив скажем среднее из 3-х последних замеров. Для больших усреднений - аналогично. :)
То есть повысить частоту сбора сигнала например до 200Гц , где-то хранить последние 10 отсчетов, а отфильтрованным сигналом считать среднее по этим 10 отсчетам.
Да какой еще фильтр ...
Псевдокод, если что )))
да. обычный компилятор изыка ардуины ругается. где взять компилятор для этоговашего псевдокода?
Псевдокод, если что )))
да. обычный компилятор изыка ардуины ругается. где взять компилятор для этоговашего псевдокода?
Это просто образец.
Надо взять и переписать самому по правилам синтаксиса С для ардуино ))
Ну вот, это уже похоже. Осталось определиться с глубиной усреднения и дело в шляпе. Да, и никакой массив там не нужен. Скользящее среднее вычисляется как текущая сумма "набегающим итогом" .. что-то типа S = (S*K1 + X*K2)/K3, где S- новое и предыдущее среднее, K1,K2,K3 -- весовые к-ты "глубины усреднения". Чему они должны быть равны можете вывести самостоятельно, посчитав и разложив скажем среднее из 3-х последних замеров. Для больших усреднений - аналогично. :)
И где здесь заявленое Вами ранее "Имеем постоянно усредненное значение на 3,7,15 выборках"?
мне всегда хватало "бегущего среднего" с ослаблением накопления по степеням двойки. Имеем постоянно усредненное значение на 3,7,15 выборках и этого как правило хватало.
Не вижу "значение на 3,7,15 выборках" Вижу мутирующую в сторону цифрового фильтра точку зрения)). Коэфициентов даже в Вашей формуле не 3 а два, если считать что P1=K1/K3 а P2=K2/K3 то S = (S*K1 + X*K2)/K3= S*P1 + X*P2 а если еще подумать то коэффициент один, т.к. коэффициент передачи должен быть равен 1 в зоне пропускания то P1+P2=1 и P1=1-P2 значить S = (S*K1 + X*K2)/K3= S*P1 + X*P2=S*(1-P2)+X*P2. дальше чтоб не путать S в левой и правой части вводим индексы Si+1=Si-Si*P2+X*P2 и делим обе части на P2 Si+1/P2=Si/P2+X-Si теперь обозначим Fi=Si/P2 Тогда Fi+1=Fi+X-Fi*P2 Осталось выбрать удобный P2=1/(2^n); получим Fi+1=Fi+X-Fi/(2^n) или по сишному F+=X-F>>n. См. стр 7 в #5
Велосипед изобретен )).