Цифровой фильтр высоких частот

Цифровой фильтр — в электронике любой фильтр, обрабатывающий цифровой сигнал с целью выделения и/или подавления определённых частот этого сигнала. В отличие от цифрового, аналоговый фильтр имеет дело с аналоговым сигналом, его свойства недискретны, соответственно передаточная функция зависит от внутренних свойств составляющих его элементов.

Содержание

Применения [ править | править код ]

Цифровые фильтры на сегодняшний день применяются практически везде, где требуется обработка сигналов, в частности в спектральном анализе, обработке изображений, обработке видео, обработке речи и звука и многих других приложениях.

Характеристики цифровых фильтров [ править | править код ]

Несмотря на то, что цифровые фильтры могут быть нелинейными и нестационарными, наибольшее распространение получили линейные стационарные фильтры в силу простоты их поведения и математического описания. Линейность фильтра подразумевает, что если подать на вход арифметическую сумму отсчётов некоторых сигналов, то на выходе фильтра будет арифметическая сумма откликов фильтра на эти сигналы. Основными характеристиками стационарных линейных дискретных фильтров являются следующие:

· комплексная частотная характеристика;

· амплитудно-частотная и фазочастотная характеристики;

· системная функция (передаточная функция) . Импульсной характеристикой дискретного фильтра называется его реакция на единичный импульс при нулевых начальных условиях: Линейный стационарный цифровой фильтр характеризуется передаточной функцией. Передаточная функция может описать, как фильтр будет реагировать на входной сигнал. Таким образом, проектирование фильтра состоит из постановки задачи (например, фильтр восьмого порядка, фильтр нижних частот с конкретной частотой среза), а затем производится расчет передаточной функции, которая определяет характеристики фильтра.

H ( z ) = B ( z ) A ( z ) = b 0 + b 1 z − 1 + b 2 z − 2 + ⋯ + b N z − N 1 + a 1 z − 1 + a 2 z − 2 + ⋯ + a M z − M =+b_<1>z^<-1>+b_<2>z^<-2>+cdots +b_z^<-N>><1+a_<1>z^<-1>+a_<2>z^<-2>+cdots +a_z^<-M>>>> где порядок фильтра — большее N или M.

В данном случае это формула БИХ-фильтра. Если знаменатель равен единице, то получаем формулу КИХ-фильтра (без обратной связи).

Преимущества и недостатки [ править | править код ]

Преимущества [ править | править код ]

Преимуществами цифровых фильтров перед аналоговыми являются:

  • Высокая точность (точность аналоговых фильтров ограничена допусками на элементы).
  • Стабильность (в отличие от аналогового фильтра передаточная функция не зависит от дрейфа характеристик элементов).
  • Гибкость настройки, лёгкость изменения.
  • Компактность — аналоговый фильтр на очень низкую частоту (доли герца, например) потребовал бы чрезвычайно громоздких конденсаторов или индуктивностей.

Недостатки [ править | править код ]

Недостатками цифровых фильтров по сравнению с аналоговыми являются:

  • Трудность работы с высокочастотными сигналами. Полоса частот ограничена частотой Найквиста, равной половине частоты дискретизации сигнала. Поэтому для высокочастотных сигналов применяют аналоговые фильтры, либо, если на высоких частотах нет полезного сигнала, сначала подавляют высокочастотные составляющие с помощью аналогового фильтра нижних частот, затем обрабатывают сигнал цифровым фильтром.
  • Трудность работы в реальном времени — вычисления должны быть завершены в течение периода дискретизации.
  • Для большой точности и высокой скорости обработки сигналов требуется не только мощный процессор, но и дополнительное, возможно дорогостоящее, аппаратное обеспечение в виде высокоточных и быстрых ЦАП и АЦП.

Виды цифровых фильтров [ править | править код ]

КИХ-фильтры [ править | править код ]

Фильтр с конечной импульсной характеристикой (нерекурсивный фильтр, КИХ-фильтр) — один из видов электронных фильтров, характерной особенностью которого является ограниченность по времени его импульсной характеристики (с какого-то момента времени она становится точно равной нулю). Знаменатель передаточной функции такого фильтра — некая константа.

БИХ-фильтры [ править | править код ]

Фильтр с бесконечной импульсной характеристикой (рекурсивный фильтр, БИХ-фильтр) — электронный фильтр, использующий один или более своих выходов в качестве входа, то есть образует обратную связь.Основным свойством таких фильтров является то, что их импульсная переходная характеристика имеет бесконечную длину во временной области, а передаточная функция имеет дробно-рациональный вид. Такие фильтры могут быть как аналоговыми так и цифровыми.

Способы реализации цифровых фильтров [ править | править код ]

Различают два вида реализации цифрового фильтра: аппаратный и программный. Аппаратные цифровые фильтры реализуются на элементах интегральных схем, ПЛИС, тогда как программные реализуются с помощью программ, выполняемых процессором или микроконтроллером. Преимуществом программных перед аппаратным является лёгкость воплощения, а также настройки и изменений, а также то, что в себестоимость такого фильтра входит только труд программиста. Недостаток — низкая скорость, зависящая от быстродействия процессора, а также трудная реализуемость цифровых фильтров высокого порядка.

по дисциплине: Основы проектирования цифровых устройств на ПЛИС

Студент Горюнов Д.Ю.

Рязанский государственный радиотехнический университет

В данном курсовой работе я(?!) буду разрабатывать и моделировать цифровой фильтр высокой частоты (БИХ). Характеристики этого фильтра указаны в выданном преподавателем задании.

Фильтр будет выполнен на основе программируемой логической интегральной схемы EPF10K20RC240-4 из семейства FLEX10K фирмы Altera с помощью специальных программ MAX+plus II 10.2 BASELINE и MATLAB 6.5.

ПЛИС семейств FLEX10K – самая популярная элементная база для реализации алгоритмов ЦОС. Их часто используют так, как они имеют большую логическую емкость, удобную архитектуру с встроенными блоками памяти(EAB, Embedded Array Block), высокую надежность и приемлемую цену, относительно других ПЛИС. Этого достаточно для решения проблем, возникающих у разработчиков.

Анализ, формализация и декомпозиция задачи

В данной работе я(?!) буду проектировать цифрой фильтр с бесконечной импульсной характеристикой третьего порядка.

Запишем линейное разностное уравнение для БИХ-фильтра:

Преобразуем данное уравнение и получаем три формы реализации БИХ-фильтра:

1)Прямая форма 1

2)Прямая форма 2

3)Транспонированная прямая форма 2

Для фильтра порядка М=3 получим:

Проанализировав формы реализаций фильтров, прихожу к выводу, что нужно использовать транспонированную прямую форму 2,так как имеет встроенный конвейер и наименьшее количество сумматоров(?!). Данную форму можно представить в виде трех блоков, которые мы в последствии и будем использовать при программировании:

Рис.4 Блок Mult_a

Рис.5 Блок Mult_b Рис.6 Блок Mult_c

Программировать будем ПЛИС фирмы Altera FLEX10K20RC240-4.Укажем характеристики этой схемы:

Логическая емкость 20000
Число логических элементов 1152
Число логических блоков 144
Память (бит) 12288
Используемые выводы 189
Число строк 6
Каналов в строке 144
Число столбцов 24
Каналов в столбце 24

В задании были получены коэффициенты фильтра. Но они дробные и поэтому MAX+plus с ними работать не может. Необходимо их перевести в целые числа. Это производится с помощью масштабирования. Масштабирование коэффициентов производится путем умножения заданных коэффициентов ai на 2m и bi на 2n. Выбираем n и m так, чтобы выполнялись условия технического задания(отклонение АЧХ в полосе пропускания и затухание АЧХ в полосе непропускания). С учетом этого выберем m=n=6.

Используем MATLAB и получаем характеристики фильтра при различных округлениях:

-с отбрасыванием дробной части (fix);

-с округлением до ближайшего целого (round);

-с округлением до ближайшего меньшего целого (floor);

-с округлением до ближайшего большего целого (ceil);

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

(Отклонение АЧХ в полосе пропускания: не более ± 0,6 дБ

Затухание АЧХ в полосе непропускания: не менее 29 дБ)

(Определите реальные величины отклонений!!)

Рис.10 Импульсная характеристика фильтра

Рис.11 Переходная характеристика фильтра

Рис.12 ФЧХ фильтра

Рис.13 Карта нулей и полюсов фильтра

Данный фильтр является устойчивый, так как все полюса находятся внутри единичной окружности.

Выпишем округленные и отмасштабированные коэффициенты:

Округлённые коэффициенты в

(Все коэффициенты отрицательные??)

Выпишем значения импульсной и переходной характеристик:

b1 0.126464868216455 8 1000
b2 -0.211575649599258 -14 10010
b3 0.211575649599257 14 1110
b4 -0.126464868216455 -8 11000
a1 1.000000000000000 -64 1000000
a2 0.927241545063816 -59 1000101
a3 0.888040485768699 -57 1000111
a4 0.284717905073458 -18 1101110
g(t) h(t)
0,125 0.125
1 -0,334 -0,209
2 0,415 0,206
3 -0,244 -0,0401
4 -0,0488 -0,0882
5 0,148 0.0588
6 -0,0236 0,0354
7 -0,0957 -0,0595
8 0,0678 0,00865
9 0,0302 0,0354
10 -0,0607 -0,0235

Разработка и обоснование структурной схемы устройства

Фильтр-это основной блок для реализации технического задания.

Для работы фильтр использует дополнительный код. По техническому заданию на входе имеем 8-разрядный параллельный прямой код. Поэтому перед фильтром целесообразно поставить преобразователь прямого кода в дополнительный код.

Так как данные на вход фильтра поступают с различными задержками, для безошибочной работы требуется поставить 8-разрядный параллельный регистр. Также регистры нужны для снижения логической нагрузки на логические элементы, вследствие чего освобождаются ресурсы ПЛИС для выполнения других функций. Так как фильтр тоже задерживает сигнал, то на выходе так же поставим параллельный регистр (разрядность определяется техническим заданием, т.е выходной параллельный регистр будет 16-разрядным).

Семисегментные индикаторы(их два) позволяют контролировать работу ПЛИС. Они указывают младшие разряды выходного сигнала в удобной для пользователя форме. Антидребезговая система убирает дребезг в кнопке управления ПЛИС.

Краткое описание блоков структурной схемы :

1. btn – антидребезговая схема и преобразователь асинхронного сигнала в синхронный.

2. reg_in и reg_out –параллельные параметризированные регистры

3. preobr_cod – преобразователь кода , предназначен для преобразования входного прямого кода в дополнительный код;

4. filter_gor – основной блок преобразования

6. l7segment и h7segment – семисегментные индикаторы(?!), необходимы для проверки работы устройства.

Рис.14 Структурная схема устройства

Составление и описание принципиальной схемы устройства.

Разработка и отладка программы на языке AHDL

Для конфигурирования ПЛИС семейства FLEX10K существуют следующие способы:

Пассивная последовательная (последовательное ПЗУ, ByteBlaster, BiteBlaster, JTAG, микроконтроллер);

Пассивная параллельная синхронная (микроконтроллер);

Пассивная параллельная синхронная (микроконтроллер);

В проекте будет использовано JTAG конфигурирование. Для конфигурирования посредством JTAG выводы MSEL0, MSEL1 необходимо подключить к земле.

JTAG (Joint Test Action Group) – объединенная группа по вопросам тестирования – разработала спецификации для периферийного сканирования (BST – Boundary Scan Test). BST-технология позволяет выполнить эффективное тестирование компонентов на прецизионных печатных платах. BST-технология может тестировать выводы без использования щупов и пробников и выполняет сбор необходимых функциональных данных в нормальном режиме функционирования микросхемы. Для работы в JTAG-режиме используются четыре выделенных вывода: TDI, TDO, TMS, и TCK, и вспомогательный вывод TRST. Все остальные выводы во время JTAG-конфигурирования находятся в третьем состоянии. JTAG-конфигурирование нельзя начинать до завершения других режимов конфигурирования. Во время JTAG-конфигурирования конфигурационные данные загружаются в микросхему на печатной плате через разъемы кабелей MasterBlaster или ByteBlasterMV.

1)TDI – Вход тестовых данных.( Вход последовательной загрузки инструкций, программирующих и тестовых данных. Данные синхронизируются фронтом импульсов на выводе TCK.)

2)TDO – Выход тестовых данных.( Последовательный выход инструкций, программирующих и тестовых данных. Данные синхронизируются спадом импульсов на выводе TCK. Если данные из микросхемы не поступают – вывод находится в третьем состоянии)

3)TMS – Выбор режима тестирования (режим контроллера BST)( Вход управления режимом конечного автомата (контроллера) TAP. Конечный автомат синхронизируется фронтом сигнала на входе TCK. Поэтому состояние вывода TMS должно быть установлено перед фронтом сигнала TCK.)

4)TCK – Тактовый вход контроллера BST(Тактовый синхровход схемы BST. Некоторые операции синхронизируются фронтом, а некоторые спадом сигнала на TCK.)

5) TRST– Вход прекращения тестирования (дополнительный)( Вход асинхронного сброса схемы периферийного сканирования."0" на выводе – сбрасывает BST-схему периферийного сканирования. Вывод TRST является дополнительным в соответствии со стандартом IEEE STD. 1149.1.)[2]

(Какое отношение имеет выделенный материал к разделу??)

При разработке программы потребовалось написать на языке AHDL следующие модули:

1)Преобразователь кода из прямого в дополнительный(Имя?):

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

На выходе триггера схемы (Где он? Привести схему! Неясно, как утраняется дребезг) по тактовому сигналу появляется единица, при появлении следующего тактового импульса на выходе сигнал устанавливается в ноль.В итоге на выходе получаем импульс длительностью в один такт, который поступает на входы СЕ блоков фильтра и который разрешает срабатывание тактового импульса. Кнопка антидребезга нужна для отладки на макете.

3) основной блок схемы-фильтр(Имя?):

Входная 8-ми разрядная последовательность умножается на заданные коэффициенты числителя и складывается с произведением коэффициентов знаменателя, взятых с противоположным знаком, и последовательности 16-ти разрядных переменных. (Как формируется 16-разрядный код?? Как разрабатывался фильтр?)

Составление фильтра состоит в соединении отдельных модулей, в данной работе используются 3 модуля. Они соединены один за другим.

4)Параллельные параметризированные регистры(Имя?) предназначенны для хранения информации в течение периода частоты дискретизации

5)Семисегментный индикатор(?!) (Имя?) отображает четырехразрядные данные.

(Содержание раздела не соответствует названию.)

Определить, каким образом (как) реализовать операции (действия, блоки, модули), представленные на структурной схеме. Это можно сделать в виде:

Алгоритмов работы и их описания . Привести описание алгоритма на языке AHDL с пояснениями;

Структурных схем и их описания. Привести описание структурной схемы на языке AHDL с пояснениями;

Фрагментов программ на языке AHDL и их описание.

При описании работы желательно привести временные диаграммы работы блока (модуля, операции, действия)

Определение быстродействия, импульсной и переходной характеристик устройства

Проанализировав быстродействие(Каким образом??), получены следующие данные:

-период тактовых импульсов-115.8 нс

-частота дискретизации-8.63 МГц

Частота дискретизации: 2,8 МГц

Соответственно, получаем большой запас по частоте:

Сравним значения отсчетов импульсной и переходной характеристик,полученных с помощью MAX+PLUS II, MATLAB и отладочного модуля. Это необходимо для проверки правильности работы всего устройства.

Matlab 6.5

Таблица 4 Отсчеты импульсной характеристики

1 0,125 800 0320 0.125 20
2 -0,334 63398 F7A6 -0.334 A6
3 0,415 2658 0A62 0.4153 62
4 -0,244 63964 F9DC -0.246 DC
5 -0,0488 65219 FEC3 -0.0491 C3
6 0,148 994 03B0 0.1553 B0
7 -0,0236 65390 FF6E -0.024 6E
8 -0,0957 64919 FD97 -0.0965 97
9 0,0678 433 01B1 0.0676 B1
10 0,0302 191 00BF 0.0298 BF
11 -0,0607 65147 FE7B -0.0615 7B
12 0,00998 66 0042 0.01 42
13 0,0362 231 00E7 0.0361 E7
14 -0,0242 65373 FF5D -0.0254 5D
15 -0,0108 65461 FFB5 -0.011 B5
Matlab 6.5

Таблица 5 Отсчеты переходной характеристики

Переведенные отсчеты получаем путем деления прямых десятичных значений(??), полученных из дополнительного кода) на 6400(так как масштабирующий коэффициент 26 =64 и амплитуда входного воздействия принята равной 100).

(Как получены отрицательные значения?)

В данной работе был спроектирован цифровой фильтр высокой частоты, удовлетворяющий всем требованиям технического задания. Проект занял на интегральной схеме 60% ресурсов или 694 логических ячеек. Были получены навыки программирования ПЛИС. Погрешность характеристик фильтра связана с округлением его коэффициентов. (??)

(Как выполнены требования ТЗ?)

Угрюмов Е.П. Цифровая схемотехника: Учебное пособие. Санкт-Петербург(?Издательство?) 2000 г.

Конфигурирование ПЛИС Altera со статической памятью конфигурации. Р.А. Мяльк. Санкт-Петербург (?Издательство?) 2003 г.

Стешенко В.Б. Плис фирмы ALTERA: элементная база, система проектирования и языки описания аппаратуры. М., ДОДЭКА-XXI, 2007 (2002).

Антонов А.П. Язык описания цифровых устройств Altera AHDL. :Практический курс. М., Радио Софт, 2001 г.

"Основы проектирования цифровых устройств на ПЛИС"

На тему: "Цифровой фильтр высокой частоты"

Выполнил: студент группы 5110

Проверил: Соколов Ю.П.

constant razx = 8;–Что означают приведенные константы?

constant razy = 16;–Откуда они появились?

constant razb = 4;

constant raza = 8;

reset : input = gnd;

preobr_cod : pk_dk with (w >

reg_in : ppreg with (w >

reg_out : ppreg with (w >

btn : button with ( delay = 1, clock = 3175); –8000 25175

filtr_gor : filter with

wx = 8, –разрядностьшины xn

wy = 16, –разрядность шины yn—Откуда появились параметры??

wc1 = 5, — разрядность коэффициентов b

wc2 = 7, — разрядность коэффициентов a

rs = 6, –расширение коэффициента b

ws = 23, –разрядность шины sum

wp = 23, –разрядность шины result

b1 = 8, –коэффициент b1

b2 = B"10010", –коэффициент b2

b3 = 14, –коэффициент b3

b4 = B"11000", –коэффициент b4

a2 = B"1000101", –коэффициент a2

a3 = B"1000111", –коэффициент a3

a4 = B"1101110", –коэффициент a4

wm = 6 –сдвиг—Что значит параметр?

);–Значения параметров НЕ ПРИВЕДЕНО в пояснительной записке!!

Вы работаете с АЦП. Получаете результаты преобразования, один за одним. И замечаете, что эти результаты «скачут». А хотелось бы, чтобы стояли, как… Ну, короче, чтобы стояли!
Есть много причин, почему отсчеты АЦП могут быть нестабильны. В своей заметке я не говорю об этих причинах. Я говорю о том, как успокоить показания, получая их AS IS. И как сделать это максимально просто. При этом, возможно, не имея ни малейшего понятия о науке под названием «цифровая обработка сигналов».
Эта заметка написана в качестве полной замены предыдущей заметки. Ту лучше не читать 🙂

ПОСТАНОВКА ЗАДАЧИ

Имеется последовательность кодов, дискретно во времени представляющих физический сигнал. Мы будем говорить о последовательности кодов с АЦП. Физический сигнал и полученная последовательность кодов имеют шумы, выбросы, «болтанку» — назвать можно как угодно. Наша задача — сгладить входную последовательность, то есть, выдать выходную последовательность такую, чтобы влияние шумов было уменьшено.
При этом мы стремимся выполнить задачу максимально простыми программными средствами обычного микроконтроллера.
Более того, у нас поставлено еще одно условие. Допустим, что нам неудобно накапливать данные, а потом обрабатывать их и выдавать результат один раз на N полученных кодов. То ли буфер для данных негде организовать, то ли темп выдачи результатов должен совпадать с темпом получения кодов от АЦП, то ли еще что. Но условие поставлено.
И тут нам на помощь приходит цифровой рекурсивный фильтр, самой простой реализацией которого является фильтр первого порядка. Вот его и будем делать.

ТЕРМИНОЛОГИЯ

Мы хотим реализовать блок программной обработки кодов АЦП, на который поступают входные отсчеты, обрабатываются и преобразуются в выходные отсчеты. Вот этот блок обработки и будем называть цифровым фильтром:

В каждый из моментов времени t1-2Т , t1-T, t1, t1+T и так далее на входе появляется очередной отсчет последовательности Х, а цифровой фильтр выдает новый отсчет последовательности Y. Если на каждый входной отсчет фильтр выдает и выходной отсчет, то это и есть классический цифровой фильтр.
Иногда поступают не так: набирают некоторое количество входных отсчетов и затем обрабатывают их. Таким образом, на несколько входных получают один выходной отсчет. Это, как правило, уже задача получения того или иного интегрального значения (например, среднего). Она настолько распространена при фильтрации шумов, что часто воспринимается как «обычная». И поэтому классический цифровой фильтр, выдающий отсчеты с каждым входным, называют "скользящим усреднением", как нечто не совсем обычное для усреднения. Что ж, значит мы рассматриваем скользящее усреднение. Но понимаем, что это обычный цифровой фильтр 🙂
Важной особенностью цифрового фильтра является то, что входные отсчеты приходят с постоянным темпом, в нашем случае — с периодом Т. Обратная величина называется частотой дискретизации и играет огромную роль во всех параметрах цифрового фильтра. Самое простое, что необходимо себе четко представлять: частотная характеристика цифрового фильтра симметрична относительно Fд/2 и полностью повторяется за пределами . Из чего следует, что фильтр нижних частот, который мы проектируем сейчас, не способен подавлять сигналы с частотой , 2Fд, 3Fд, и т.д. Этого понимания пока достаточно для нашей задачи.
Математически цифровой фильтр 1-го порядка описывается различными способами. Мы будем использовать такое представление:

Y(n) = Alfa*Y(n-1) + Beta*X(n)

То есть, очередной отсчет Y(n) получаем путем взвешенного сложения предыдущего выходного отсчета Y(n-1) и нового входного кода X(n). При этом обычно коэффициент «усиления» фильтра желательно иметь равным 1. Для этого нужно, чтобы выполнялось

Alfa + Beta = 1

В рамках данной заметки задача расчета цифрового рекурсивного фильтра 1-го порядка состоит в нахождении коэффициентов Alfa иBeta с учетом удобства их использования в микроконтроллере (МК) для цифровой фильтрации отсчетов.

РАСЧЕТ ФИЛЬТРА

Цифровой фильтр (равно как и не цифровой) имеет как бы 2 лица: частотную характеристику и переходную (временнУю) характеристику. Задачу расчета можно ставить как получение требуемой частотной либо требуемой переходной характеристики. Я люблю исходить из заданного поведения во временной области. И объясню почему.
Дело в том, что частотная характеристика фильтра первого порядка… как бы это выразиться… простенькая. Возьмем 2 фильтра с частотой дискретизации 200 Гц. Первый с частотой среза по уровню -3 дБ, равной 5 Гц, второй — с частотой 1 Гц:



Как видим, в большей части частотной характеристики подавление шумов составляет всего 15. 30 дБ, а у второго — 20..40 дБ. Вспомним, я отмечал выше, что за пределами Fд/2 (у нас это 100 Гц) характеристика симметрична и в районе 200 Гц подавления шумов снова нет. Если нам нужно «взрослое зубастое подавление», то необходимо строить более серьезные фильтры.
Но все же, второй фильтр лучше давит помехи! А что, если частоту среза еще понизить?
И тут оказывается, что в погоне за парочкой децибел дополнительного подавления мы совсем забыли о временнОм «лице» фильтра. А давайте глянем, как реагируют эти два фильтра на ступенчатое входное воздействие (сигнала не было, а потом он вдруг стал равен 1 и таким и остался).



Что мы видим? Если говорить о времени переходного процесса, то первый фильтр (который похуже фильтрует) отрабатывает входной скачек примерно за 160 мс, а второй, наш передовик с подавлением 20. 40 дБ — почти за 800 мс. Вот так-то. Лучше фильтрация — хуже переходной процесс. Поэтому и нужно выбрать некий оптимум.
Вот, понимая это, я и предлагаю: исходить из требований по быстродействию. Задавшись временем реакции на ступенчатое входное воздействие, мы получим параметры фильтра (вот те самые Alfa иBeta), а параметры фильтрации примем уж какие получатся. Парочка децибел туды-сюды уже мало что изменят, а быстродействие будет известно.

Вот почему в качестве исходного требования я выбираю обеспечение заданного времени переходного процесса при подаче на вход ступенчатого воздействия. Рассмотрим чуть пристальнее, как же фильтр отрабатывает такой сигнал. Если дать скачек от нуля до некоторого значения, обозначенного 100%, то на выходе фильтра увидим:


Как видим, на 8-м отсчете фильтр уже отработал 90% входного воздействия, на 10-м — 95%, и так далее. Обычно принято говорить о «недоработанном», т.е. о тех 10 или 5 процентах, на которые фильтр еще «врет» к какому-то отсчету. Говорят еще, что погрешность установления выходного сигнала составляет столько-то процентов. Далее я привожу формулы для погрешности установления от 5 до 0,1%. В первом случае переходной процесс закончился «на глазок», а точности 0,1% обычно достаточно для того, чтобы считать процесс полностью законченным.
Разница между этими 5%-ым и 0,1%-ым фильтрами не столь уж велика. Я предполагаю, что все фильтры, которые будут разработаны по описываемой методике, находятся в континиуме между этими двумя крайними точками. В качестве характеристики фильтра по степени «законченности» переходного процесса введем такой параметр: Ntau — и вычислим его крайние значения:

LN(1/5%) = 2,996
LN(1/0,1%) = 6,908
Ntau = 2,996. 6,908

Смысл Ntau примерно таков: чем более жесткие требования мы предъявляем к завершенности переходного процесса, тем больше это число. Так что нижней границе значений Ntau соответствует «грубый» процесс, когда мы спешим считать отработку законченной, а верхней границе — «точный» переходной процесс.

Итак, разработчик задался временем переходного процесса Тпп, за которое фильтр отработает скачек на 95. 99,9%. Что еще нужно знать? Время выборки — тот период, с которым на вход фильтра поступают выборки и с таким же темпом с фильтра уходят результаты. Он у нас обозначен Т.
Ясно, что за время переходного процесса будет обработано много отсчетов. Сколько?

N = Тпп / Т (1)

И наша задача — выбрать значения Alfa иBeta так, чтобы уложиться в Тпп.
Оказывается, все очень просто. Должно выполняться условие:

Alfa > k

Микроконтроллер умножает 2 раза целое на целое, складывает, производит сдвиг вправо на k разрядов. Несколько микросекунд — и у вас новый отсчет выходной величины.

ПРИМЕР ДЛЯ ЦЕЛОЧИСЛЕННОЙ АРИФМЕТИКИ

Рассмотрим пример, в котором я задался N=100. Тогда условие (2) будет выглядеть так:

0,9333 > 8 (4)

На этом расчет фильтра с целочисленными коэффициентами закончен.

Коллега _pv подсказал в обсуждении хорошую запись вместо (4), полностью эквивалентую по результату:

Y(n) = Y(n-1) + [Nb*(X(n) — Y(n-1)) >> 8]

Здесь имеем экономию на одно умножение (при произвольных соотношениях между коэффициентами) и формула приобретает вид приращения старого значения Y(n) на разность между входом и выходом, умноженную на коэффициент Beta. Чем меньше этот коэффициент, тем медленнее следит выход за входом — более сильная фильтрация.

Приведу сишный код, соответствующий формуле от _pv:

Здесь учтено, что при делении (сдвиге вправо) в целочисленной арифметике теряются разряды. Поэтому промежуточный результат сохраняется в переменной z в масштабе суммы (до деления), а точнее, в масштабе выходной величины, деленной на Beta. Кстати, здесь и ответ на вопрос о необходимом диапазоне представления z: по максимальному значению выходной величины, деленному на Beta. Например, однобайтные переменные и коэффициент Nb, равный 1 (при последующем сдвиге на 8 бит, как в показанной функции) требуют двухбайтного z.

Еще один фокус — и я откланяюсь 🙂
Если не стремиться к конкретной цифре погрешности установления (0,1% или 5% или что-то еще), то можно попытаться выбросить одно умножение, выбрав меньшее из чисел Na и Nb равным 1.
В нашем примере меньшее из чисел именно Nb и легко посчитать, что оно может быть в диапазоне 8. 17. Вычислим следующие границы:

256 / Nb = 32. 16

Здесь числа равны степени двойки случайно. Важно то, что из диапазона допустимых значений 256 / Nb мы выбираем одно из чисел, равное именно степени двойки. Например, в нашем случае, берем 16.
Тогда 16 – это сумма «удобных» целочисленных Na и Nb, а меньшее из них равно 1, то есть микроконтроллеру не нужно умножать:

Y(n) = (15*Y(n-1) + X(n)) >> 4 (5)

Видим, что расчет (5) имеет на одну операцию умножения меньше, чем расчет (4).

РЕЗЮМЕ

Расчет простого цифрового фильтра нижних частот сводится к таким действиям:

Первое. Зададимся временем переходного процесса, периодом выборок и вычислим, за сколько выборок процесс должен закончиться (1):

N = Тпп / Т

Второе. Вычислим границы возможных значений коэффициента при Y (2):

EXP(-6,908 / N) > k

Как показано в примере, иногда можно подобрать Na или Nb, равными 1, что упрощает вычисления.

БЛАГОДАРНОСТИ
Хочу выразить искреннюю благодарность уважаемому коллеге angel5a за то, что он вернулся из детского садика (кто читал дискуссию, тот поймет) и очень помог мне с переделкой исходной заметки. Радикальной переделкой, хочу заметить.
Также в доработке статьи помогли дискуссии с коллегами _pv и известным в наших кругах товарищем avreal, выступившим на ненашем форуме.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock detector
',css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:'
'},wrap:void 0,body:void 0,errors:{tpl:'
',autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:a.noop,afterOpen:a.noop,beforeClose:a.noop,afterClose:a.noop,afterLoading:a.noop,afterLoadingOnShow:a.noop,errorLoading:a.noop},c=0,d=a([]),e={isEventOut:function(b,c){var d=!0;return a(b).each(function(){a(c.target).get(0)==a(this).get(0)&&(d=!1),0==a(c.target).closest("HTML",a(this).get(0)).length&&(d=!1)}),d}},f={getParentEl:function(b){var c=a(b);return c.data("arcticmodal")?c:(c=a(b).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!c&&c)},transition:function(b,c,d,e){switch(e=void 0==e?a.noop:e,d.type){case"fade":"show"==c?b.fadeIn(d.speed,e):b.fadeOut(d.speed,e);break;case"none":"show"==c?b.show():b.hide(),e()}},prepare_body:function(b,c){a(".arcticmodal-close",b.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return c.arcticmodal("close"),!1})},init_el:function(b,h){var i=b.data("arcticmodal");if(!i){if(i=h,c++,i.modalID=c,i.overlay.block=a(i.overlay.tpl),i.overlay.block.css(i.overlay.css),i.container.block=a(i.container.tpl),i.body=a(".arcticmodal-container_i2",i.container.block),h.clone?i.body.html(b.clone(!0)):(b.before(''),i.body.html(b)),f.prepare_body(i,b),i.closeOnOverlayClick&&i.overlay.block.add(i.container.block).click(function(c){e.isEventOut(a(">*",i.body),c)&&b.arcticmodal("close")}),i.container.block.data("arcticmodalParentEl",b),b.data("arcticmodal",i),d=a.merge(d,b),a.proxy(g.show,b)(),"html"==i.type)return b;if(void 0!=i.ajax.beforeSend){var j=i.ajax.beforeSend;delete i.ajax.beforeSend}if(void 0!=i.ajax.success){var k=i.ajax.success;delete i.ajax.success}if(void 0!=i.ajax.error){var l=i.ajax.error;delete i.ajax.error}var m=a.extend(!0,{url:i.url,beforeSend:function(){void 0==j?i.body.html('
'):j(i,b)},success:function(a){b.trigger("afterLoading"),i.afterLoading(i,b,a),void 0==k?i.body.html(a):k(i,b,a),f.prepare_body(i,b),b.trigger("afterLoadingOnShow"),i.afterLoadingOnShow(i,b,a)},error:function(){b.trigger("errorLoading"),i.errorLoading(i,b),void 0==l?(i.body.html(i.errors.tpl),a(".arcticmodal-error",i.body).html(i.errors.ajax_unsuccessful_load),a(".arcticmodal-close",i.body).click(function(){return b.arcticmodal("close"),!1}),i.errors.autoclose_delay&&setTimeout(function(){b.arcticmodal("close")},i.errors.autoclose_delay)):l(i,b)}},i.ajax);i.ajax_request=a.ajax(m),b.data("arcticmodal",i)}},init:function(c){if(c=a.extend(!0,{},b,c),!a.isFunction(this))return this.each(function(){f.init_el(a(this),a.extend(!0,{},c))});if(void 0==c)return void a.error("jquery.arcticmodal: Uncorrect parameters");if(""==c.type)return void a.error('jquery.arcticmodal: Don\'t set parameter "type"');switch(c.type){case"html":if(""==c.content)return void a.error('jquery.arcticmodal: Don\'t set parameter "content"');var d=c.content;return c.content="",f.init_el(a(d),c);case"ajax":return""==c.url?void a.error('jquery.arcticmodal: Don\'t set parameter "url"'):f.init_el(a("
"),c)}}},g={show:function(){var b=f.getParentEl(this);if(b===!1)return void a.error("jquery.arcticmodal: Uncorrect call");var c=b.data("arcticmodal");if(c.overlay.block.hide(),c.container.block.hide(),a("BODY").append(c.overlay.block),a("BODY").append(c.container.block),c.beforeOpen(c,b),b.trigger("beforeOpen"),"hidden"!=c.wrap.css("overflow")){c.wrap.data("arcticmodalOverflow",c.wrap.css("overflow"));var e=c.wrap.outerWidth(!0);c.wrap.css("overflow","hidden");var g=c.wrap.outerWidth(!0);g!=e&&c.wrap.css("marginRight",g-e+"px")}return d.not(b).each(function(){var b=a(this).data("arcticmodal");b.overlay.block.hide()}),f.transition(c.overlay.block,"show",d.length>1?{type:"none"}:c.openEffect),f.transition(c.container.block,"show",d.length>1?{type:"none"}:c.openEffect,function(){c.afterOpen(c,b),b.trigger("afterOpen")}),b},close:function(){return a.isFunction(this)?void d.each(function(){a(this).arcticmodal("close")}):this.each(function(){var b=f.getParentEl(this);if(b===!1)return void a.error("jquery.arcticmodal: Uncorrect call");var c=b.data("arcticmodal");c.beforeClose(c,b)!==!1&&(b.trigger("beforeClose"),d.not(b).last().each(function(){var b=a(this).data("arcticmodal");b.overlay.block.show()}),f.transition(c.overlay.block,"hide",d.length>1?{type:"none"}:c.closeEffect),f.transition(c.container.block,"hide",d.length>1?{type:"none"}:c.closeEffect,function(){c.afterClose(c,b),b.trigger("afterClose"),c.clone||a("#arcticmodalReserve"+c.modalID).replaceWith(c.body.find(">*")),c.overlay.block.remove(),c.container.block.remove(),b.data("arcticmodal",null),a(".arcticmodal-container").length||(c.wrap.data("arcticmodalOverflow")&&c.wrap.css("overflow",c.wrap.data("arcticmodalOverflow")),c.wrap.css("marginRight",0))}),"ajax"==c.type&&c.ajax_request.abort(),d=d.not(b))})},setDefault:function(c){a.extend(!0,b,c)}};a(function(){b.wrap=a(document.all&&!document.querySelector?"html":"body")}),a(document).bind("keyup.arcticmodal",function(a){var b=d.last();if(b.length){var c=b.data("arcticmodal");c.closeOnEsc&&27===a.keyCode&&b.arcticmodal("close")}}),a.arcticmodal=a.fn.arcticmodal=function(b){return g[b]?g[b].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof b&&b?void a.error("jquery.arcticmodal: Method "+b+" does not exist"):f.init.apply(this,arguments)}}(jQuery); } } function randomFlat(min,max){return Math.floor(Math.random()*(max - min + 1))+min} var ajax_url_now_me = 'https://pcznatok.ru/wp-admin/admin-ajax.php'; function flat_func_before(e,t,r){setTimeout(function(){e.before(t)},r)}function flat_func_after(e,t,r){setTimeout(function(){e.after(t)},r)}function flatlsTest(){var e="test_56445";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch(e){return!1}}function flatgetCookie(e){var t=document.cookie.match(new RegExp("(?:^|; )"+e.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,"\\$1")+"=([^;]*)"));return t?decodeURIComponent(t[1]):void 0}function flatsetCookie(e,t,r){var a=(r=r||{}).expires;if("number"==typeof a&&a){var n=new Date;n.setTime(n.getTime()+1e3*a),a=r.expires=n}a&&a.toUTCString&&(r.expires=a.toUTCString());var o=e+"="+(t=encodeURIComponent(t));for(var i in r){o+="; "+i;var l=r[i];!0!==l&&(o+="="+l)}document.cookie=o}var flatDetect={init:function(){this.browser=this.searchString(this.dataBrowser)||!1,this.OS=this.searchString(this.dataOS)||!1,this.referer=this.cookieReferer()},cookieReferer:function(){return parent!==window?"///:iframe":!0!==flatlsTest()?""!=document.referrer?document.referrer:"///:direct":(void 0===flatgetCookie("flat_r_mb")&&flatsetCookie("flat_r_mb",~window.location.search.indexOf("zen.yandex")?"///:zen":(""!=document.referrer?document.referrer:"///:direct"),{path:"/"}),flatgetCookie("flat_r_mb"))},searchString:function(e){for(var t=0;tparseInt(e.chapter_limit)){for(var r=[],a="",n=0;n=t.client_width)&&("0"!=e.html[n].group?t.client_block?(null==r["group_"+e.html[n].group]&&(r["group_"+e.html[n].group]=[]),r["group_"+e.html[n].group].push(e.html[n].html_block)):(null==r["group_"+e.html[n].group]&&(r["group_"+e.html[n].group]=[]),r["group_"+e.html[n].group].push(e.html[n].html_main)):t.client_block?r.push(e.html[n].html_block):r.push(e.html[n].html_main));for(var o in r)a="object"==typeof r[o]?a+"\n"+r[o][randomFlat(0,r[o].length-1)]:a+"\n"+r[o];if(""!=a){if(void 0!==e.how.simple&&("1"==e.how.simple.position&&jQuery(".flat_pm_start").after(a),"2"==e.how.simple.position&&jQuery(t.content_until[Math.round(t.content_until.length/2)]).after(a),"3"==e.how.simple.position&&jQuery(".flat_pm_end").before(a)),void 0!==e.how.onсe){if("true"==e.how.onсe.search_all)var i=jQuery("body").children();else i=t.content_until;(i=i.find(e.how.onсe.selector).add(i.filter(e.how.onсe.selector))).length>0&&(l="bottom_to_top"==e.how.onсe.direction?i.length-e.how.onсe.N:e.how.onсe.N-1,"before"==e.how.onсe.before_after?jQuery(jQuery.grep(i,function(e,t){return t==l})).before(a):jQuery(jQuery.grep(i,function(e,t){return t==l})).after(a))}if(void 0!==e.how.iterable&&(i=(i="true"==e.how.iterable.search_all?jQuery("body").children():t.content_until).find(e.how.iterable.selector).add(i.filter(e.how.iterable.selector))).length>0){var l=e.how.iterable.N,_=0;"bottom_to_top"==e.how.iterable.direction&&(i=i.get().reverse()),"before"==e.how.iterable.before_after?jQuery(jQuery.grep(i,function(e,t){return(t+1)%l==0})).each(function(){flat_func_before(jQuery(this),a,_),_+=10}):jQuery(jQuery.grep(i,function(e,t){return(t+1)%l==0})).each(function(){flat_func_after(jQuery(this),a,_),_+=10})}if(void 0!==e.how.popup){var s=!0;jQuery.arcticmodal("close"),"px"==e.how.popup.px_s?jQuery(window).scroll(function(){jQuery(this).scrollTop()>e.how.popup.after&&s&&(s=!1,jQuery('
'+("true"==e.how.popup.cross?'
':"")+a+"
").arcticmodal())}):setTimeout(function(){jQuery('
'+("true"==e.how.popup.cross?'
':"")+a+"
").arcticmodal()},1e3*e.how.popup.after),jQuery("body").on("click",".flat_pm_arcticmodal .flat_pm_cross",function(){jQuery.arcticmodal("close")})}if(void 0!==e.how.outgoing){var f;switch(s=!0,e.how.outgoing.whence){case"1":f="top";break;case"2":f="bottom";break;case"3":f="left";break;case"4":f="right"}jQuery("body").append('
"+("true"==e.how.outgoing.cross?'
':"")+a+"
"),"px"==e.how.outgoing.px_s?jQuery(window).scroll(function(){jQuery(this).scrollTop()>e.how.outgoing.after&&s&&(s=!1,jQuery(".flat_pm_outgoing."+f).addClass("show"))}):setTimeout(function(){jQuery(".flat_pm_outgoing."+f).addClass("show")},1e3*e.how.outgoing.after),jQuery("body").on("click",".flat_pm_outgoing .flat_pm_cross",function(){jQuery(this).parent().removeClass("show")})}}}}function flat_jQuery_is_load(){if(flat_pm_arcticmodal_load(),flat_pm_arr.length>0){jQuery('[data-flat-attr="img"]').each(function(){var e=jQuery(this);e.parent().is("a")&&e.parent().attr("data-flat-attr","a-img"),e.parent().is("p")&&e.parent().attr("data-flat-attr","p-img"),e.parent().parent().is("p")&&e.parent().parent().attr("data-flat-attr","p-img")});var e=new Date,t={},r=!0;t.client_width=window.innerWidth,t.client_date=e.getFullYear()+"-"+(2==(e.getMonth()+1+"").length?e.getMonth()+1:"0"+(e.getMonth()+1))+"-"+(2==(e.getDate()+"").length?e.getDate():"0"+e.getDate()),t.client_time=(2==(e.getHours()+"").length?e.getHours():"0"+e.getHours())+":"+(2==(e.getMinutes()+"").length?e.getMinutes():"0"+e.getMinutes()),t.client_block=detectAdb_var,t.client_country,t.client_city,t.content_until=jQuery(".flat_pm_start").nextUntil(".flat_pm_end"),t.client_os=flatDetect.OS,t.client_browser=flatDetect.browser,t.client_referer=flatDetect.referer;for(var a=0;anew Date(t.client_date+"T"+flat_pm_arr[a].date.time_to+":00")||new Date(t.client_date+"T"+t.client_time+":00")new Date(flat_pm_arr[a].date.date_to+"T00:00:00")||new Date(t.client_date+"T00:00:00")
1 0,125 800 0320 0.125 20
2 -0,209 64198 FAC6 -0.20906 C6
3 0,206 1320 0528 0.20625 28
4 -0,0401 65285 FF05 -0.0397 05
5 -0,0882 64968 FDC8 -00875 C8
6 0,0588 375 0177 0.05859 77
7 0,0354 230 00E6 0.0359 E6
8 -0,0595 65149 FE7D -0.0592 7D
9 0,00865 46 002E 0.0718 2E
10 0,0354 237 00ED 0.037 ED
11 -0,0235 65385 FF69 -0.02375 69
12 -0,0133 65451 FFAB -0.0135 AB
13 0,0226 146 0092 0.0228 92
14 -0,00278 65519 FFEF -0.00285 EF
15 -0,0141 65445 FFA5 -0.01425 A5