Цифровые фильтры на плис

Цифровые фильтры на плис

Цель курса:

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

Рассматриваемые темы:

  • Основы архитектуры и применения ПЛИС для цифровой обработки сигналов;
  • Вычисления в арифметике с фиксированной точкой;
  • Техники ориентированных графов;
  • Генерация HDL-кода для ПЛИС;
  • Реализация алгоритма Быстрого Преобразования Фурье (БПФ);
  • Разработка и реализация КИХ, БИХ и CIC-фильтров;
  • Алгоритм CORDIC;
  • Разработка и реализация адаптивных алгоритмов, таких как LMS и QR;
  • Техники синхронизации и тактового восстановления в цифровой связи.

Предварительная подготовка:

Продолжительность курса – 3 дня.

Программа курса:

День 1 из 3

Введение в ЦОС на аппаратных платформах (1.0 ч.)

Цель: получить вводную информацию по ЦОС и ПЛИС. Понять основы архитектуры ПЛИС и почему ПЛИС активно применяются для реализации алгоритмов ЦОС.

  • От дискретной логики до ПЛИС – немного истории!;
  • Типичная система ЦОС;
  • Обзор ядер и процессоров ЦОС;
  • Интегральные схемы специального назначения (ASIC);
  • Системы-на-кристалле (SOC);
  • Гибкость и функциональность ПЛИС;
  • ПЛИС и программируемые сигнальные процессоры.

Обзор алгоритмов ЦОС для линейных систем (0.5 ч.).

Цель: Понять базовые принципы теории дискретизации, квантования, спектрального анализа и создания цифровых фильтров.

  • Алиасинг и восстанавливающие фильтры;
  • Частота дискретизации и длина слова;
  • Z-преобразование и фундаментальный анализ;
  • КИХ и БИХ фильтры;
  • Цифровые фильтры: спецификация и проектирование;
  • Техники передискретизации (сигма-дельта).

Технология ПЛИС (1.0 ч.).

Цель: ознакомиться с различными семействами и архитектурами ПЛИС от Xilinx. Подробно рассмотреть ПЛИС Spartan 3 и Virtex-5.

  • Путь развития технологии ПЛИС;
  • Тактовая частота, частота данных и частота дискретизации;
  • Память и регистры ПЛИС;
  • Блоки ввода/вывода и требования;
  • Биты, секции (slice) и конфигурируемые логические блоки (Configurable Logic Blocks);
  • Рейтинги производительности в MIPs;
  • Семейства и источники ПЛИС.

Элементы ПЛИС для алгоритмов ЦОС (1.5 ч.).

Цель: познакомиться с секциями для ЦОС (DSP slice), частотой алгоритма и потребляемой мощностью.

  • Построение линий задержки и сдвиговых регистров;
  • Использование RAM (памяти) на ПЛИС;
  • Сериализаторы и десериализаторы;
  • Мультиплексоры для выбора канала;
  • Полные сумматоры, логика переноса, дерево сумматоров;
  • Умножители: сдвиг и суммирование; на основе ROM;
  • Эффективные реализации умножителей.

Основы арифметики ЦОС (1.0 ч.).

Цель: понять бинарную арифметику с фиксированной точкой. Реализовать арифметические операции на ПЛИС Xilinx.

  • Арифметика с фиксированной точкой в дополнительном коде;
  • Базовые массивы сумматоров и умножителей;
  • Массивы делителей и операций квадратного корня… уже не так просто!;
  • Проблемы длины слова в арифметике с фиксированной точкой;
  • Насыщение и целочисленное переполнение.

Техники ориентированных графов (2.0 ч.).

Цель: познакомиться с представлением алгоритмов ЦОС в форме направленных графов. Использовать метод Cut Set для лучшей производительности по частоте. Реализовать параллельные и последовательные КИХ-фильтры.

  • Направленные графы для ЦОС и цифровых фильтров;
  • Задержка, элементы задержки и "анти-задержки"!;
  • Ре-тайминг: Cut-set и нормирование задержки;
  • Транспонированная КИХ;
  • Конвейеризация и мультиканальные архитектуры;
  • Топологии графов для ПЛИС.

День 2 из 3

Обработка в частотной области (1.0 ч.)

Цель: обсудить теорию и реализацию на ПЛИС Быстрого Преобразования Фурье (БПФ).

  • ДПФ, БПФ и ОБПФ;
  • Архитектуры ПЛИС для БПФ;
  • Увеличение размера слова, точность при реализации алгоритма БПФ.

Многоскоростная обработка сигналов на ПЛИС (4.0 ч.).

Цель: разработать полифазную структуру для эффективной реализации многоскоростных фильтров. Использовать CIC-фильтр для интерполяции и децимации.

  • Увеличение частоты дискретизации и интерполирующие фильтры;
  • Снижение частоты дискретизации и децимирующие фильтры;
  • Эффективная арифметика для КИХ-реализации;
  • Интеграторы и дифференциаторы;
  • Полуполосные фильтры, гребенчатые фильтры и фильтры движущегося среднего;
  • CIC-фильтры (Cascade Integrator Comb, фильтры Хогенауэра);
  • Эффективная арифметика для БИХ-фильтрации.

Техники CORDIC (2.0 ч.).

Цель: получить представление о применении алгоритма CORDIC для расчёта различных тригонометрических функций.

  • CORDIC: режим поворота и режим вектора;
  • Вычисление косинуса и синуса;
  • Вычисление модуля и угла вектора;
  • Архитектура для реализации на ПЛИС.

День 3 из 3

Адаптивные алгоритмы ЦОС и их применение (2.0 ч.).

Цель: познакомится с LMS-алгоритмом в адаптивной обработке сигналов. Изучить QR-алгоритм на основе RLS-техники (Recursive Least Squares), и узнать, почему он так подходит для реализации на ПЛИС.

  • Применение адаптивных алгоритмов (выравнивание, формирование луча);
  • LMS-алгоритм и параллельная реализация;
  • Неканонические LMS-алгоритмы;
  • Линейная алгебра; решение системы линейных уравнений;
  • QR-алгоритм для адаптивной обработки сигналов;
  • Требования к QR-обработке и численные проблемы.

ЦОС в системах связи на ПЛИС (3.0 ч.).

Цель: познакомиться с квадратурной модуляцией и формированием импульсов. Обсудить реализацию генераторов с цифровым управлением (NCO).

  • Квадратурная фазовая манипуляция (QPSK);
  • Передающий/Приёмный фильтры – фильтр приподнятого косинуса (RRC);
  • Субдискретизация и цифровое понижающее преобразование (DDC);
  • Прямое цифровое повышающее преобразование (DUC);
  • Стадии промежуточной частоты (и системы fs/4);
  • Генераторы с цифровым управлением (NCO);
  • Деление проекта на ПЛИС.

Проблемы тайминга и синхронизации (2.0 ч.).

Цель: познакомиться с символьным восстановлением, фазовым восстановлением несущей, частотным восстановлением несущей и кадровой синхронизацией.

  • Восстановление несущей, возведение в квадрат и петли Костаса, PLL;
  • Вращение фазы; преобразования частоты дискретизации;
  • Символьное восстановление, early/late gate detection;
  • Синхронизация в системах подстройки по задержке (DLL).

Давно хотел начать цикл статей, посвященных цифровой обработке сигналов на ПЛИС, но по разным причинам так и не мог к этому приступить. К счастью, в распоряжении появилось немного свободного времени, поэтому периодически я буду публиковать материалы, в которых отражены различные аспекты, связанные с ЦОС на ПЛИС.

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

Часть 1: CIC фильтр

sin(x)/x. Главное преимущество CIC фильтров состоит в том, что они совсем не требуют операций умножения (в отличие от другого типа фильтров, например, КИХ).

Введение

Из названия можно догадаться, что в основе CIC фильтра лежит два базовых блока: интегратор и гребенчатый фильтр (дифференциатор). Интегрирующее звено (int) представляет собой обычный БИХ-фильтр первого порядка, выполненный как самый простой аккумулятор. Гребенчатый фильтр (comb) является КИХ-фильтром первого порядка.

Между интегратором и гребенчатым фильтром часто ставится узел повышения или понижения частоты дискретизации в целое число раз — R.

  • В случае понижения частоты дискретизации из входной последовательности выбирается каждый R-отсчет, образуя прореженную выходную последовательность.
  • В случае повышения частоты дискретизации между отсчетами входной последовательности просто вставляются нули, которые затем сглаживаются в интегрирующей секции, образуя последовательность на увеличенной частоте дискретизации.

Формулы для передаточной и амплитудно-частотной характеристик приведены ниже:

Более подробно со всеми математическими выкладками обо всех аспектах децимации и интерполяции можно почитать в других источниках, на которые в конце статьи я приведу ссылки.

Дециматор

Если CIC-фильтр используется для понижения частоты дискретизации, то он называется дециматором. В таком случае первым звеном идет интегратор, затем происходит понижение частоты дискретизации и, наконец, идет звено дифференцирующего фильтра.

Интерполятор

Если CIC-фильтр используется для повышения частоты дискретизации, то он называется интерполятором. В таком случае дифференцирующее звено стоит на первом месте, затем происходит повышение частоты дискретизации и, наконец, идет звено интегрирующего фильтра.

В зависимости от задержки входного сигнала в дифференцирующем звене, можно получать различные частотные характеристики фильтра. Известно, что при увеличении параметра задержки D, увеличивается количество «нулей» амплитудно-частотной характеристики (АЧХ) фильтра.

Заметим, что для связки интегратора и гребенчатого фильтра (CIC фильтра) при увеличении параметра D в дифференцирующей секции нули АЧХ смещаются к центру – изменяется частота среза фильтра Fc = 2 pi / D.

Каскадное соединение интегратора и гребенчатого фильтра без операций децимации и интерполяции называется фильтром «скользящего среднего». Уровень первого бокового лепестка такого фильтра составляет всего -13 дБ, что достаточно мало для серьезных задач ЦОС.
В силу линейности математических операций, происходящих в CIC фильтре возможно каскадное соединение нескольких фильтров подряд. Это дает пропорциональное уменьшение уровня боковых лепестков, но также увеличивает завал главного лепестка спектра (под спектром я часто буду понимать АЧХ фильтра). Таким образом, при N-каскадном соединении однотипных CIC фильтров происходит перемножение идентичных передаточных характеристик. Как правило, секции интеграторов и гребенчатых фильтров объединяются вместе по типу. Например, сначала последовательно ставится N секций однотипных интеграторов, затем N секций однотипных дифференцирующих фильтров.

Читайте также:  Как выбрать тв бокс приставку

На следующем рисунке приведена АЧХ фильтра при различных параметрах коэффициента дискретизации R (расчет сделан в MathCAD 14).

АЧХ CIC фильтра полностью эквивалентна частотной характеристике FIR фильтра с прямоугольной импульсной характеристикой (ИХ). Общая ИХ фильтра определяется как свертка всех импульсных характеристик каскадов связки интегратора и гребенчатого фильтра. С ростом порядка CIC фильтра, его ИХ интегрируется соответствующее число раз. Таким образом, для CIC фильтра первого порядка ИХ – прямоугольник, для фильтра второго порядка ИХ – равнобедренный треугольник, для третьего порядка ИХ – парабола и т.д.

Рост разрядности данных

К несчастью, увеличение величины задержки D в гребенчатой структуре и увеличение порядка фильтра N приводят к росту коэффициента передачи. Это в свою очередь приводит к увеличению разрядности на выходе фильтра. В задачах ЦОС, где применяются CIC фильтры нужно всегда об этом помнить и следить, чтобы передаваемые сигналы не выходили за используемую разрядную сетку. К примеру, негативный эффект роста разрядности проявляется в значительном увеличении используемых ресурсов кристалла ПЛИС.

Интерполятор: использование ограниченной точности не влияет на внутреннюю разрядность регистров, масштабируется только последний выходной каскад. Существенный рост разрядности данных происходит в секциях интеграторов.

Дециматор: CIC фильтр-дециматор очень чувствителен к параметрам D, R и N, от которых зависит разрядность промежуточных и выходных данных. И дифференцирующее звено, и интегратор влияют на конечную разрядность выходного сигнала.

В этих формулах: B — разрядность входных данных, Bmax — разрядность выходных данных, R — коэффициент дискретизации, D — параметр задержки, N — порядок фильтра (количество каскадов).

Замечание! В статье Хогенауэра описаны принципы выбора разрядности для каждого каскада дециматора. Xilinx и Altera при реализации своих фильтров учитывают негативный эффект роста разрядности фильтра и борятся с этим явлением методами, описанными в статье.

Xilinx CIC Filter

Так как я моя работа на 99% связана с микросхемами фирмы Xilinx, я приведу описание IP-ядра фильтра для этого вендора. Но смею вас заверить, что для Altera все практически аналогично.
Для того, чтобы создать CIC фильтр, необходимо зайти в приложение CORE Generator и создать новый проект, в котором указать тип используемого кристалла ПЛИС и различные другие несущественные в данном случае настройки.

CIC Compiler — Вкладка 1:

Component name имя компонента (используются латинские буквы a-z, цифры 0-9 и символ "_").

Filter Specification:

  • Filter type — тип фильтра: интерполирующий / децимирующий.
  • Number of stages — количество каскадов интеграторов и гребенчатых фильтров: 3-6.
  • Differential delay — задержка в дифференциальных ячейках фильтра: 1-2.
  • Number of channels — количество независимых каналов: 1-16.

Sample Rate Change Specification:

  • Fixed / Programmable — тип коэффициента дискретизации R: постоянный / программируемый.
  • Fixed or Initial Rate — значение коэффициента дискретизации R: 4..8192.
  • Minimum Rate — минимальное значение коэффициента дискретизации R: 4..8.
  • Maximum Rate — максимальное значение коэффициента дискретизации R: 8..8192.

Hardware Oversampling Specification: эти параметры влияют на выходную частоту дискретизации, количество тактов, требуемых для обработки данных. От этих параметров также зависит уровень параллелизма внутри ядра и количество занимаемых ресурсов.

  • Select format — выбор частотных соотношений фильтра: Frequency Specification / Sample period.
  • Frequency Specification — Частотная спецификация: пользователь задает частоту дискретизации и частоту обработки данных.
  • Sample period — Тактовая спецификация: пользователь задает отношение частоты обработки к тактовой частоте данных.
  • Input Sampling Frequency — входная частота дискретизации: *.
  • Clock frequency — частота обработки фильтра: *.
  • Input Sampling period — отношение частоты обработки к частоте входного тактового сигнала: *.

* — диапазон зависит от общих настроек и коэффициента дискретизации R.

CIC Compiler — Вкладка 2:

Numerical Precision:

  • Input Data Width — разрядность входных данных: 2..20.
  • Quantization — округление выходных данных: полная точность / округление разрядной сетки.
  • Output Data Width — разрядность выходных данных, диапазон зависит от коэффициентов N, D и R (максимальное значение — 48 битов).

Optional:

  • Use Xtreme DSP Slice — использовать встроенные DSP-блоки для реализации фильтра.
  • Use Streaming Interface — использовать потоковый интерфейс для многоканальной реализации фильтра.

Control Options:

  • ND — «New data», входной сигнал, определяющий поступление данных на вход фильтра.
  • SCLR — синхронный сброс фильтра (логическая единица на этом входе производит сброс).
  • CE — «Clock Enable», сигнал разрешения тактирования фильтра.

CIC Compiler — Вкладка 3:

Summary — эта вкладка в виде списка отражает конечные настройки фильтра (количество каскадов, параметры частот, разрядность входных, выходных и промежуточных данных, задержка в фильтре и т.д.).

В левой части окна CIC Compiler есть три полезные дополнительные вкладки:

  • IP-symbol — схематичный вид IP-блока с активными портами ввода/вывода.
  • Freq. response — передаточная характеристика CIC-фильтра.
  • Resource estimate — оценка занимаемых ресурсов.

После установки всех настроек необходимо нажать на кнопку Generate. В результате приложение CORE Generator через какое-то время выдаст целый набор файлов, из которых нам нужны самые основные:

  • *.VHD (или *.V) — файл исходных кодов для моделирования на VHDL или Verilog.
  • *.VHO — бесполезный файл, но из него можно взять описание компонента и портирование для вставки в проект.
  • *.NGC — файл списка соединений. Содержит описание архитектуры IP-ядра (используемые компоненты и связи сигналов между ними) для выбранного кристалла ПЛИС.
  • *.XCO — лог-файл, в котором хранятся все параметры и настройки IP-ядра. Полезный файл при работе в среде Xilinx ISE Design Suite.

Если вы работаете в среде ISE Design Suite, то CORE Generator автоматически создаст нужные файлы в рабочем каталоге. Для других средств разработки (типа Modelsim или Aldec Active-HDL) необходимо перенести нужные файлы в соответствующий рабочий каталог.

CIC Filter in MATLAB

Пример 1: Для моделирования очень удобным средством является программа MATLAB. Для примера возьмем модель CIC-фильтра 4 порядка, сделанного на логических элементах из System Generator Toolbox от Xilinx. Децимация и интерполяция не используется (CIC вырождается в фильтр скользящего среднего с окном 16). Параметры фильтра: R = 1, N = 4, D = 16. На следующем рисунке приведена модель одного каскада в среде MATLAB.

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

Видно, что сигнал на выходе первого звена образует прямоугольный импульс длительностью = D, на выходе второго звена — треугольный сигнал длительностью 2D, на выходе третьего звена — параболический импульс, на выходе третьего — кубическая парабола. Результат полностью согласуется с теорией.

Пример 2: непосредственно IP-ядро CIC фильтра. Параметры: N = 3, R = 4, D = 1. На следующем рисунке представлена модель фильтра.

Если на вход такого фильтра подать единичный импульс длительностью несколько тактов (например 32), то на выходе образуется сигнал параболической формы, напоминающий ИХ фильтра скользящего среднего третьего порядка.

На этом хотелось бы подвести итог. CIC фильтры используются во многих задачах, где требуется изменить частоту дискретизации. CIC фильтры применяются в системах, работающих на нескольких частотах дискретизации (multirate processing), например, в аудио-технике для изменения бит-рейта (из 44.1кГц в 48кГц и обратно). CIC фильтры применяются в системах связи для реализации DDC (digital down converter) и DUC (digital up converters). Пример использования CIC-фильтров: микросхема цифрового приема AD6620 от Analog Devices.

Реализация собственного фильтра на ПЛИС на HDL языках часто не требуется, и можно смело пользоваться готовыми ядрами от вендоров, либо готовыми opensource-проектами. Если все же возникла необходимость в реализации собственного CIC фильтра для прикладной задачи, то нужно помнить следующие принципы.

CIC фильтры обладают рядом особенностей:

  1. Простые в реализации и не требуют операций умножения.
  2. Децимация и интерполяция на CIC фильтрах используется повсеместно для быстрого изменения частоты дискретизации, как в целое, так и в дробное число раз.
  3. С ростом порядка фильтра N и величины задержки D увеличивается разрядность промежуточных и выходных данных.
  4. С ростом порядка фильтра N увеличивается подавление боковых лепестков и увеличивается неравномерность главного лепестка АЧХ.
  5. Рекомендуется использовать фильтры порядка не более 6-8, т.к. с увеличением порядка усложняется реализация, увеличивается объем занимаемых ресурсов, а также происходят искажения АЧХ фильтра в пределах полосы пропускания.
  6. С ростом параметра задержки D гребенчатого фильтра изменяется частота среза фильтра, но в практических целях при каскадном соединении параметр D > 1, в ПЛИС возможно повторно использовать ресурсы фильтра, тем самым для многоканальной системы реализовать обработку с минимальной затратой ресурсов кристалла.
  7. В современных ПЛИС CIC фильтры реализуются на блоках DSP (Xilinx, Altera), но при отсутствии свободных ресурсов возможна реализация на логических ячейках (SLICEs).
  8. После CIC фильтра рекомендуется ставить умножитель с программируемым коэффициентом усиления (gain multiplier), который будет подстраивать уровень сигнала до нужного динамического диапазона
  9. CIC фильтры вносят искажение в спектр выходного сигнала, поэтому после CIC фильтра необходимо ставить компенсирующий FIR фильтр (методика расчета представлена в даташите Altera, для расчета необходим MATLAB).
Читайте также:  Intel core i5 7400 s1151

Литература

  • E. Ifeachor, B. Jervis. Digitaal l SignProcessing: A Practical Approach (2nd Edition).
  • Hogenauer, E. An economical class of digital filters for decimation and interpolation.
  • Wikipedia CIC filter
  • Altera CIC Filter Userguide
  • Xilinx CIC Compiler DS613
  • MATLAB CIC Filter
  • DSPLIB — CIC фильтры
  • DSPLIB — CIC дециматор и интерполятор
  • Исходные коды на Verilog с пояснениями
  • OpenCores project 1. Фамилия у автора очень интересная 🙂
  • OpenCores project 2

Продолжение следует.

Добро пожаловать в киберблог радиоинженера и программиста, позывной UR3QQJ. Мой многолетний опыт затрагивает такие области, как промавтоматизация, IoT, руководство людьми и переговоры с заказчиком. Второе направление — аудит ИС в области безопасности. Третье — ЦОС в области радиолокации. Экспертное консультирование и нестандартные решения? Без проблем. Приглашаю на канал.

среда, 14 октября 2015 г.

Цифровая фильтрация на ПЛИС. Сглаживание и борьба с импульсными помехами

Когда возникают задачи сглаживания аналогового сигнала, к примеру, с датчиков температуры за сутки (хотя это и так достаточно инерционный параметр), или резкие колебания с датчиков давления около некоего среднего значения (рецессии) или что еще более жизненно – на ваши данные во времени накладывается шум или статический разряд, не поленитесь, загляните в любой математический справочник, к примеру в [1], и откройте для себя полиномы регрессии*, алгоритм скользящего среднего и прочие «вкусности». В случае с аналоговыми цепями все тривиально, фильтрация. А если сигнал уже оцифрован вместе с помехой? Можно-ли в том же микроконтроллере или ПЛИС («тупой» логике) собрать цифровой фильтр и проверить на работоспособность? Разумеется, да. А как схемотехнически реализовать подобный фильтр? Сегодня в продолжении нашего цикла [2, 3] мы рассмотрим данный вопрос в контексте сглаживания, скажем фильтрацию огибающей от импульсных помех в ПЛИС.

Следует отметить, что сглаживание осуществляется и для временной (ибо осуществляется над самими отсчетами сразу) и в неявном виде для частотной области. Данную операцию над сигналом можно осуществить несколькими способами: применением окон (фильтров) [4] с соответствующими коэффициентами (Блэкмана-Хэрриса, Хафмана и т.д.), использованием полиномов регрессии (экспоненциального, Гауссового, Лангранжа, показательного, гиперболического, параболического, линейного, логарифмического и т.п.), а также таких сглаживающих фильтрующих функций как «скользящее среднее» и медианная фильтрация. К примеру, запись для наиболее часто употребимого экспоненциального сглаживания имеет следующий вид (см. формулу 1).

где: V – результат функции, Vp – входное значение (аргумент), K – коэффициент сглаживания.

Основой этих полиномов является – вырождение точек (регрессия). Отсюда видно, что чем ближе к "1" коэффициент сглаживания, тем выше эффект сглаживания (см. рисунок 2).


Рис. 2. Тестовый проект визуализации использования полиномов регрессии.
Сигнал, шум с нормальным распределением и аддитивная смесь сигнала и шума

* Аппроксимация данных с учетом их статистических параметров (например, при обработке экспериментальных данных, полученных в результате измерений процессов или физических явлений) относится к задачам регрессии. Задачей регрессионного анализа является подбор математических формул, наилучшим образом описывающих экспериментальные данные.

Однако, использование полиномов регрессии в цифровой технике обусловлено рядом технических трудностей из-за большого количества проводимых арифметических операций, поэтому чаще ограничиваются более простыми в реализации скользящим усреднением и скользящими медианами. Последние по сути оптимальны для решения двух разных задач. В вопросах сглаживания и устранения многих типов шумов почти идеальны первые, но они совершенно не подходят для фильтрации импульсных помех. Почему? Для ответа на этот вопрос следует пояснить, что же такое это «скользящее среднее».

Простое скользящее среднее или арифметическое скользящее среднее (англ. Simple Moving Average) численно равно среднему арифметическому значений исходной функции за установленный период выборки. Для фильтра «скользящего среднего» (не взвешенного) доступен только один параметр – порядок или длина окна. От него зависит и частота среза и уровень пульсаций в полосе заграждения. Рассмотрим разные длины окон и их влияние на результат (см. таблицу 1).

Таблица 1. Варианты весовых окон «скользящего среднего» над входными данными

Как видно из таблицы 1, чем больше длина окна, тем более сглаженный результат будет на выходе. Однако эта идиллия продолжится до тех пор, пока значения входных отсчетов (сигнала) находятся в пределах, так называемого, нормального или рабочего диапазона. Что будет при появлении импульсного шума (помехи)? Предположим на входе фильтра «скользящее среднее» следующую последовательность: 2, 5, 9, 1, 0, 3, 9 и вдруг раз и появилось 857. Очевидно, что даже при большом интервале (окне) усреднения эту импульсную помеху в виде аномального значения 857 полностью не убрать. Вот тут в игру вступает медианная фильтрация. Но, пока не будем забегать вперед и обо всем по-порядку.

Используемое ПО и оборудование

Для организации работы нам понадобится следующее оборудование и программное обеспечение:

  1. Стендовая макетная плата c ПЛИС из второго цикла [3].
  2. 3-х вольтовый источник питания мощностью от пяти ватт.
  3. ПК с установленной инструментальной системой проектирования логических матриц Xilinx Foundation Series 3.1i/4.1i, ISE Webpack или Xilinx ISE Design Suite 14 (или выше) [5, 6].
  4. Программатор JTAG, к примеру Xilinx JTAG Download Parallel Cable или Xilinx Platform Cable USB, подключенный к JTAG- разъему программирования [7].

Создание проекта, сборка и прошивка ПЛИС

Запустив САПР Xilinx, создадим новый проект и выберем соответствующую модель матрицы. После чего можем войти в схемотехнический редактор, нажав третью кнопку на вкладке «Design Entry» менеджера проектов Project Manager и приступить к моделированию (см. рисунок 3). Все счетчики и триггеры в проекте должны быть асинхронные.

Рис. 3. Создание проекта в среде Xilinx

По окончании моделирования проверяем и собираем проект по нажатию кнопки «Implementation» в окне Project Manager (см. рисунок 4).

Рис. 4. Сборка проекта (имплементация) в среде Xilinx

После сборки проекта среда создаст файл прошивки формата JED с сигнатурой матрицы XC95288XL7-TQ144, который и нужно будет прошить в CPLD. Процесс прошивки рассмотрен нами ранее подробно в предыдущих материалах и останавливаться на нем не будем.

Нижний уровень. Реализация алгоритма «скользящее среднее»

Каждое значение аргумента выходной функции «скользящего среднего» – есть не что иное, как сумма соседних (предыдущих значений), деленное на длину окна. Число точек W, учавствующих в расчете такого среднего, называют окном скользящего усреднения. Чем оно больше, тем больше данных учавствует в расчете среднего и тем более сглаженная кривая получается. Если обратиться к таблице 1 (см. выше), то общую формулу для данной весовой функции можно записать как выражение (2).

где: Yw – результат скользящего среднего, SUM() – сумма значений всех отсчетов на длине окна W.

При малых значениях длины окна W сглаженная кривая будет практически повторять ход изменения данных, а при больших W эти кривые будут отражать лишь закономерность их медленных вариаций, что соответственно сказывается на поведении окна в ВЧ-области (об этом чуть далее).

Поскольку мы имеем дело с двоичной логикой, то длину окна целесообразно выбирать кратной степени двойки. Что это дает? А дает это простоту реализации операции деления: скажем, если необходимо поделить наш результат сложения на число 2N (N- вес разряда), то это будет равноценно сдвигу разрядов числа вправо на N- позиций. Этот сдвиг реализуется просто переподключением нужных весовых разрядов на схеме. Всего-то? Именно так, в случае с целочисленной арифметикой. Предположим к нам поступают данные постоянно (беспрерывно) к необходимо реализовать «скользящее» окно с накопительным буфером на два слова, т.е. к примеру, длина окна W = 2. Схемотехнически реализация будет следующей (см. рисунок 5).

Читайте также:  Lenovo 330s 15ikb 15 6 fhd ips

Рис. 5. Реализация фильтра «скользящее среднее» с длиной окна W = 2

Описание принципа работы

На цепочке (каскадное соединение) двух восьмиразрядных асинхронных D- триггеров FD8 реализованы накопительный буфер и «скользящее окно». По фронту первого такта производится запись поступивших данных на нижний буфер (единократно и на верхний буфер за счет разрешения прохождения через нижний BUFT8, управляемый нулем). При этом на входах сумматора будут присутствовать одинаковые сигналы, которые после деления на два (обычным сдвигом на один разряд с учетом выхода переполнения сумматора) дадут тот же сигнал, что и на входе. Сделано это для адекватной работы «скользящего среднего» в первый момент (центрированный алгоритм расчета), однако по первому же спаду тактов сработает триггер-защелка FDС, которая переподключит верхнее накопительное плечо FD8 в рабочий режим и в дальнейшем, по приходу второго фронта данные с выхода нижнего накопительного плеча FD8 запишутся в верхнее плечо FD8. Пришедшее второе слово (данные) по второму такту запишется в первое плечо буфера. Таким образом, по фронту каждого такта данные (слова, байты) со входа INDATA будут сдвигаться и каждый раз на входах сумматора будут данные окна. По спаду тактов результат деления будет защелкиваться выходным буфером FD8 и поступать на выход OUTDATA. По входу CLR есть возможность сброса фильтра в начальное состояние по сигналам запуска, при необходимости. При желании, «скользящее среднее» легко наращивается до длины** окна кратной степени двойки (22, 23 и т.д).

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

Оценка оптимальности порядка фильтра «скользящее среднее»

Допустим задан сигнал вида sin(x) и некая случайная составляющая с нормальным распределением (см. выше рисунок 1), накладываемая на сигнал в той же временной области. Данный сигнал мы решили сгладить с помощью фильтра «простое скользящее среднее». Выбрали порядок фильтра N. Как оценить оптимальность выбранного порядка N? То есть, какая длина окна будет достаточна со строгой математической точки зрения? Очевидно, что следует определить частоту среза фильтра и задаться допустимым уровнем пульсаций в полосе пропускания.

Мы знаем, что от длины окна зависит и частота среза и уровень пульсаций в полосе заграждения. Данный фильтр можно рассматривать как фильтр с конечной импульсной характеристикой (КИХ) с одинаковыми коэффициентами, равными 1/N, где N – длина окна (в этом случае окно и есть импульсная характеристика фильтра). Частотная характеристика такого фильтра есть преобразование Фурье от единичного импульса (правильнее конечно использовать термины Z- преобразования), это будет функция вида sin(x)/x, в которой главный лепесток определяет полосу пропускания, а остальные боковые лепестки задают полосу заграждения. Разумеется, чем длиннее окно (больше порядок фильтра), тем уровень боковых лепестков будет ниже, но ширина главного лепестка будет равна 1/N, то есть с ростом порядка фильтра она будет уменьшаться, а значит частота среза будет меньше. Логично? В случае одиночного сигнала, оптимальным в нашем случае будет такой порядок фильтра, который даст максимально близкую к частоте вашего синуса частоту среза. Количественно это будет определяться формулой 3.

где: N – порядок фильтра, Fd – частота дискретизации, Fs – частота сигнала.

Правильнее будет сказать, что оптимальная длина (она же порядок фильтра) будет определяться следующим выражением (4).

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

Таким образом, при заданных исходных параметрах: частоте сигнала, частоте дискретизации и разных уровнях соотношения сигнал/шум (SNR), мы будем всегда иметь одну оптимальную величину N. Отметим, что фильтр всегда оптимален для определенных характеристик сигнала, характеристики изменились – фильтр уже неоптимален. Да, вот такой вот недостаток. Но что же вы хотели от простого фильтра с одним настраиваемым параметром? Его задача – лишь сглаживание данных.

Практическое приложение подобной оценки

Рассмотрим конкретный пример расчета подобной оценки, скажем для гитарного тюнера. Это такое устройство или программа для определения звучащей ноты, т.е. частоты нотного ряда, на основе спектроанализа [8. 10]. Допустим имеем сигнал (набор данных, сэмплов) с частотой дискретизации 44100 Гц и разрешением 32 бита на сэмпл. Среднее из скольки сэмплов нужно взять, чтобы остались частоты ниже 1000 Гц? То есть стоит задача отфильтровать высокие ноты на гитаре.

Обратимся к формуле (4) и подставим исходные данные:

Nопт = round(Fd/2/Fs) = round(44100/2/1000) = round(22.05) = 22.

Как видим, порядок фильтра или длина окна должна быть равна 22 сэмпла. Получается, если нам необходимо убрать перед анализатором спектра все частоты выше 1000 Гц или что эквивалентно введению окна ФНЧ, то мы должны выдавать один сэмпл, сформированный как среднее из 22 входных сэмплов аудиосигнала. Вот так просто.

Нижний уровень. Одномерная медианная фильтрация

Медианой набора данных ‘х1, х2, …, при нечетном является средний по значению элемент, получающийся при упорядочивании набора по возрастанию или убыванию. Для четных медиану обычно определяют как среднее арифметическое двух средних отсчетов упорядоченной последовательности. Медианный фильтр представляет собой оконный фильтр, последовательно скользящий по массиву сигнала, и возвращающий на каждом шаге один из элементов, попавших в окно фильтра. Таким образом, медианная фильтрация осуществляет замену значений отсчетов в центре окна медианным значением исходных отсчетов. На практике длина окна фильтра для упрощения обработки данных, как правило, устанавливается с нечетным числом отсчетов. Следовательно, можно выделить два класса медианных фильтров: фильтры с минимальной длиной окна равной трем и фильтры с длиной окна более трех (к примеру, 5, 7, 9, 11, 13, 15 и т.д.).

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

Рис. 6. Скользящие медианы
(набор данных – окружности, окно W = 3 – сплошная кривая, окно W = 7 – пунктирная кривая)

Для того, чтобы найти значение скользящей медианы в точке X, вычисляется медиана значений ряда во временном интервале [X — delta, X + delta]. Соответствующее значение называется (2delta + 1)-точечной скользящей медианой. Исходя из этого, реализуем наименьший возможный медианный фильтр с длиной окна равной трем. Алгоритм следующий:

  1. Имеем набор данных (8-ми битных) A, B, C.
  2. Производим первую сортировку по убыванию: if (A B и логическую "1" на выходе LT при выполнении условия по входу B>A. Реализация условия (a Лицензионное соглашение 🙂

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

При реализации медианного фильтра в системах ЦОС следует обратить внимание на то, что при появлении импульсной помехи на границах окна предпочтительно варьировать длину окна, к примеру вести расчет с двумя длинами окон одновременно, либо, к примеру, использовать алгоритм быстрой медианной фильтрации [11]. Также следует учитывать фактор задержки выходного сигнала фильтров как «скользящего среднего», так и «скользящих медиан», определяемый порядком фильтра.

Ссылка на основную публикацию
Adblock detector