Слід зазначити, що згладжування здійснюється і для часової (бо здійснюється над самими відліками одночасно) і в неявному вигляді для частотної області. Дану операцію над сигналом можна здійснити декількома способами: застосуванням вікон (фільтрів) з відповідними коефіцієнтами (Блекмана-Херріса, Хафмана і т.д.), використанням поліномів регресії (експоненціального, Гаусового, Лангранжа, показового, гіперболічного, параболічного, логарифмічного тощо), а також таких функцій, як «ковзне середнє» і медіанна фільтрація. Наприклад, запис для найчастіше вживаного експотенційного згладжування має такий вид:
V = Vp * (1-K) + V * K; (1)
де: V – результат функції, Vp – вхідне значення (аргумент), K – коефіцієнт згладжування.
Основою цих поліномів є виродження точок (регресія). Звідси видно, що що ближче до "1" коефіцієнт згладжування, то вище ефект згладжування. Однак, використання поліномів регресії в цифровій техніці обумовлено рядом технічних труднощів через велику кількість арифметичних операцій, що проводяться, тому частіше обмежуються більш простими в реалізації ковзним усередненням і ковзними медіанами. Останні насправді оптимальні на вирішення двох різних завдань. У питаннях згладжування та усунення багатьох типів шумів майже ідеальні перші, але вони зовсім не підходять для фільтрації імпульсних перешкод. Чому? Для відповіді це питання слід пояснити, що таке це «ковзне середнє».
Просте ковзне середнє або арифметичне ковзне середнє (Simple Moving Average ) чисельно дорівнює середньому арифметичному значень вихідної функції за встановлений період вибірки. Для фільтра "ковзного середнього" (не зваженого) доступний лише один параметр - порядок або довжина вікна. Від нього залежить і частота зрізу та рівень пульсацій у смузі загородження. Розглянемо різні довжини вікон та його впливом геть результат (див. таблицю).
Як бачимо з таблиці, що більше довжина вікна, то згладжений результат буде на виході. Однак ця ідилія продовжиться до тих пір, поки значення вхідних відліків (сигналу) знаходяться в межах так званого нормального або робочого діапазону. Що буде з появою імпульсного шуму (перешкоди)? Припустимо на вході фільтра «ковзне середнє» наступну послідовність: 2, 5, 9, 1, 0, 3, 9 і раптом і з'явилося 857. Очевидно, що навіть при великому інтервалі (вікні) усереднення цю імпульсну перешкоду у вигляді аномального значення 857 повністю не прибрати. Ось тут у гру вступає медіанна фільтрація.
Реалізація алгоритму «ковзне середнє»
Кожне значення аргументу вихідної функції «ковзного середнього» – не що інше, як сума сусідніх (попередніх значень), поділене на довжину вікна. Число точок W, що беруть участь у розрахунку такого середнього, називають вікном ковзного усереднення. Чим воно більше, тим більше даних бере участь у розрахунку середнього і тим більше згладжена крива виходить. Якщо звернутися до таблиці (див. вище), загальну формулу для даної вагової функції можна записати як вираз (2).
Yw = SUM(Yi)/W; (2)
де: Yw – результат ковзного середнього, SUM() – сума значень всіх відліків на довжині вікна W.
При малих значеннях довжини вікна W згладжена крива практично повторюватиме хід зміни даних, а при великих W ці криві відображатимуть лише закономірність їх повільних варіацій, що відповідно позначається на поведінці вікна у ВЧ-області.
Оскільки ми маємо справу із двійковою логікою, то довжину вікна доцільно вибирати кратного ступеня двійки.
Що це дає?
А дає це простоту реалізації операції поділу: скажімо, якщо необхідно поділити наш результат додавання на число 2N (N-вага розряду), то це буде рівноцінно зрушенню розрядів числа праворуч на N-позицій. Цей зсув реалізується просто перепідключення необхідних вагових розрядів на схемі. Й все? Саме так, у випадку з цілою арифметикою. Припустимо до нас надходять дані постійно (безперервно) необхідно реалізувати «ковзне» вікно з накопичувальним буфером на два слова, тобто довжина вікна W = 2.
Як працює подібна схема "ковзне середнє"
На ланцюжку (каскадне з'єднання) двох восьмирозрядних асинхронних D-тригерів FD8 реалізовано накопичувальний буфер і «ковзне вікно». По фронту першого такту проводиться запис даних, що надійшли на нижній буфер (одноразово і на верхній буфер за рахунок дозволу проходження через нижній BUFT8, керований нулем). При цьому на входах суматора будуть присутні однакові сигнали, які після поділу на два (звичайним зсувом на один розряд з урахуванням виходу переповнення суматора) дадуть той же сигнал, що і на вході. Зроблено це для адекватної роботи «ковзного середнього» в перший момент (центрований алгоритм розрахунку), проте по першому ж спаду тактів спрацює тригер-засувка FDС, яка перепідключить верхнє накопичувальне плече FD8 в робочий режим і надалі, після приходу другого фронту дані з виходу нижнього накопичувального плеча FD8 запишуться у верхнє плече FD8. Друге слово (дані), що прийшло, по другому такту запишеться в перше плече буфера. Таким чином, по фронту кожного такту дані (слова, байти) зі входу INDATA зрушуватимуться і щоразу на входах суматора будуть дані вікна. По спаду тактів результат розподілу заклацуватиметься вихідним буфером FD8 і надходити на вихід OUTDATA. По входу CLR є можливість скидання фільтра початковий стан за сигналами запуску, за необхідності. За бажання, «ковзне середнє» легко нарощується до довжини 2 вікна кратного ступеня двійки (22, 23 і т.д).
Слід зазначити, що з довжині вікна понад вісім, значно зростає час реакції ланки, але з цим доводиться змиритися. Час реакції безпосередньо визначається довжиною вікна і швидкістю надходження даних, самі дані поступають синхронно (по фронту) з тактовими імпульсами
Оцінка оптимальності порядку фільтра «ковзне середнє»
Допустимо заданий сигнал виду sin(x) і якась випадкова складова з нормальним розподілом (див. вище рисунок 1), що накладається на сигнал у тій же часовій області. Даний сигнал ми вирішили згладити за допомогою фільтра "просте ковзне середнє". Вибрано порядок фільтра N. Як оцінити оптимальність обраного порядку N? Тобто, яка довжина вікна буде достатньою з суворої математичної точки зору? Очевидно, що слід визначити частоту зрізу фільтра і поставити допустимий рівень пульсацій у смузі пропускання.
Ми знаємо, що від довжини вікна залежить і частота зрізу та рівень пульсацій у смузі загородження. Даний фільтр можна розглядати як фільтр з кінцевою імпульсною характеристикою (КІХ) з однаковими коефіцієнтами, рівними 1/N, де N – довжина вікна (у цьому випадку вікно є імпульсна характеристика фільтра). Частотна характеристика такого фільтра є перетворення Фур'є від одиничного імпульсу (правильніше звичайно використовувати терміни Z-перетворення), це буде функція виду sin(x)/x, в якій головна пелюстка визначає смугу пропускання, а інші бічні пелюстки задають смугу загородження. Зрозуміло, що довше вікно (більше порядок фільтра), тим рівень бічних пелюсток буде нижче, але ширина головної пелюстки дорівнюватиме 1/N, тобто зі зростанням порядку фільтра вона буде зменшуватися, а значить частота зрізу буде меншою. Логічно? У разі одиночного сигналу оптимальним у нашому випадку буде такий порядок фільтра, який дасть максимально близьку до частоти синуса частоту зрізу. Кількісно це визначиться формулою 3.
N = Fd/2/Fs; (3)
де: N – порядок фільтра, Fd – частота дискретизації, Fs – частота сигналу.
Правильніше сказати, що оптимальна довжина (вона ж порядок фільтра) визначатиметься наступним виразом (4).
Nопт = round (N); (4)
де: Nопт - оптимальна довжина вікна, round() - є округлення в нижню сторону, так як потрібно, щоб частота зрізу фільтра була вищою за частоту сигналу (нам необхідно, щоб сигнал заданої частоти пройшов через фільтр).
Таким чином, при заданих вихідних параметрах: частоті сигналу, частоті дискретизації та різних рівнях співвідношення сигнал/шум (SNR), ми завжди матимемо одну оптимальну величину N. Зазначимо, що фільтр завжди оптимальний для певних характеристик сигналу, характеристики змінилися – фільтр вже неоптимальний . Так, ось такий недолік. Але що ж ви хотіли від простого фільтра з одним параметром, що налаштовується? Його завдання – лише згладжування даних.
Практичний додаток подібної оцінки
Розглянемо конкретний приклад розрахунку такої оцінки, скажімо для гітарного тюнера. Це такий пристрій або програма для визначення ноти, що звучить, тобто частоти нотного ряду на основі спектроаналізу. Допустимо маємо сигнал (набір даних, семплів) з частотою дискретизації 44100 Гц і роздільною здатністю 32 біти на семпл. Середнє зі скільки семплів потрібно взяти, щоб залишилися частоти нижче 1000 Гц? Тобто є завдання відфільтрувати високі ноти на гітарі.
Звернемося до формули (4) і підставимо вихідні дані:
Nопт = round(Fd/2/Fs) = round(44100/2/1000) = round(22.05) = 22
Як бачимо, порядок фільтра або довжина вікна повинна дорівнювати 22 семпла. Виходить, якщо нам необхідно прибрати перед аналізатором спектра всі частоти вище 1000 Гц або що еквівалентно введенню вікна ФНЧ, ми повинні видавати один семпл, сформований як середнє з 22 вхідних семплів аудіосигналу. Ось так просто.
Одномірна медіанна фільтрація
Медіаною набору даних 'х1, х2, …, хn' при непарному 'n' є середній за значенням елемент, що виходить при упорядкуванні набору за зростанням або зменшенням. Для парних 'n' медіану зазвичай визначають як середнє арифметичне двох середніх відліків послідовності. Медіанний фільтр є віконним фільтром, послідовно ковзає по масиву та повертає на кожному кроці 1 з елементів, що потрапили у вікно фільтра. Тобто медіанна фільтрація здійснює заміну значень відліків у центрі вікна медіанним значенням вихідних відліків.
Насправді довжина вікна фільтра для спрощення обробки даних, зазвичай, встановлюється з непарним числом відліків. Отже, можна виділити два класи медіанних фільтрів: фільтри з мінімально довжиною вікна рівною 3 і фільтри з довжиною вікна більше 3 (наприклад, 5, 7, 9, 11, 13, 15, etc).
Оскільки цей метод усуває локальні (поодинокі) викиди усередині вікна, то медіанна фільтрація зрізує імпульсні перешкоди на раз, залишаючи корисний сигнал (зберігаючи перепади) майже без зміни. І що важливо - медіанний фільтр є нелінійним КІХ-фільтром, який може повністю затирати частотну інформацію в сигналі, імпульсна реакція фільтра дорівнює нулю, а відгук на ступінчасту функцію дорівнює 1. Тому будьте уважні при виборі даного виду фільтрів стосовно ваших завдань.
Що далi?
А далi для знаходження значення ковзаючої медіани в точці X, обчислюється медіана значень ряду в часовому інтервалі [X - delta, X + delta]. Відповідне значення називається (2delta + 1)-точковою ковзною медіаною. Виходячи з цього, реалізуємо найменший можливий медіанний фільтр із довжиною вікна, що дорівнює 3.
Алгоритм сортування наступний:
- Маємо набір даних (8 бітних) A, B, C.
- Виробляємо перше сортування за спаданням: if (A<B) and (A<C), то вважаємо A – найменшим елементом і далі вибираємо між B та С, найменший елемент є медіаною та видаємо його на вихід.
- Якщо умова по першому сортуванню не виконується, то виконуємо друге сортування за спаданням: if (B<A) and (B<C), то вважаємо B – найменшим елементом і далі вибираємо між A та С, найменший елемент є медіаною та видаємо його на вихід.
- Якщо умова по першому та другому сортуванню не виконується, то робимо третє сортування за спаданням між A і B, найменший елемент є медіаною і видаємо його на вихід.
Як арбайтен остання схема?
На ланцюжку (каскадне з'єднання) трьох восьмирозрядних асинхронних D-тригерів FD8 реалізовані накопичувальний буфер елементів A, B, C і «ковзне вікно» довжиною W = 3. По фронту першого такту проводиться запис даних на нижній (перший) буфер, по другому і наступним тактам проводиться зсув та запис наступних даних (див. таблицю).
Сортування здійснюємо за допомогою семи 8 бітних компараторів чисел COMPM8, що видають логічну '1' на виході GT при виконанні умови по входу A>B і логічну '1' на виході LT при виконанні умови по входу B>A. Реалізація умови (a<b) and (a<c) здійснюється двома компараторами над набором даних A, B, C, результат якого І-НЕ комутує низьким рівнем буфер з трьома станами BUFT8 проходження отриманої медіани за підсумками порівняння елементів B і C. Реалізація умови (b<a) and (b<c) здійснюється двома компараторами над набором даних A, B, C, результат якого І-НЕ комутує низьким рівнем буфер із трьома станами BUFT8 проходження отриманої медіани за підсумками порівняння елементів A і C. При невиконанні одночасно двох умов (a<b) and (a<c) та (b<a) and (b<c), тобто. коли їх логічні рівні рівні '1' І-НЕ комутує низьким рівнем буфер з трьома станами BUFT8 проходження отриманої медіани за підсумками порівняння елементів A і B. Отримані медіани зведені монтажним АБО на вхід вихідного регістра, тактованого комутатором. Оскільки для роботи фільтра потрібно щонайменше 3 точки, то первинне накопичення здійснюється за допомогою вузла комутатора. У перший час інверсний сигнал з виходу RS- тригера дозволяє роботу лічильника і активує передачу третього такту з виходу лічильника-ділителя на три. По приходу спаду третього такту сигнал з виходу дешифратора вагового розряду b11 = 3 засуває вхід установки RS-тригера, після інверсії цей сигнал вимикає лічильник і активує передачу тактів по спаду на вихід комутатора, минаючи лічильник, для здійснення процесу запису результату медіанного значення даних, що зсуваються у вихідний буфер на регістрі FD8. Таким чином, робота медіанного фільтра починається на час вступу третього такту, що рівнозначно отриманню третьої точки з вибірки.
Майте на увазi! При реалізації медіанного фільтра в системах ЦОС слід звернути увагу на те, що при появі імпульсної перешкоди на межі вікна переважно варіювати довжину вікна, наприклад вести розрахунок з двома довжинами вікон одночасно, або, наприклад, використовувати алгоритм швидкої медіанної фільтрації. Також слід враховувати фактор затримки вихідного сигналу фільтрів як "ковзного середнього", так і "ковзаючих медіан", що визначається порядком фільтра.