Реалізація КИХ-фільтрів

Описаний вище основний метод проектування досить простий Однак безпосередня реалізація одержані фільтрів набагато складніше, ніж можна подумати B лістингу 251 показаний очевидний спосіб реалізації такого фільтра

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

While (/ * Поки не закінчилися відліки * /) {

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

/ / Відфільтровує один відлік (32 множення і 32 додавання)

for (int i=0 i&lt=32 i++)

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

*out++ = result

in++

}

B вищенаведеної програмі основна проблема полягає в тому, що для отриманнякожного відлікунеобхідно 32 множення і 32 додавання 44100 відліків в секунду – це майже 1,5 мільйона умножений в секунду

Ви можете зменшити це значення в два рази, якщо помітите, що вагові

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

Лістинг 252 Використання меншої кількості операцій множення

/ / Масив з 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&lt31i++) {

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

}

/ / Додаємо новий елемент в масив (16 множень) float weights [16] = {..}

for (int i=0i&lt16i++)

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

/ / Підсумовуємо, щоб отримати вихідні значення (32 додавання)

float result = 0

for (int i=0i&lt16 i++)

result += pastWeightedSamples[i][i]

for (int i=16i&lt32 i++)

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

}

Для подальшого скорочення кількості операцій множення, ви можете спробувати відрегулювати деякі ваги Наприклад, якщо ви робите два вагових значення рівними один одному, то економите на одному множенні Якщо ви змінюєте вагу на нульовий, то також економите на одному множенні

Округлення ваг змінить частотну характеристику Процес проектування хорошого фільтра часто інтерактивний: ви експериментуєте з різними наближеннями для прискорення реалізації, а потім використовуєте пряме ШПФ, щоб подивитися, який вплив ці зміни надають на частотну характеристику

Фазовий зсув

Одним з показників, що впливають на процес проектування хорошого фільтра, є фазовий зсув Оскільки ви затримуєте сигнали в часі, їх фаза змінюється (ось чому працюють цифрові фільтри) Внаслідок цього не можна уникнути відповідного зсуву по фазі частотних коливань вихідного сигналу (величина фазового зсуву визначається за допомогою ШПФ для параметрів фільтра)

Уважно підходячи до процесу проектування, можна мінімізувати (або навіть усунути) даний фазовий зсув, однак це передбачає використання методів, розмова про яких виходить за рамки даної книги

Бих-фільтри

При розробці КИХ-фільтрів потрібно прийняти компромісне рішення Для отримання крутих зрізів необхідно використовувати якомога більше компонент, проте зростаюче їх кількість уповільнює обрахування фільтра

Одним із способів отримання крутого зрізу без введення додаткових компонент є застосування зворотного звязку Простий приклад такого фільтра показаний на рис 2510 Одним з основних відмінностей від фільтрів, які ми розглядали дотепер, полягає в тому, що якщо подати імпульс на такий фільтр, на виході постійно буде сигнал З цієї причини фільтри, що містять зворотний звязок, часто називаються фільтрами знескінченною імпульсною характеристикою, або Бих-фільтрами (infinite impulse response)

Синтез з використанням фільтрів

Корпуси музичних інструментів ретельно спроектовані для відтворення певних звуків Один із способів формування таких характерних звуків використання фільтрації Відбитки всередині інструменту підсилюють певні звуки і послаблюють інші зовсім як цифровий фільтр Таким чином, ви можете використовувати цифрові фільтри для ефективного синтезу звучання деяких інструментів Алгоритм коливається струни, розглянутий у главі 21, простий приклад практичної реалізації цієї ідеї

Додаток А Де можна взяти вихідні коди

CD-ROM, який додавався до англомовного видання цієї книги, містив вихідні коди на різних платформах, а також демонстраційні приклади різних програм, вільно поширювані в мережі Internet Оригінальна, авторська частина цих матеріалів знаходиться у відповідному розділі Web-сайту видавництва «ДМК» (wwwdmkru) І доступна для скачування

Вихідні коди

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

Зауважимо, що всі вихідні файли застосовують угоду UNIX про формат

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

Джерело: Кінтцель Т Керівництво програміста по роботі зі звуком = A Programmers Guide to Sound: Пер з англ М: ДМК Пресс, 2000 432 с, іл (Серія «Для програмістів»)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*