Шпаргалка по работе DSP фильтров

25 сентября 2023

При погружении в цифровую обработку сигналов (DSP, digital signal processing) на начинающего разом сваливается изрядное количество информации. По своему опыту могу сказать, что разобраться в ней не так-то просто. Также непросто понять, какая информация является ключевой, а какая — второстепенной, которую при первом прочтении можно и пропустить. Давайте же познакомимся с основными действующими лицами в мире DSP, рассмотрим связи между ними, и попытаемся понять, зачем все это нужно.

Приведенные ниже иллюстрации были позаимствованы из замечательной книги Understanding Digital Signal Processing, 3rd Edition, автор Richard Lyons. Если вы серьезно интересуетесь DSP, вам стоит ознакомиться с ней целиком. Также вас может заинтересовать ранее опубликованный в этом блоге пост Шпаргалка по математике, связанной с I/Q-сигналами, если вдруг вы его пропустили.

Зачем все это?

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

Наверняка вы слышали о Software Defined Radio, или SDR. Традиционно SDR объясняется на пальцах, что дескать это «отладчик для радио», точно так же как осциллограф является отладчиком для аналоговых сигналов в электрических цепях. Это до какой-то степени верно в контексте RTL-SDR, HackRF, LimeSDR, и подобных устройств. Но это лишь верхушка айсберга. В более широком смысле SDR — это подход к проектированию приемников и передатчиков, при котором аналоговая часть устройства максимально сокращается, а все, что может быть реализовано программно, реализуется программно (реализация на FPGA тоже считается «программной»). RTL-SDR, HackRF, и так далее — это лишь частные случаи устройств, реализованных таким образом.

Часто SDR-трансиверы используют квадратурный (де)модулятор:

Структурная схема квадратурного демодулятора

Сигналы I и Q оцифровываются при помощи АЦП, а вся дальнейшая обработка происходит программно, например, на микроконтроллере. Качественно, идея та же, что и в приемнике прямого преобразования с подавлением зеркального канала, только аналоговые цепи после квадратурного демодулятора заменяются программными реализациями. На передачу, соответственно, наоборот — задача состоит в том, чтобы получить цифровые сигналы I и Q как можно позднее. Затем они переводятся в аналоговые при помощи ЦАП, идут на I/Q-модулятор, и далее в УМ, ФНЧ и, наконец, в антенну.

Конструкция получается дешевле, проще и компактнее. Параметры цифровых фильтров намного превосходят параметры аналоговых. Притом, эти параметры можно менять на лету. Можно выводить спектрограмму, что упрощает работу на поиск. Плюс к этому, дорабатывать и обновлять прошивку проще, чем железо. Практически все радиолюбительские трансиверы, выпущенные за последние 10 лет, в той или иной мере являются SDR.

Некоторые SDR трансиверы могут быть довольно прожорливыми, но это только потому что производитель решил не оптимизировать их по энергопотреблению. Так, Elecraft KX3 и Lab599 TX-500 являются SDR-трансиверами, но потребляют лишь 180 мА и 110 мА на прием соответственно. Не всякий супергетеродин может похвастаться тем же.

Впрочем, сильные и слабые стороны есть у всего, не исключая SDR. Реальный недостаток SDR, который часто встречается на практике, заключается в слабом подавлении зеркального канала. Обычно оно составляет порядка 45 dB. При этом зеркальный канал находится близко к желаемой частоте приема. Супергетеродин тоже имеет зеркальные каналы, притом, во множественном числе. Однако они находятся далеко от желаемой частоты и при грамотном дизайне редко вызывают проблемы. Другой недостаток SDR заключается в слабой изолированности аналоговой части приемного тракта от цифровой, так как они перетекают одна в другую. На практике это может проявиться, и часто проявляется в коммерческих продуктах, в виде пораженных частот. Бороться с пораженными частотами — это большой головняк.

Помимо SDR и не-SDR трансиверов бывают еще гибридные. Если рассматривать исключительно приемный тракт, то в таком варианте делается одно или несколько преобразований ПЧ, как в супергетеродине, после чего сигнал оцифровывается. Это усложняет конструкцию и повышает стоимость изделия, но теретически позволяет получить лучшее из двух миров. Примерами гибридных трансиверов являются Yaesu FT-891 и Yaesu FT-991A.

Наконец, бывают трансиверы с прямой оцифровкой сигнала, Direct Data Capture, или DDC. По приему ВЧ сигнал идет с ДПФ прямо на АЦП. На передачу — наоборот, ЦАП сразу выдает ВЧ сигнал. Чтобы качественно реализовать эту идею, нужны крутые АЦП и ЦАП, и не менее крутая ПЛИС для дробления чисел. Это неизбежно приводит к увеличению стоимости устройства и ставит под сомнение целесообразность затеи. Тем не менее, такие трансиверы существуют, например, ICOM IC-7300.

Какие нужны АЦП и ЦАП?

Перевод аналогового сигнала в последовательность дискретных значений называется дискретизацией (sampling):

Дискретизация непрерывного сигнала

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

Одно дискретное значение (точка на нижнем графике) называется сэмплом. Количество сэмплов, передаваемое в единицу времени, называется частотой дискретизации. Сэмплы кодируются скольки-то битными целыми числами. Это количество бит называют разрядностью устройства, АЦП или ЦАП. Есть множество других параметров, не исключая стоимость, корпус, потребляемую мощность, нелинейность и ее зависимость от температуры, поддерживаемые протоколы, количество каналов, и так далее. Однако частота дискретизации и разрядность являются наиболее важными. Но почему?

Разрядность прямо связана с динамическим диапазоном:

DR [dB] = 20 × log10(pow(2,N) - 1)

Для больших N можно пренебречь -1, что дает эвристическую оценку «примерно 6 dB на один бит». Реальный динамический диапазон меньше из-за шумов в цепи, ошибок квантования, и так далее. В связи с этим вводится понятия эффективного количества бит. В 24-х битных АЦП эффективная разрядность обычно составляет от 17 до 19 бит. В результате вместо 144 dB динамического диапазона реально получается от 102 dB до 114 dB.

Это много или мало? В радиолюбительском деле 80 dB является нормальным динамическим диапазоном (от S0 до S9+25), а 100 dB считается выдающимся результатом. В трансиверах TX-500 и Маламут используются именно 24-х битные АЦП и ЦАП. В наши дни они доступны и стоят недорого.

Эффективную разрядность можно повысить при помощи передискретизации (oversampling) и дизеринга (dithering). Однако обсуждение данных техник уже выходит за рамки поста.

Что же касается частоты дискретизации, она должна быть достаточно большой для того, чтобы не возникал алиасинг.

Алиасинг

Теорема Котельникова, она же теорема Найквиста-Шеннона, гласит, что для оцифровки сигнала без искажений частота дискретизации должна быть в 2+ раз больше полосы сигнала. Если это условие не выполняется, возникает искажение под названием алиасинг.

Следующая картинка иллюстрирует суть проблемы:

Алиасинг

Серым цветом показан сигнал с частотой выше 1/2 частоты дискретизации. Точками показаны сэмплы, которые мы получем на выходе АЦП. Черным цветом показан сигнал, который будет ошибочно интерпретирован и/или восстановлен по данным сэмплам. Его частота не превышает 1/2 частоты дискретизации.

Выбор частоты дискретизации должен производиться с учетом несовершенства аналоговых фильтров. Допустим, вы хотите обрабатывать частоты до 20 кГц. Есть ФНЧ, который подавляет все более высокие частоты. Но переход между полосой пропускания и полосой подавления не моментальный. На АЧХ фильтра нужно найти частоту, где подавление составляет не менее N dB, и использовать частоту дискретизации по крайней мере в два раза выше этой частоты. Чем выше частота дискретизации, тем более простыми фильтрами можно обойтись.

Высокая частота дискретизации означает широкую полосу приема. Но чтобы обеспечить высокую частоту дискретизации, нужно быстро получать каждый отдельный сэмпл. Это означает снижение разрядности и, как результат, ухудшение динамического диапазона. В SDR типа USRP B200 и LimeSDR стараются получить широкую полосу, а динамический диапазон второстепенен. Поэтому в них используются 12-и битные АЦП.

В некоторых случаях алиасинг может быть выгоден. Так, благодаря алиасингу, можно оцифровывать ВЧ сигналы, пропущенные через подходящий ДПФ, используя сравнительно низкую частоту дискретизации. Это называется bandpass sampling или undersampling. Недостаток метода заключается в ухудшении SNR. Оно может быть скомпенсировано за счет увеличения разрядности при меньшей частоте дискретизации.

Fun fact! ICOM IC-7300 использует ЦАП Renesas ISL5857IAZ, 12-битный, 260 Msps. АЦП тщательно скрывается производителем, но считается, что это Linear Technology LTC2208-14, 14-битный, 130 Msps. Если это так, то для приема диапазона 4 метра (70 МГц) используется недодискретизация. Из разрядности АЦП можно сделать выводы о динамическом диапазоне.

DFT и FFT

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

Для дискретных сигналов используют дискретное преобразование Фурье, Discrete Fourier Transform, или DFT, а также обратное ему iDFT:

Прямое и обратное дискретное преобразование Фурье

Здесь m принимает значения от 0 до N-1. X(m) представляет собой отклик сигнала x(n) на частоте (m × F) / N, где F — частота дискретизации. Результат является комплексным числом a + j × b. Оно содержит информацию как о фазе, так и об амплитуде. Амплитуда вычисляется как sqrt(pow(a,2)+pow(b,2)), а фаза — как atan(b/a). Для вещественных x(n) справедливо X(N-m) = X*(m). То есть, для m > N/2 отклик равен числу, сопряженному к X(N-m). Эти отклики не несут информации, поскольку приходятся выше F/2. Их можно не считать.

Наличие в x(n) частот, которые не приходятся ровно на (m × F) / N, приводит к пропорциональному отклику в двух соседних «корзинах». Разрешение DFT можно увеличить, используя большее количество сэмплов N.

Преобразование Фурье корректно работает только для периодических функций. Мы же хотим применять его к какой попало последовательности сэмплов. Чтобы из какого попало сигнал стал походим на периодический, к нему применяют весовую функцию (window function). Часто используется функции Hanning или Hamming, но существует и множество других.

Быстрое преобразование Фурье, Fast Fourier Transform (FFT) — это оптимизация DFT для случая, когда размер входных данных N является степенью двойки. FFT требует O(N × log(N)) операций умножения против O(pow(N,2)) у DFT. Если N не является степенью двойки, после применения весовой функции сэмплы можно дополнить нулями до степени двойки. Это все еще более эффективно, чем в лоб считать DFT. Заметьте, что FFT считает то же самое, что и DFT. То есть, это не аппроксимация, а оптимизированная версия того же алгоритма.

Детали реализации FFT и iFFT выходят за рамки поста. Часто их не требуется знать, так как имеется готовая, отлаженная реализация. Ранее в этом блоге приводился пример использовани FFT и iFFT из библиотеки NumPy. Этот пример наглядно демонстрирует эффект под названием spectral leakage, возникающий, если не использовать весовую функцию. Найдите в примере строку:

x = x * np.hamming(N)

… и сравните результат с ней и без нее.

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

Импульсная характеристика (impulse response) — это реакция системы на единичный импульс при нулевых начальных условиях:

Импульсная характеристика в цифровой обработке сигналов

Это очень удобный примитив в контексте DSP фильтров. Если на входе фильтра сложная функция, ее можно нарезать на отдельные импульсы, и так далее. Импульсная характеристика FIR фильтра есть ни что иное, как коэффициенты данного фильтра.

FIR фильтры

FIR означает Finite Impulse Response, или конечная импульсная характеристика. Если подать на вход FIR фильтра единичный импульс, рано или поздно система придет в исходное состояние, и на выходе будут нули. FIR фильтр представляет собой массив из M коэффициентов. Зависимость n-го выхода фильтра y(n) от входа x(n) определяется по формуле:

Свертка, или конволюция

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

То же самое в виде структурной схемы, для фильтра из четырех коэффициентов:

Структурная схема FIR фильтра

Существует теорема о свертке, согласно которой свертка во временной области равносильна умножению в частотной области, и наоборот:

Теорема о свертке

Это очень удобно. Чтобы рассчитать коэффициенты FIR фильтра, нужно просто построить его АЧХ, а затем взять от нее iDFT или iFFT.

Требуемое количество коэффициентов в общем случае определяется методом проб и ошибок. Для ФНЧ есть такая эмпирическая формула:

numtaps = Atten/(22*(f_stop/f_sample - f_pass/f_sample))

Здесь Atten — желаемая аттенюация в полосе подавления, f_pass — полоса пропускания, f_stop — частота, на которой достигается заданная аттенюация, f_sample — частота дискретизации.

Заметьте, что DSP фильтры ничего не знают о частоте дискретизации. Это просто массивы коэффициентов. АЧХ цифрового фильтра выражается относительно частоты дискретизации. Например, ФНЧ может иметь частоту среза 1/4 частоты дискретизации. При частоте дискретизации 100 кГц частота среза придется на 25 кГц. Но при частоте дискретизации 200 кГц тот же самый фильтр будет иметь частоту среза 50 кГц.

IIR фильтры

IIR значит Infinite Impulse Response, или бесконечная импульсная характеристика. Если подать на вход IIR фильтра единичный импульс, система не вернется в исходное состояние. Зависимость выхода от времени может стремиться к нулю, но никогда его не достигнет. По крайней мере, в теории. На практике ноль может быть достигнут из-за ошибок округления.

IIR фильтры похожи на FIR, но имеют обратную связь между выходом и входом:

Структурная схема IIR фильтра

Соответственно, IIR фильтры имеют два набора коэффициентов. На картинке фильтр показан в так называемой Direct Form I. Можно изобразить его и иначе, однако данная форма считается наиболее устойчивой к нестабильности фильтра, вызванной неточностью представления чисел с плавающей запятой.

Преимущество IIR фильтров — в том, что они дают лучшую АЧХ по сравнению с FIR фильтрами при меньшей вычислительной сложности. Недостатков два. Первый заключается в нелинейной ФЧХ. FIR фильтры никогда не портят фазу исходного сигнала в полосе пропускания. Второй недостаток в том, что в общем случае IIR фильтры могут быть нестабильны. То есть, при неудачном стечении обстоятельств вместо фильтра может получиться генератор.

Является ли IIR фильтр стабильным, а также получить его АЧХ и ФЧХ, можно при помощи Z-преобразования, оно же преобразование Лорана. Z-преобразование можно рассматривать, как эквивалент преобразования Лапласа для случая дискретного времени. Как пользоваться Z-преобразованием наглядно показано в видео Z-Transform — Practical Applications на YouTube-канале Phil’s Lab.

Децимация и интерполяция

Децимация (decimation) — это просто выкидывание части сэмплов:

Децимация, она же downsampling

Чтобы не возникло алиасинга, перед децимацией сигнал следует прогонять через подходящий ФНЧ. Децимация позволяет сэкономить вычислительные ресурсы. Чем ниже частота дискретизации, тем проще вычисления.

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

Иногда возникает задача произвести децимацию во много раз, скажем, 100 или больше. В таких случаях вычислительно более выгодно разбить задачу на этапы. Например, сначала произвести децимацию в 25 раз, а затем в 4 раза. Суммарное количество коэффициентов в ФНЧ для двух этапов будет намного меньше, чем если производить децимацию в один этап. Общая эвристика здесь такая, что фактор децимации для последующего этапа должен убывать. Так децимация в 25 раз, а затем в 4 раза вычислительно эффективнее, чем в 10 раз, а затем еще в 10 раз.

Интерполяция (interpolation) — это децимация наоборот:

Интерполяция, она же upsampling

Эффективный и точный способ произвести интерполяцию заключается в том, чтобы заполнить недостающие сэмплы нулями (zero stuffing), а затем прогнать получившийся сигнал через ФНЧ. На приведенной иллюстрации 3/4 сэмплов представляют собой нули. Умножение на ноль — это операция, которую можно не делать. Данное обстоятельство позволяет применить ряд оптимизаций. Впрочем, обсуждение данных оптимизаций выходит за рамки поста.

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

Интерполяция и децимация могут быть использованы вместе для изменения частоты дискретизации в нецелое количество раз. Например, интерполяция в 57 раз с последующей децимацией в 8 раз приведет к повышению частоты дискретизации в 57/8 = 7.125 раз. Характерно, что интерполяционный фильтр и следующий за ним децимационный фильтр могут быть объединены в один, что позволяет сэкономить вычислительные ресурсы.

Децимация и интерполяция в 2 раза могут быть реализованы эффективно при использовании ФНЧ с частотой среза, равной 1/4 от частоты дискретизации. Дело в том, что фильтры с такой частотой среза имеют большое количеством нулевых коэффициентов. Децимация или интерполяция в заданную степень двойки реализуется через последовательное выполнение децимации или интерполяции в 2 раза. При децимации в 8 раз можно 3 раза использовать один и тот же ФНЧ. При интерполяции вычислительно эффективнее использовать разные фильтры. Число коэффициентов на более поздних итерациях может быть ниже, чем на более ранних.

Заключение

Ссылки по теме:

Само собой разумеется, данная шпаргалка не является исчерпывающим источником информации по DSP фильтрам. За кадром остались преобразование Гильберта, Z-преобразование, polyphase filters, IFIR фильтры (interpolated FIR), CIC фильтры (cascaded integrator-comb), FSF (frequency sampling filters), дифференциаторы (используются для демодуляции ЧМ), fast convolution, и другие вопросы. Они подробно рассматриваются в специализированной литературе, например, рекомендованной выше.

Дополнение: Рассчитываем DSP фильтры при помощи SciPy

Метки: , , , .


Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.