Цифровые рекурсивные фильтры. Часть 4.

Специально для тех, кому были интересны, но малопонятны предыдущие статьи, приведу довольно актуальный пример цифрового рекурсивного режекторного фильтра 50 Гц.
Ни матриц, ни Матана, ни ТФКП в этой статье вы, к сожалению, не увидите :-)

Рассмотрим еще один тип фильтров: всепропускающие. Всепропускающий фильтр имеет коэффициент передачи К=1 на всех частотах, но фаза входного сигнала изменяется фильтром в зависимости от частоты. На основе всепропускающего фильтра легко построить режекторный фильтр, «вырезающий» из сигнала определённую частоту. Достаточно повернуть фазу сигнала на этой частоте на 180 градусов и суммировать с исходным сигналом.
Теория хорошо расписана здесь.
Построим цифровой рекурсивный режекторный фильтр на 50 Гц.
Передаточная характеристика режекторного фильтра 2-го порядка имеет вид:

Параметр

определяет частоту режекции Fr. FN — частота Найквиста, равная половине частоты дискретизации.
Параметр

определяет крутизну склонов фильтра. Чем этот параметр ближе к 1, тем склоны «круче». Но перебарщивать не стоит, т.к. фильтр может стать неустойчивым.
Итак, приступаем к построению режекторного фильтра на 50 Гц.
Пусть частота дискретизации равна 2000 Гц (соответственно — частота Найквиста FN=1000 Гц)

Выберем значение

Окончательно:

Рекуррентная формула фильтра:

Y[n]=1.439X[n]-1.915127X[n-1]+1.439X[n-2]+1.195127Y[n-1]-0.939Y[n-2]
где X[n] — входные выборки, Y[n] — выборки отфильтрованного сигнала.

Часто при реализации цифровых фильтров в микроконтроллерах крайне желательно иметь в рекуррентной формуле целые коэффициенты. При реализации режекторного фильтра это условие легко выполнить, если имеется возможность выбора частоты дискретизации. То что один из параметров выбирается почти произвольно — значительно облегчает задачу.
Приведу пример целочисленного рекурсивного режекторного фильтра 50 Гц. Частота дискретизации 2048 Гц:

Рекуррентная формула такого фильтра:

Y[n]=1/256(255X[n]-504X[n-1]+255X[n-2]+504Y[n-1]-254Y[n-2])

Практическая реализация режекторного фильтра 50 Гц на ATMega16.
Автор: trofim2
Параметры: частота дискретизации 3500Гц
Ознакомиться с текстом программы на ассемблере можно здесь.
  • +5
  • 01 октября 2015, 12:42
  • Santik

Комментарии (31)

RSS свернуть / развернуть
Все это можно надергать из интернета, и примеры и формулы. Где хотя бы попытка реализации?
0
А раздел называется «Теория, измерения и расчёты». Так что фигВам не будет никаких реализаций! Это вам не «Алгоритмы и программные решения»! (Из которого меня DIHALT сюда сослал. Чувствую себя здесь, как жена декабриста… :-)
+3
Так то рекомендации, а не закон.
0
Выберем значение k2 = 0.939
А чем определяется такой выбор?
0
  • avatar
  • Vga
  • 01 октября 2015, 17:01
В данном случае — «взял с потока» :-) (точнее из статьи на dsplib.ru) Там АЧХ для этого значения приведена. Если требуется получить целочисленные коэффициенты этот параметр я рекомендую выбирать из ряда ...511/512, 255/256, 127/128 и т.д.
0
C продолжением!
-1
Да скорее — с завершением! Может действительно в «Алгоритмы и программные решения» вернуться с реализациями в «железе»? Хотя актуальных практических задач у меня нет.
0
конечно стоит.
0
С другой стороны — тема фильтрации достаточно «разжёвана» в многочисленных апноутах.
Пример для AVR здесь. Для STM-32 здесь и здесь
0
тема метеостанций тоже более чем раскрыта, однако это не мешает публиковать статью о сборке очередной вундервафли на ардуйне. так что ваша статья однозначно не навлечет минусов в карму ;)
0
Предлагаете ещё одну статью на тему метеостанций написать? :-)
Какая может быть серьёзная фильтрация на ATmegaх??? Только интегрирование на 20 мс хорошо помогает :-)
0
во-первых, про мегу это не я написал ;)
во-вторых, ни в коем случае не метеостанцию xD
0
да банально фильтр низа/верха, режектор и полосовой в виде кода показать. многие будут благодарны.
0
О000...! А вот с этого момента можно по-подробнее? Возможно я не все проблемы микроконтроллерщиков хорошо понимаю.
Итак: проблем расчёта коэффициентов фильтров ФНЧ, ФВЧ, режектора и полосового нет никаких. Куча программ, в том числе online, которые не только рассчитают коэффициенты фильтра по заданным параметрам, но и распечатают рекуррентную формулу на Си. Я в своих статьях привёл программу, позволяющую коэффициенты фильтров непосредственно в микроконтроллере рассчитывать.
Так что, основная проблема — как организовать расчёт рекуррентной формулы в том или ином типе микроконтроллера?
0
Очень хотелось бы почитать такой цикл статей:
1) берём какую-либо конкретную задачу, например ЭЭГ и фильтрацию от 50/100 (60/120) герц. 8 каналов, ацп, к примеру, от МК.
2) Пробуем применить в тупую разные онлайн калькуляторы. Заливаем их в AVR/STM32
3) Смотрим получившийся сэмплрейт. Плачем. Переписываем их на fixed point с float. Играем с оптимизацией под конкретный камень.
4) Для примера того, как это делают большие дяди, приводим пример того же фильтра на ПЛИС.

Я бы с удовольствием сделал такой цикл статей, да не хватает ни понимания математики фильтров, ни литературного таланта. Зато могу взять на себя задачи по программированию и обмерке всего, от скорости, до энергоэффективности.
+3
Ну ЭЭГ на STM32 это как-то несерьезно. Контроллеру останется время еще выспаться. В семействах STM32F3, STM32F4 есть ассемблерная команда «умножение с накоплением в формате с плавающей запятой» VLMA.F32 — выполняется три такта. Т.е. за три такта считается один отвод фильтра.
0
Но как я понимаю там же не один канал?
0
Даже если их там 32 :-) Хотя, повесить 32 внешних дельта-сигма АЦП на STMку — еще та задачка :-) вполне по зубам, но интересно
0
А можно примеры этих самых программ, например, для расчета интерполирующих КИХ-фильтров? Кроме матлаба и октавы. Как чуть посложнее копнешь, «куда чо девается»…
0
А можно примеры этих самых программ, например, для расчета интерполирующих КИХ-фильтров?
Ну я имел ввиду ФНЧ, ФВЧ, полосовой и режекторный. Фильтр Гильберта даже есть в Матлабе, только толку с него не много :-)
0
Зато в SDRе это нужнейшая вещь для формирования однополосного сигнала (SSB)
0
Неужто пытался по этим коэффициентам фильтр построить??? :-)
Или это чисто теоретические знания?
0
Хобби такое :-) нет, не теория, практика. Для алгоритма фильтра разницы нет какие там коэффициенты, я их вгружаю из матлаба.
0
Ну не знаю, из матлаба брать — получается, что не одну тысячу коэффициентов брать (КИХ), чтобы более-менее приличный фильтр получить.
Вот здесь вполне приличный фильтр описан. Но я не пробовал.
0
На самом деле интерполирующий КИХ-фильтр — это обычный ФНЧ, не более того.
Одно требование — хорошее подавление вне полосы и крутые склоны. Фильтры Чебышева 2 рода или Кауэра наиболее пригодны для построения интерполирующего фильтра. Технология простая — во входной сигнал после каждого отсчета добавляется определённое количество нулей. Затем полученный сигнал проходит через ФНЧ высокого порядка. И всё… :-)
Конечно, при этом количество вычислений заметно возрастает (по сравнению с обычной фильтрацией).
0
qedesign 2000
0
Чет он не гуглится. Сплошь дохлые ссылки.
0
temp213.gorodok.net/qed.zip
+2
А можно в текст статьи вставить ссылочки на предыдущие 3 части?
0
Ссылка есть на Часть 1, в которой есть ссылки на все остальные части.
0
Практическая реализация фильтра, разработанная trofim2, выложена здесь.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.