Параметр Taps для Frequency Xlating FIR Filter, что это?

В наших прошлых примерах мы уже встречались с блоком Frequency Xlating FIR Filter.  И как вы можете помнить у этого блока есть загадочное поле Taps (отсчеты). Мы даже вводили туда какую-то муру, примерно нам понятную (полоса фильтра, ширина переходного периода и др.). Но почему «отсчеты»? Зачем они нам нужны? Попробуем с этим разобраться.

Для начала откроем раздел Filter Design официального сайта. Читаем: «Многие блоки в GnuRadio берут массив комплексных или реальных отсчетов как параметр». Мда… Не слишком богато. Хотя ниже приведен список функций (low_pass, high_pass и прочие). Логично предположить что если мы хотим реализовать, допустим, режекторный полосовой фильтр, то нам следует использовать функцию band_reject, которая видимо и сделает нам «массив комплексных или реальных отсчетов» для блока Frequency Xlating FIR Filter. Но что это за отсчеты? Зачем? Полный мрак.

Для разгона тумана невежества, возьмем какую-нибудь хорошую книжку по цифровой обработке сигналов, и попробуем прочитать главу о КИХ фильтрах. У меня этой книгой является «Цифровая обработка сигналов» Ричарда Лайонса. Нет книжки? Вперед в Гугл!
Не поняли? Ничего страшного, сейчас я изложу принцип работы КИХ фильтра «в переводе Голбина».

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

Sample Value	
0 12	
1 34	
2 24	
3 11	
4 21	
5 39	
6 29	
7 5	
8 9	
9 35	
10 33	
11 27	
12 14	
13 57	
14 24
15 22	
16 18	
17 26	
18 33
19 21
20 19
21 18
22 18
23 10
24 15
25 16

Первое значение — номер отсчета, второе — текущее значение. На графике это выглядит так:

inputdata_fir1

Как видим, значения сильно скачут, а мы поставим себе задачу сгладить эти скачки. Для  сглаживания мы применим усредняющий фильтр. Как уже можно догадаться из его названия он выдает некие средние значения для n-ого количества входных значений.
Какое количество значений мы возьмем? Ну, давайте 5
Начинаем усреднять.

Отсчет 0: (12 + ? + ? + ?  + ?) /5 = ?
Отсчет 1: (34 + 12 + ? + ?  + ?)/5 = ?
Отсчет 2: (24 + 34+ 12 + ?  + ?)/5 = ?
Отсчет 3: (11 + 24 + 34 +12  + ?)/5 = ?
Отсчет 4: (21 + 11 + 24 + 34  + 12)/5 = 20,4
Отсчет 5: (39 + 21 + 11 + 24  + 34)/5 = 25,8
Отсчет 6: (29 + 39 + 21 + 11  + 24)/5 = 24,8
Отсчет 7: (5 + 29 + 39 + 21  + 11)/5 = 21

Отсчет 26: (0 + 16 +15 + 10  + 18)/5 = 11.8
Отсчет 27: (0 + 0 + 16 + 15 + 10)/5 = 8,2
Отсчет 28: (0 + 0 + 0 + 16 + 15)/5 = 6,2
Отсчет 29: (0 + 0 + 0 + 0  + 16)/5 = 3,2
Отсчет 30: (0 + 0 + 0 + 0  + 0)/5 = 0

В общем виде мы можем это записать как:
Latex formula

Построим график, и поглядим как выглядят сглаженые данные сейчас:
Неплохо, неплохо! Теперь нарисуем блок-схему того что мы делали.
fir_blocks1Мы брали отсчеты, складывали их, а затем умножали на 1/5. Но я предалгаю немного модифицировать нашу схему. Давайте сначала умножим каждый отсчет на 1/5 а затем просуммируем. Зачем? Скоро увидите.
fir_blocks2Эту схему мы можем представить в виде записи:
Latex formula

Каждый отсчет мы умножаем на коэффициент равный в нашем случае Latex formula. Давайте обзначим этот коэффициент как Latex formula

Latex formula

Где
Latex formula

А теперь, остановимся, поскольку это решающий момент. Мы реализовали усредняющий КИХ-фильтр. Что же мы делали? Мы всего лишь брали отсчеты, умножали их на коэффициенты, а затем суммировали! Т.е получается что для построения КИХ фильтра нам нужно всего лишь одно! Особые коэффициенты умножения.
Да, вот так все просто. Вся суть КИХ фильтра свелась к умножению на коэффициенты и последующему суммированию. В нашем случае все коэффициенты были равны одной пятой, и у нас вышел усредняющий фильтр. Если бы мы использовали в качестве коэффиентов другие числа — поведение фильтра было бы иное.

Теперь нам пора вернуться к тому, с чего мы начали. К параметру Taps. Думаю вы  теперь догадываетесь, что данный параметр хранит всего лишь коэффициенты для умножения для поступающих в блок данных. Так как  для реализации определенного типа фильтра (полосовой, режекторный, ФВЧ и т.д.) нужно вычислять свой набор коэффициентов, для их нахождения и служат функции low_pass(),  high_pass() и прочие.

Как я написал выше, для реализации фильтра нам нужно знать коэффициенты. Для вычисления коэффицентов фильтра придуманы различные алгоритмы. В блоке Frequency Xlating FIR Filter используется так называемый метод замен Ремеза (так же известный как метод Паркса-Маклеллана, или скромно «оптимальный метод»). Позволю себе процитировать Ричарда Лайонса который пишет: «Просто запомните, что метод замен Ремеза дает фильтры похожие на фильтры Чебышева, АЧХ  которых настолько приближена к требуемой харрактеристике, насколько это возможно при заданном количестве ответвлений.»

Кстати, может быть вы хотите реализовать свой КИХ фильтр? GnuRadio поможет вам и тут. В составе GnuRadio идет утилита «GnuRadio Filter Design Tool» для расчета параметров фильтра.
Откройте консоль и выполните команду

gr_filter_design

Откроется окно
gnuradiofilterdesigntool1Можете ввести какие-нибудь значения, и поглядеть как будут выглядеть параметры фильтра.
Кстати, обратите внимание на вкладку «Filter Coefficients»
gnuradiofilterdesigntool2Здесь вы можете увидеть то что нас так интересовало — коэффициенты для умножения на отсчеты

 

На сегодня все. Надеюсь моя статья помогла разобраться с КИХ фильтрами вообще и с параметром Taps в частности.

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

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