Главная » Программирование звука » Реализация КИХ-фильтров

0

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

Листинг 25.1. Простая реализация 32-элементного фильтра

While (/* Пока   не   закончились  отсчеты. */) {

float weights[32] = { … }; float *currentWeght = weights; float *currentSample = in; float result = 0;

// Отфильтровываем  один  отсчет (32 умножения  и  32 сложения).

for (int i=0; i<=32; i++)

result += *currentSample++ * * currentWeight++;

*out++ = result;

in++;

}

B  вышеприведенной  программе  основная  проблема  заключается  в  том,  что  для получения  каждого  отсчета  необходимо  32  умножения  и  32  сложения.  44100  отсчетов в секунду – это почти 1,5 миллиона умножений в секунду.

Вы  можете  уменьшить  это  значение  в  два  раза,  если  заметите,  что  весовые

значения  симметричны;  после  умножения  входного  отсчета  на  конкретное  весовое   значение   лучше   сохранить   это   произведение   для   дальнейшего   использования.  B  следующем  листинге  представлен  один  из  способов  реализации  подобного подхода.

Листинг 25.2. Использование меньшего количества операций умножения

// Массив из  32 последних  отсчетов, каждый   предварительно  взвешен

// 16 различными  значениями. float *pastWeightedSamples[32]; for (int i=0;i<32;i++)

pastWeightedSamples[i] = new float[16]; While (/* пока не   закончились  отсчеты */) {

// Сдвигаемся  вниз.

float *last = pastWeightedSamples[31];

for (int i=0; i<31;i++) {

float *t = pastWeightedSamples[i]; pastWeightedSamples[i] = last; last = pastWeightedSamples[i];

}

// Добавляем  новый   элемент в  массив (16 умножений). float weights [16] = { … };

for (int i=0;i<16;i++)

pastWeightedSamples[i]=weights[i]* *in;

// Суммируем, чтобы получить  выходные значения  (32 сложения).

float result = 0;

for (int i=0;i<16; i++)

result += pastWeightedSamples[i][i];

for (int i=16;i<32; i++)

result += pastWeightedSamples[i][32-i];

}

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

Округление  весов  изменит  частотную  характеристику.  Процесс  проектирования  хорошего  фильтра  часто  интерактивен:  вы  экспериментируете  с  различными приближениями   для   ускорения   реализации,   а   затем   используете   прямое   БПФ, чтобы  посмотреть,  какое  влияние  эти  изменения  оказывают  на  частотную  характеристику.

Фазовый сдвиг

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

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

БИХ-фильтры

При  разработке  КИХ-фильтров  нужно  принять  компромиссное  решение.  Для получения  крутых  срезов  необходимо  использовать  как  можно  больше  компонент, однако растущее их количество замедляет обсчет фильтра.

Одним  из  способов  получения  крутого  среза  без  введения  дополнительных компонент  является  применение  обратной  связи.  Простой  пример  такого  фильтра показан на рис. 25.10. Одним из основных  отличий от фильтров, которые мы рассматривали  до  сих  пор,  заключается  в  том,  что  если  подать  импульс  на  такой фильтр,  на  выходе  постоянно  будет  сигнал.  По  этой  причине  фильтры,  содержащие  обратную  связь,  часто  называются  фильтрами  с  бесконечной  импульсной  характеристикой, или БИХ-фильтрами (infinite impulse response).

Синтез с использованием фильтров

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

Приложение А. Где можно взять исходные коды

CD-ROM,  который  прилагался  к  англоязычному  изданию  этой  книги,  содержал исходные  коды  на  разных  платформах,  а  также  демонстрационные  примеры  различных   программ,   свободно   распространяемые   в   сети   Internet.   Оригинальная, авторская  часть  этих  материалов  находится  в  соответствующем  разделе  Web-сайта издательства «ДМК» (www.dmk.ru) и доступна для скачивания.

Исходные коды

Каталог   Source содержит   исходные  коды   всех   программ,  использованных в  этой  книге  (а  также  несколько  файлов,  не  вошедших  в  печатную  версию).  Все файлы исходных кодов на языке C++ находятся в подкаталоге Common.

Заметим,  что  все  исходные  файлы  применяют  соглашение  UNIX  о  формате

конца   строки.   Каждая   строка   заканчивается   единственным   символом   LF   (символ  с  кодом  10).  Большинство  современных  редакторов  программ  поддерживают все  распространенные  соглашения  о  формате  конца  строки,  поэтому  на  практике это  не  должно  вызвать  проблем.  Однако  при  работе  с  некоторыми  простыми  текстовыми редакторами (включая Windows NotePad и Mac OS SimpleText) y вас возникнут проблемы с такими файлами.

Источник: Кинтцель Т.  Руководство программиста по работе со звуком = A Programmer’s Guide to Sound: Пер. с англ. М.: ДМК Пресс, 2000. 432 с, ил. (Серия «Для программистов»).

По теме:

  • Комментарии