НЧ фильтр с постоянной времени 0.001 c. Выборка 50кГц.
Из приведенной программы следует, что реализован IIR LPF первого порядка в узких кругах именуемый ЭКСПОНЕНЦИАЛЬНЫМ ФИЛЬТРОМ СГЛАЖИВАНИЯ имеющим простейшую математику вида: Uout [i+1]=(1-b)*Uout[i]+b*Uin[i+1], где b<1. Реализован коэффициент фильтра b=0,02. Из той же программы совершенно не следует, что частота выборок равна 50 кГц, как не следует и соответствие фильтра этой частоте.... Экспоненциальные фильтры обычно применяют не для фильтрации сигналов, а для сглаживания пульсаций. Это канешна тоже фильтрация, но самая примитивная. Странно ее реализовывать на АРМах. Такой фильтр на предложенной частоте дискретизации может переварить и восьмибитник... И уж тем более, для его расчета не требуется никакая программа.
КРАМ, это была проба пера, но я ценю Ваши комментарии. Прога Filter Solutions мне выдала готовый код на Си, но я с ним не разобрался. Алгоритм отрабатывал ручками в визуал бейсике. Если завтра сам не разберусь, то понадобится Ваша помощь. Если внимательно смотреть на выходной сигнал с ЦАПа, то видны некоторые дефекты, два пина PB3 и PB4 оказались нерабочими. То ли брак, то ли фаза на корпусе компа виновата. Обязательно заземляйте комп и другие сетевые приборы. Евростандарт обязывает ставить кондеры с фазы на корпус. Европейцы ружья кирпичом не чистят и имеют на вилках третий контакт заземления.
А если обладает, то почему бы ему пару книжек по цифровой обработке сигналов не осилить?
Eddy_Em, не осилит. У тебя на на лице учёная дотошность написана. Для тебя осиливать- профессиональная привычка. У поколения некст терпежа хватает на новостную заметку в один экран. Не суди людей, тем более молодых, по себе.
tonyk, если не осилит, то пусть сливается в канализацию! Тем паче, у нас нонче "капитализм", и слабые просто вымирают. Псевдоестественный отбор...
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Filter Solutions генерирует не совсем корректный код. Подправил, как сам понимаю и заработало. Там еще все типы float и пришлось переводить в целые для быстродействия. А раз нельзя тупо копировать, то буду еще переводить на бейсик.
Там еще все типы float и пришлось переводить в целые для быстродействия
Рекурсивные фильтры нельзя переводить в целые. Нужен либо флоат, либо фикспойнт. Иначе рекурсивный фильтр будет иметь порог в связи с умножением входного сигнала на коэффициент меньше 1. Вы плавно приходите к пониманию простого факта - DSP не для школьнегов. За внешней якобы простотой кроется фундаментальная теория. И без ее понимания ничего путного получить невозможно. Но у меня есть практический совет. Переходите на FIR. Он гораздо проще в реализации реальных фильтров с заданной АЧХ, а не эллиптического недофильтра. Форма АЧХ в FIR определяется оконной функцией. А кроме того, можно использовать штатные DSP инструкции процессора в очень простом исполнении.
КРАМ, мне реально нужен полосовой 4-го порядка до 1кГц с полосой 10-20Гц. Я пробовал FIR в Filter Solutions, мне не понравился. В целые должно перевестись до 4-го порядка точно. Целый час потратил, что бы расшифровать выражение [i<3?i:4-i]
НЕТ!!! Даже первый порядок - нет. Я объяснил почему. Только фикспойнт, как разновидность целого, но с фиксированной дробной частью. На FIR такой проблемы нет. Там разрядность аккумулятора решает все, а числа могут быть целые и без дробной части.
Вы плавно приходите к пониманию простого факта - DSP не для школьнегов. За внешней якобы простотой кроется фундаментальная теория. И без ее понимания ничего путного получить невозможно.
Вот как раз теорию читать и не хотят. Потому и не понимают нифига. Я двумя руками "за" то, о чём говорит КРАМ. Для осознания глубины непонимания вопроса, нарисуйте схему аналоговой части своего цифрового фильтра. Нарисуете с первого раза правильно- пишите номер телефона, а я перевожу на него деньги на пиво.
Я-то как раз в теме, а тот кто написал, что я не в теме, не понял сути моего вопроса. И подвоха. Н-да, разберитесь с теорией для начала. С такой базой лезть в эту область не стОит.
КРАМ, АЧХ кривобокая и в коде сотни коэффициентов.
Эти "сотни коэффициентов" являются той самой оконной функцией. Длина оконной функции равна длине буфера сигнала. Форма АЧХ определяется формой оконной функции. ФЧХ абсолютно линейна. Фильтр абсолютно устойчив. Код фильтра при использовании DSP инструкций РОВНО ТРИ ИНСТРУКЦИИ. То есть фильтр - это тупо сумма произведений отсчетов в буфере на значения оконной функции с одинаковыми индексами. Ну еще нормировка после этого. Что касается кривобокости, то полагаю, что Вы пытались задать некорректные условия реализации фильтра. БИХ при таких условиях просто возбуждается. Открыл онлайн расчет КИХ (FIR) и за одну минуту получил вот такую АЧХ: Стесняюсь спросить... А где тут "кривобокость? Параметры: Центральная частота 1кГц Частота дискретизации 10 кГц Полоса пропускания 100 Гц Подавление вне полосы -80дБ Неравномерность в полосе 1дБ. Итого 601 тапов фильтра. При системной частоте МК 100 МГц фильтр будет посчитан примерно за 6 мкс. При частоте дискретизации 10 кГц (период отсчетов 100 мкс) - более чем легкий режим. http://t-filter.engineerjs.com/
Вопрос был про антиалиасинг. Актуальный вопрос для полосового фильтра, патамушта имеет место быть противоречие с высокой частотой дискретизации - фильтр перестает быть реализуемым и потребуется два последовательных фильтра с децимацией между ними, тогда зеркальные частоты будут значительно отодвинуты от полосы пропускания фильтра и реализация антиалиасинга по входу АЦП будет простой. В предложенном выше фильтре для обеспечения подавления зеркальных частот на величину заграждения самого фильтра в антиалиасинге требования оказываются слишком высокими - примерно -35 дБ/окт. Но ситуация с БИХ будет примерно такой же.
По полосовым фильтрам 4-го порядка такой расклад выходит. На каждую выборку приходится десяток умножений Float. Было 20мкС, стало 25. Разогнал АЦП с 12 до 18 Мгц, работает стабильно, стало опять 20мкС. Выходит, что максимальная частота выборки 50кГц. Ее нужно задавать таймером. Повысить можно, если использовать stm32f401 c аппаратным Float и DMA c АЦП. Но в stm32f401 нет ни одного полного порта и придется ставить stm32f407 с внутренним ЦАП, а он дорогой, если на плате. Прога Filter Solutions выдает код на Си. Замучился переводить в микроБейсик и поставил себе микроСи. Почти тоже самое, легко освоился.
Мурик, Float вычисления тормозят. Пока мне 50кГц даже много, буду на 10-20кГц работать. Сам по себе STM32F407 не дорогой, но придется плату самому делать, зато ЦАП внутри. Моя утюжная технология пока не справляется, но будем пробовать улучшить.
По полосовым фильтрам 4-го порядка такой расклад выходит. На каждую выборку приходится десяток умножений Float. Было 20мкС, стало 25. Разогнал АЦП с 12 до 18 Мгц, работает стабильно, стало опять 20мкС.
Мыши кололись, плакали, но продолжали жрать кактус... Какой то фееричный набор несуразностей... Зачем нужно 18 МГц АЦП, если выборки 50 кГц? Впрочем, выборки 50 кГц так же ничем не обоснованы. Сигналы никак не определены от слова совсем. Зачем применять рекурсивные фильтры в МК с практически неограниченным объемом ОЗУ для таких задач? Просто чтобы получить геморрой с флоатами? Основная проблема с флоат без FPU не умножения, а сложения-вычитания, ибо требуется многократное приведение к нормативному виду и обратно.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения