ТолкованиеПеревод
Цифрова́я обрабо́тка сигна́лов (англ. digital signal processing, DSP), ЦОС — преобразование сигналов, представленных в цифровой форме.
Любой непрерывный (аналоговый) сигнал s(t) может быть подвергнут дискретизации по времени и квантованию по уровню (оцифровке), то есть представлен в цифровой форме. Если частота дискретизации сигнала Fd не меньше, чем удвоенная наивысшая частота в спектре сигнала Fmax (то есть ), то полученный дискретный сигнал s(k) эквивалентен сигналу s(t) (см. теорему Котельникова). При помощи математических алгоритмов s(k) преобразуется в некоторый другой сигнал s1(k) имеющий требуемые свойства.
Различают методы обработки сигналов во временной (англ. time domain) и в частотной (англ. frequency domain) области. Эквивалентность частотно-временных преобразований однозначно определяется через преобразование Фурье.
Содержание
|
Wikimedia Foundation. 2010.
Игры ⚽ Поможем решить контрольную работу
Всем привет!
Давно хотел начать цикл статей, посвященных цифровой обработке сигналов на ПЛИС, но по разным причинам так и не мог к этому приступить. К счастью, в распоряжении появилось немного свободного времени, поэтому периодически я буду публиковать материалы, в которых отражены различные аспекты, связанные с ЦОС на ПЛИС.
В этих статьях я постараюсь минимизировать теоретическое описание тех или иных алгоритмов и большую часть материала посвятить практическим тонкостям, с которыми столкнулся лично я и мои коллеги, и знакомые, так или иначе связанные с разработкой на ПЛИС. Надеюсь, данный цикл статей принесет пользу, как начинающим инженерам, так и матёрым разработчикам.
В первой части рассмотрим простейший CIC фильтр. CIC – «cascaded integral-comb», по-русски – каскадный интегрально-гребенчатый фильтр типа БИХ (с бесконечной импульсной характеристикой). Класс таких фильтров широко используется в задачах, где требуется работа на нескольких скоростях передачи данных. CIC фильтры активно применяются для децимации и интерполяции, то есть для понижения и повышения частоты дискретизации. CIC фильтр сам по себе есть не что иное, как фильтр нижних частот (ФНЧ). То есть такой фильтр пропускает нижние частоты спектра, обрубая верхние за частотой среза. АЧХ фильтра строится по закону ~sin(x)/x. Главное преимущество CIC фильтров состоит в том, что они совсем не требуют операций умножения (в отличие от другого типа фильтров, например, КИХ).
Введение Из названия можно догадаться, что в основе CIC фильтра лежит два базовых блока: интегратор и гребенчатый фильтр (дифференциатор). Интегрирующее звено (int) представляет собой обычный БИХ-фильтр первого порядка, выполненный как самый простой аккумулятор. Гребенчатый фильтр (comb) является КИХ-фильтром первого порядка.Между интегратором и гребенчатым фильтром часто ставится узел повышения или понижения частоты дискретизации в целое число раз — R.
Формулы для передаточной и амплитудно-частотной характеристик приведены ниже:
Более подробно со всеми математическими выкладками обо всех аспектах децимации и интерполяции можно почитать в других источниках, на которые в конце статьи я приведу ссылки.
Если CIC-фильтр используется для понижения частоты дискретизации, то он называется дециматором. В таком случае первым звеном идет интегратор, затем происходит понижение частоты дискретизации и, наконец, идет звено дифференцирующего фильтра.
ИнтерполяторЕсли CIC-фильтр используется для повышения частоты дискретизации, то он называется интерполятором.
В таком случае дифференцирующее звено стоит на первом месте, затем происходит повышение частоты дискретизации и, наконец, идет звено интегрирующего фильтра.В зависимости от задержки входного сигнала в дифференцирующем звене, можно получать различные частотные характеристики фильтра. Известно, что при увеличении параметра задержки D, увеличивается количество «нулей» амплитудно-частотной характеристики (АЧХ) фильтра.
Заметим, что для связки интегратора и гребенчатого фильтра (CIC фильтра) при увеличении параметра D в дифференцирующей секции нули АЧХ смещаются к центру – изменяется частота среза фильтра Fc = 2 pi / D.
Каскадное соединение интегратора и гребенчатого фильтра без операций децимации и интерполяции называется фильтром «скользящего среднего». Уровень первого бокового лепестка такого фильтра составляет всего -13 дБ, что достаточно мало для серьезных задач ЦОС.
В силу линейности математических операций, происходящих в CIC фильтре возможно каскадное соединение нескольких фильтров подряд.
На следующем рисунке приведена АЧХ фильтра при различных параметрах коэффициента дискретизации 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:
Sample Rate Change Specification:
Hardware Oversampling Specification: эти параметры влияют на выходную частоту дискретизации, количество тактов, требуемых для обработки данных. От этих параметров также зависит уровень параллелизма внутри ядра и количество занимаемых ресурсов.
* — диапазон зависит от общих настроек и коэффициента дискретизации R.
CIC Compiler — Вкладка 2:
Numerical Precision:
Optional:
Control Options:
CIC Compiler — Вкладка 3:
Summary — эта вкладка в виде списка отражает конечные настройки фильтра (количество каскадов, параметры частот, разрядность входных, выходных и промежуточных данных, задержка в фильтре и т. д.).
В левой части окна CIC Compiler есть три полезные дополнительные вкладки:
После установки всех настроек необходимо нажать на кнопку Generate. В результате приложение CORE Generator через какое-то время выдаст целый набор файлов, из которых нам нужны самые основные:
Если вы работаете в среде 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 фильтры обладают рядом особенностей:
Литература
Продолжение следует…
J ULIUS O. S MITH III
Центр компьютерных исследований в музыке
и акустика (CCRMA)
В этом учебном пособии мы начинаем первую часть из четырех статей, посвященных цифровым фильтрам. В этой серии будет рассмотрено сочетание теории и практики цифровых фильтров, и в конце мы получим более полное представление о том, что такое цифровые фильтры, как они работают и какие методы фильтрации лучше всего подходят для различных ситуаций.
Эта первая часть серии учебных пособий представит ключевые концепции, которые мы используем, когда говорим о цифровых фильтрах:
Что такое фильтр?
Фильтр — это система, формирующая выходной сигнал на основе входного сигнала. Как выразился гуру DSP Джулиус О. Смит III,
Любая среда, через которую проходит музыкальный сигнал, независимо от его формы, может рассматриваться как фильтр. Однако обычно мы не думаем о чем-то как о фильтре, если только он не может каким-то образом изменить звук. Например, провод динамика не считается фильтром, а динамик (к сожалению). Различные гласные звуки в речи образуются в основном за счет изменения формы полости рта, что меняет резонансы и, следовательно, характеристики фильтрации голосового тракта. Цепь регулировки тембра в обычном автомобильном радиоприемнике является фильтром, как и усиление низких, средних и высоких частот в стереофоническом предусилителе. Графические эквалайзеры, ревербераторы, эхо-устройства, фазовращатели и сети кроссовера динамиков являются дополнительными примерами полезных фильтров в аудио. Есть и примеры нежелательной фильтрации, например, неравномерное усиление определенных частот в помещении с «плохой акустикой». Говорят, что известный мастер обработки сигналов заметил: «Если подумать, все является фильтром».
Когда мы говорим о фильтрах как музыканты и пользователи Max, мы обычно имеем в виду системы, которые изменяют частотный состав входящих сигналов. Это относится не ко всем фильтрам — например, фильтр allpass изменяет только фазу своих входов, а не частоту. Как пользователь Max, вы уже знакомы с идеей сигнала как потока чисел с плавающей запятой. Система преобразует этот сигнал — вы можете думать о системе как о функции или алгоритме. В учебниках по DSP вы обычно увидите схему, на которой система показана в виде прямоугольника между двумя формами волны, входным сигналом x и выходным сигналом y:
Время и частота
Если вы используете фильтр, для вас не должно иметь большого значения, что происходит с сигналом во временной области — нас больше интересует, что происходит с частотами. Однако при установке исправлений или программировании вы, скорее всего, будете работать во временной области. Имея это в виду, рекомендуется убедиться, что вы знаете, как перемещаться между двумя доменами.
Для этого нужно уметь пользоваться преобразованием Фурье. Скорее всего, вы слышали о БПФ (быстром преобразовании Фурье), и это именно то, на что это похоже — более быстрый способ выполнить преобразование Фурье. Если вы не знакомы с БПФ и хотели бы лучше понять их, вы можете посмотреть это видео Гранта Сандерсона из 3Blue1Brown и этот интерактивный веб-сайт Джека Шедлера. Чтобы узнать больше о практических деталях в качестве пользователя Max, перейдите к учебным пособиям по объектам fft~ и ifft~ в учебных пособиях по анализу MSP Cycling ’74, а также к серии видеороликов Advanced Max FFT.
Короче говоря, БПФ — это наш ключ к преобразованию между временным и частотным представлениями одного и того же сигнала. Имейте это в виду, потому что это скоро пригодится!
Линейные стационарные системы (LTI) — наши друзья
Говоря о системах, в расчетах полезны свойства линейности и неизменности во времени. К счастью, многие реальные системы (и фильтры) обладают обоими этими свойствами и значительно упрощают работу с окружающей их математикой. В частности, системы LTI позволяют нам легко работать с анализом Фурье, одним из наиболее полезных элементов набора инструментов DSP.
Чтобы система была линейной, она должна удовлетворять двум свойствам: 1. Масштабирование: результат можно умножить только на скаляр. Это означает, что вы можете умножать входные данные только на постоянное значение, например функцию f(x) = -2x или g(x) = 0,1x, или функцию типа h(x,y) = xy или p(x) = sin(x) не удовлетворяет этому свойству.
2. Наложение: не имеет значения, если вы добавите два сигнала до или после системы. Конечный результат должен быть таким же.
Преимущество линейности в том, что она позволяет легко разбивать входные данные на части и выполнять вычисления отдельно для этих частей, прежде чем мы снова соберем их вместе в конце.
Поначалу свойство неизменности во времени может показаться запутанным. Как может произойти что-то интересное с сигналом, если со временем ничего не меняется? Осторожный! Мы лишь следим за тем, чтобы система (наша функция, алгоритм или черный ящик, в зависимости от того, как вы об этом думаете) не менялась с течением времени, а не фактические данные, проходящие через нее.
Инвариантность во времени иногда называют инвариантностью к сдвигу, потому что это означает, что вы можете сместить сигнал во времени, и это не изменит того, как система его обрабатывает.
Импульсная, частотная и переходная характеристики
Когда мы говорим о характеристиках фильтра, мы часто обращаем внимание на его «импульсную характеристику». Другими словами, мы хотим описать, как выглядит выходной сигнал фильтра, когда он посылает один очень короткий выброс.
Причина, по которой импульсная характеристика является хорошим «тестовым сигналом», заключается в том, что бесконечно короткий импульс во временной области бесконечно широк в спектральной области. Это означает, что импульс содержит все возможные частоты. (Если быть верным с технической точки зрения, поскольку наш фактический импульс должен занимать по крайней мере одну выборку, он не может быть бесконечно узким и, следовательно, не может содержать все частоты. Тем не менее, он достаточно близок для реальных приложений.)
Полезность импульсного отклика становится понятнее, когда мы говорим о нашем приятеле — системе LTI. В системе LTI импульсная характеристика содержит всю информацию о фильтре.
Из импульсной характеристики мы можем провести преобразование Фурье и найти «частотную характеристику» фильтра, с которой вы, возможно, знакомы.
(Изображение взято с https://docs.cycling74.com/max8/tutorials/08_filterchapter01)
Если взять интеграл импульсной характеристики (или, точнее, в мире цифровых сигналов взять скользящую сумму) , вы также можете найти «ступенчатую характеристику», которая показывает, как система реагирует на резкие переходные процессы. Вы можете представить это как ввод множества нулей в систему, а затем резкое переключение на все единицы и просмотр того, как выглядит результат. Как упоминалось ранее, все эти представления содержат одну и ту же информацию — они просто представлены по-разному.
Источник: Руководство для ученых и инженеров по цифровой обработке сигналов, авторское право © 1997-1998 Стивена В. Смита. Для получения дополнительной информации посетите веб-сайт книги по адресу: www.DSPguide.com
С помощью всех этих различных представлений мы можем узнать, насколько хорошо наш фильтр выполняет работу, которую мы от него хотим. Например, если нам нужен фильтр с крутым спадом, мы можем проверить, насколько хорошо он это делает, посмотрев на частотную характеристику. По мере того, как мы узнаем больше о фильтрах, мы увидим, что не существует одного фильтра, подходящего для каждой работы, но для каждой работы может быть настроен фильтр.
Как сделать цифровой фильтр?
Возможно, вы удивитесь, а можете и не удивиться, узнав, что все, что делает фильтр, это берет средневзвешенное значение буфера сэмплов, проходящих через него! Есть два способа сделать это: с помощью свертки или с помощью рекурсии.
Свертка
На рисунке ниже показан процесс свертки. Мы говорим, что входной сигнал x свертывается ядром, связанным с системой, для получения выходного сигнала y. (Это ядро — это то, как мы взвешиваем входные образцы в нашем средневзвешенном значении.) Синие прямоугольники — это образцы, значения которых известны, а белые прямоугольники — это образцы, которые неизвестны. Для каждой выходной выборки в y ядро скользит вперед, выравнивая свое крайнее правое поле с выходной выборкой для вычисления. Затем для каждой совпадающей пары значений ядра и входных значений они перемножаются, а затем складываются, чтобы получить выходное значение. Как только это будет завершено, ядро перемещает вправо еще одну выборку и снова выполняет расчет.
Несколько вопросов для размышления об этой иллюстрации, чтобы проверить ваше понимание:
Тем, кто перечитал недавнюю статью Грегори о блок-диаграммах и gen~, может быть интересно увидеть соответствующую блок-схему для этого примера свертки:
Теперь, когда мы рассмотрели один конкретный пример, давайте попробуем обобщить алгоритм свертки в уравнение.
Во-первых, начните со сложений и умножений:
Чтобы обобщить, вы можете заменить в переменных значения x:
Затем сделать то же самое для значений h ядра:
Если хочешь, можешь остановиться здесь. Однако, чтобы сделать это обобщенное уравнение более компактным, вы можете использовать запись суммирования. Обозначение суммирования полезно для записи длинных повторяющихся сумм. В нашем примере сумма достаточно короткая, чтобы ее можно было записать, но бывают случаи, когда вы складываете сотни чисел, следующих шаблону, и вам не хотелось бы записывать это полностью. Поскольку в DSP повсюду появляются длинные суммы, стоит сделать небольшое отступление, чтобы узнать, как они работают. (Если вы уже знакомы с суммированием, не стесняйтесь перейти к окончательной форме нашего уравнения.)
Обратите внимание на закономерность в только что написанном уравнении: первый член использует первое значение h (с индексом 0) и самое правое значение x (с индексом t_n), второй член использует второе значение h (по индексу 1) и второе справа значение x (по индексу t_n — 1) и так далее. Если вы присвоите индексу переменную n, то в нашем примере вы увидите, что n находится в диапазоне от 0 до 2. Записано в нотации суммирования:
В этой нотации индекс определяется как n и инициализируется равным 0. и пишется под знаком сигма (∑). Конец диапазона пишется над сигмой.
Чтобы закончить общее уравнение для свертки, давайте напишем, как выглядела бы сумма, если бы размер ядра также был переменной. Назовем его N. Поскольку мы описываем любой t, а не только конкретный t_n из нашего примера, давайте также опустим нижний индекс.
Поскольку свертка является очень полезной операцией, вы также можете использовать оператор «звездочка», чтобы записать это уравнение еще короче.
Примечание. Существует разница между отображением звездочки между двумя функциями и двумя переменными или значениями. В первом случае это означает свертку, а во втором — умножение. Запутанно, да, но это то, на чем застряли математики. Обычно вы не увидите, чтобы звездочка использовалась для обозначения умножения в документах/книгах/статьях DSP и т. д., поэтому возможная путаница не так вероятна, как вы могли бы опасаться.
Причина рассмотрения такого рода обобщенных уравнений заключается в том, что это простой способ математически описать фильтры без рисования каких-либо диаграмм. Уравнения такого типа, описывающие фильтры, называются разностными уравнениями. (Вы поймете, почему они называются «разностными», а не «суммирующими уравнениями», позже в этой серии, когда мы будем говорить о БИХ-фильтрах.)
Импульсные характеристики сверточных фильтров
, вернемся к фильтру, который мы сделали и проиллюстрировали. Чтобы увидеть, как работает фильтр, помните, что импульсные характеристики — лучший способ узнать о системе. Давайте посчитаем несколько образцов импульсной характеристики вручную.
Из этого упражнения видно, что свернув импульс с ядром, вы получите на выходе обратную версию ядра! Вы можете понять, что это не просто удача — для любой LTI-системы ядро исходит непосредственно из импульсной характеристики.
Вооружившись полученными знаниями, вы можете начать думать о том, как мы можем разработать фильтр, использующий свертки. В нашем первом примере мы попытались поиграть со значениями ядра и посмотрели, какие результаты мы можем получить. Наш другой вариант — пойти в другом направлении — начать с выходного сигнала, который нам нужен, и вычислить ядро.
Для этого помните, что вы можете использовать преобразование Фурье, чтобы найти частотную характеристику из импульсной характеристики. Часто вы знаете желаемую частотную характеристику, поэтому оттуда можно найти ядро фильтра. Шаги следующие:
Фильтр такого типа (использующий свертки) называется фильтром с конечной импульсной характеристикой (КИХ). Простой способ запомнить это состоит в том, что импульсный отклик должен иметь конечную длину, чтобы выполнять с ним свертку. Следствие этого часто используется в определениях КИХ-фильтров в учебниках: импульсные характеристики всегда затухают до нуля за конечное время при использовании КИХ-фильтров.
Мы более подробно рассмотрим КИХ-фильтры во второй части этой серии, а пока давайте кратко рассмотрим другой тип фильтров, рекурсивные фильтры.
Рекурсия
Внимательные читатели могли заметить кое-что об алгоритме свертки и блок-диаграмме КИХ — в выходных данных используются только входные выборки. Это означает, что мы используем только циклы прямой связи, а не обратную связь.
Если бы вы использовали как обратную связь, так и прямую связь, вы бы создали рекурсивный фильтр. Обратите внимание, что для рекурсивных фильтров мы используем термины «коэффициенты обратной связи» и «коэффициенты прямой связи» вместо «ядро».
Вы, вероятно, уже видели блок-схемы рекурсивных фильтров, если рассматривали биквадратные фильтры.
(Изображение: https://en.wikipedia.org/wiki/Digital_biquad_filter)
Как только вступают в действие петли обратной связи, уже нет гарантии, что импульсная характеристика снизится до нуля за конечное время. (Однако это не всегда так. Есть некоторые ситуации, когда рекурсию можно использовать для создания КИХ-фильтров, но это тема для другого раза.) Эти фильтры с бесконечно затухающими импульсными характеристиками называются фильтрами с бесконечной импульсной характеристикой (БИХ). . Проводя собственное исследование, вы также можете услышать, что их называют рекурсивными фильтрами или фильтрами обратной связи.