Uploaded by Юля Дикова

Методи і способи КІТ

advertisement
МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
ДЕРЖАВНИЙ ВИЩИЙ НАВЧАЛЬНИЙ ЗАКЛАД
ДОНЕЦЬКИЙ НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ
КАФЕДРА АВТОМАТИЗОВАНИХ СИСТЕМ УПРАВЛІННЯ
КОНСПЕКТ
з дисципліни «Методи і способи КІТ»
для студентів напряму 6.050101 «Комп’ютерні науки»
спеціальності «Інформаційні управляючі системи та технології»
(шифр 05010101)
Розглянуто
на засіданні кафедри АСУ
протокол №____від ________
Затверджено
на засіданні навчально-видавничої ради
ДВНЗ «ДонНТУ»
протокол №____від ________
Донецьк-2012
УДК 681.3.01
Конспект із дисципліни «Методи і способи КІТ» для студентів спеціалізації
«Інформаційні управляючі системи та технології» (шифр 6.05010101) всіх
форм навчання. /Скл. доц., к.т.н. Привалов М.В., Донецьк, 2012, 83с.
Укладачі: Привалов М.В., доцент, к.т.н.
ЗМІСТ
МЕТОДИ СТИСНЕННЯ ІНФОРМАЦІЇ..................................................................................4
СТИСНЕННЯ ІНФОРМАЦІЇ ЗА ДОПОМОГОЮ ОПТИМАЛЬНИХ ЗА КОРОТКІСТЮ
КОДІВ .........................................................................................................................................5
МЕТОД ХАФФМАНА ..............................................................................................................6
МЕТОДИ СТИСНЕННЯ ТЕКСТОВОЇ ТА ГРАФІЧНОЇ ІНФОРМАЦІЇ. МЕТОД
ПРИГНІЧЕННЯ НУЛІВ ............................................................................................................8
ГРУПОВЕ КОДУВАННЯ .........................................................................................................9
ФАКСИМІЛЬНЕ СТИСНЕННЯ. МОДИФІКОВАНИЙ МЕТОД ХАФФМАНА ..............11
МОДИФІКОВАНИЙ КОД READ ..........................................................................................15
СЛОВНИКОВІ МЕТОДИ СТИСНЕННЯ ..............................................................................18
КЛАСИЧНІ АЛГОРИТМИ ЗІВА-ЛЕМПЕЛА ......................................................................19
МЕТОД СТИСНЕННЯ LZ77 ..................................................................................................19
МЕТОД СТИСКАННЯ LZSS .................................................................................................24
СЛОВНИКОВІ МЕТОДИ СІМЕЙСТВА LZ З ТАБЛИЧНИМ СЛОВНИКОМ. МЕТОД
СТИСНЕННЯ LZ78 .................................................................................................................27
МЕТОД СТИСНЕННЯ LZW ..................................................................................................28
МЕТОДИ ОБЧИСЛЕННЯ ЦИФРОВИХ ДАЙДЖЕСТІВ ....................................................30
АЛГОРИТМ MD5 ....................................................................................................................30
АЛГОРИТМ ОБЧИСЛЕННЯ ДАЙДЖЕСТУ SHA1 ............................................................33
ЛОГІКА ВИКОНАННЯ ROUNDX .........................................................................................34
МЕТОДИ ЗБЕРІГАННЯ Й СТИСНЕННЯ ГРАФІЧНОЇ ІНФОРМАЦІЇ. ФОРМАТИ
ГРАФІЧНИХ ФАЙЛІВ ............................................................................................................35
ФОРМАТ BMP .........................................................................................................................37
СТРУКТУРА BMP-ФАЙЛУ ...................................................................................................39
ФОРМАТ GIF ...........................................................................................................................40
СТИСНЕННЯ РАСТРОВИХ ЗОБРАЖЕНЬ ..........................................................................41
Алгоритм JPEG ........................................................................................................................51
Обробка звукових сигналів .....................................................................................................60
РОЗКЛАДАННЯ СИГНАЛІВ ПО ГАРМОНІЙНИХ ФУНКЦІЯХ .....................................68
ВИКОРИСТАННЯ ДИСКРЕТНОГО ПЕРЕТВОРЕННЯ ФУР’Є(ДПФ) ............................77
4
МЕТОДИ СТИСНЕННЯ ІНФОРМАЦІЇ
Будь-які дані можна уявити як послідовність повідомлень, що
отримуються від деякого джерела інформації. При цьому очевидно, що
кожен стан джерела буде характеризуватися своєю ймовірністю. Кількість
інформації, що міститься в одному стані джерела, можна оцінити:
𝐼(𝑥) = 𝑙𝑜𝑔
1
𝑝(𝑥)
Ця міра інформації була запропонована Харлі.
Оцінити середню кількість інформації, що надходить від одного стану
джерела, можна, використовуючи формулу ентропії:
𝑛
𝐻 = � 𝑝𝑖 𝑙𝑜𝑔 𝑝𝑖
𝑖=1
де 𝑝𝑖 – ймовірність і-того стану джерела,
n – загальна кількість станів.
Ентропія максимальна, якщо всі стани джерела рівноймовірні, але
таких джерел у природі майже не існує і ентропія має менше значення
джерела. Можна побудувати такий код, який дозволить отримати середню
довжину кодової комбінації не більше, ніж значення ентропії плюс один біт, і
оскільки стан більшості джерел нерівноймовірний, такий код буде кращим,
ніж двійкове кодування джерела.
5
СТИСНЕННЯ ІНФОРМАЦІЇ ЗА ДОПОМОГОЮ ОПТИМАЛЬНИХ ЗА
КОРОТКІСТЮ КОДІВ
Якщо проаналізувати будь-яке джерело інформації, можна помітити,
що воно генерує різноманітні повідомлення з різною частотою, тобто можна
сказати, що ймовірності станів усіх фактичних реальних джерел інформації
неоднакові. Це стало основою головної ідеї будування оптимальних за
короткістю кодів. Ідея полягає у тому, щоб представити більш ймовірні стани
коротшими комбінаціями кодів. Будь-який оптимальний за короткістю код
відповідає наступним вимогам:
1. Всі комбінації коду різні;
2. Більш ймовірні стани привласнюють коротші комбінації;
3. Властивість префіксності: жодна комбінація коду не починається з іншої,
коротшої. Ця властивість дозволяє отримати миттєвий код – код, який можна
передавати
без
розділювачів.
При
декодуванні
зі
вхідного
потоку
вилучається інформація про символи, і як тільки накопичена комбінація
співпаде з комбінацією коду, вона декодується.
Є джерело:
Х1
0
Х2
010
Х3
10
Х4
1
Генерується послідовність:
Х2
Х1
Х3
010
0
10
Через невиконання властивості префіксності виникає невизначеність.
4. Дві кодові комбінації, що відповідають двом станам з найменшою
ймовірністю, мають однакову довжину і розрізняються лише в одному –
останньому двійковому розряді.
6
МЕТОД ХАФФМАНА
Для побудови коду потрібно:
1. Записуємо усі стани в порядку зменшення їх ймовірності.
2. Об'єднуємо два стани з найменшою ймовірністю, замінюючи їх одним,
ймовірність якого дорівнює сумі його складових.
3. Крок 1 і 2 повторюємо, поки не залишиться один стан, з ймовірністю 1.
4. На підставі цих кроків будується дерево: верхівка дерева стан, з
ймовірністю 1, праворуч від кожної вершини знаходяться стани з більшими
ймовірностями, ліворуч з меншими. Усі праві гілки позначаються 0, ліві 1.
5. Виписуються кодові комбінації шляхом обходу дерева від кореня до
термінальних вузлів.
Приклад:
Х1 0,512
0,512
0,512
0,512
0,512
0,512
0,512
Х2 0,128
0,128
0,128
0,128
0,232
0,256
0,488
Х3 0,128
0,128
0,128
0,128
0,128
0,232
Х4 0,128
0,128
0,128
0,128
0,128
1
0,488
0,256
0,232
Х5 0,032
0,04
0,064
Х6 0,032
0,032
0,04
0,104
0,064
Х7 0,032
Х8 0,008
0,104
0,032
0,04
мал. 1 Алгоритм методу Хаффмана
7
1
1
1
0,232
1
0,008
0,256
1
0,128
0,104
1
0,512
0
0
1
0,004
0,488
0,032
0
0,128
0,128
0
0
0
0,064
1
0
0,032
0,032
мал. 2 Побудова дерева Хаффмана
Х1 0
Х2 100
Х3 101
Х4 110
Х5 11100
Х6 11101
Х7 11110
Х8 11111
Ефективність побудованого коду можна оцінити, обчисливши середню
довжину кодової комбінації, порівнявши її з ентропією і довжиною
комбінації при двійковому кодуванні.
𝑛
𝐸|𝑙| = � 𝑙𝑖 𝑝𝑖
𝑖=1
У середньому при стисненні повідомлення, що складається з 1000
станів джерела, ми витратимо 2184 бітів. При використанні ж простого
двійкового коду знадобилося б 3000 бітів.
В ідеалі середня довжина кодової комбінації має дорівнювати середній
кількості інформації, що отримується від однієї події згенерованого джерела.
8
МЕТОДИ СТИСНЕННЯ ТЕКСТОВОЇ ТА ГРАФІЧНОЇ ІНФОРМАЦІЇ.
МЕТОД ПРИГНІЧЕННЯ НУЛІВ
Один з найстарших і найпростіших методів стиснення даних відомий
як пригнічення нулів (null suppression), або пригнічення пропусків (blank
suppression).
У тексті або потоці символів часто зустрічаються довгі рядки пропусків
або нулів. У методі пригнічення нулів передавач сканує дані у пошуках
рядків пропусків і замінює кожен такий рядок двохсимвольним кодом. Код
складається зі спеціального керуючого символу, потім вказується кількість
пропусків у рядку. Наприклад, є код, у якому символи пропуску, позначені
знаком b:
XYZbbbbbQRX
Цей рядок замінюється наступним рядком, у якому Sc представляє
собою спеціальний керуючий символ:
XYZ Sc5QRX
Така схема дозволяє вкоротити всі рядки, де є три і більше пропуски.
У методі пригнічення нулів одержувач шукає в потоці вхідних
символів спеціальний символ, що використовується для індикації видалених
пропусків. Отримавши такий символ, одержувач розуміє, що наступний
символ містить кількість видалених пропусків. За цією інформацією може
бути відновлений початковий потік даних.
При тому що метод пригнічення нулів є вкрай примітивною формою
стиснення даних, його перевага полягає в тому, що він дуже легко
реалізується. Окрім того, виграш навіть від використання такого простого
методу може бути значним. Практично, при перших впровадженнях цього
методу виграш становив від 30% до 50%.
9
ГРУПОВЕ КОДУВАННЯ
Групове кодування (run – length encoding) є простим методом
стиснення даних без втрат, досить ефективний для стиснення тексту. Цей
метод також знаходить застосування у факсимільному стисненні.
Sc X Сс
𝑆𝑐 − спеціальний символ, вказує на те, що за ним ідуть стиснені дані;
X – будь-який символ, що повторюється;
Сс – лічильник символів, тобто кількість повторень стислого символу.
Приклад:
$******55.72
$ Sc*655.72
---------
Sc-9
Як і у методі пригнічення нулів, передавач шукає послідовності
символів, що повторюються. У даному випадку він замінює їх на
трьохсимвольний код. Код складається зі спеціального індикатора стиснення,
за яким ідуть сам символ, що повторюється, та кількість його повторень.
Таким чином, цей метод дозволяє скоротити місце, яке займає будь-яка
послідовність з чотирьох та більше однакових символів.
Ефективність методу групового кодування залежить від того, наскільки
часто у початкових даних зустрічаються послідовності символів, що
повторюються, і від середньої довжини таких серій. Стандартною мірою
ефективності стиснення є коефіцієнт стиснення, що представляє собою
відношення довжини нестиснутих даних до довжини стиснутих даних
(включаючи символи кодування).
Будь-яка
схема
стиснення
матиме змінну продуктивність,
яка
залежатиме від початкових даних. Проте у більшості випадків у тексті
міститься достатня кількість символів, що повторюються, щоб застосування
навіть такого простого методу як групове кодування, було виправданим.
Групове кодування було одним з перших методів стиснення
факсимільних повідомлень, але тепер воно більше не використовується з
10
такою метою. Проте цей метод слід вивчити, оскільки він застосовується у
складніших методах стиснення зображень. При використанні методу
групового кодування для зображень замість відсканованої та оцифрованої
лінії передаються довжини серій білих та чорних елементів зображення.
Кожен піксель подається як один біт, що означає білий або чорний
колір. Код довжин серій складається з довжин чорних та білих
послідовностей, що чергуються. Оскільки при такому кодуванні зображення
чорний та білий кольори завжди чергуються, нема необхідності у
використанні спеціального символу, що вказує на колір серії. Таким чином,
закодований потік даних є рядом чисел, що означають довжини серій чорних
та білих точок, що чергуються. У простому прикладі закодовані дані
займають більше місця, ніж початкові. Але у випадку використання цього
методу до типової сторінки тексту, цей метод буде стискувати дані. Тим не
менш, це не найефективніший спосіб стиснення зображень.
Методи стиснення даних дуже важливі для широкого застосування
цифрових i факсимільних апаратів. Для прикладу розглянемо типову
сторінку, з розрішенням у 200 пелів (білих або чорних точок) на дюйм (це є
прийнятною, але не високою мірою розрішення). У результаті така сторінка
містить 3 740 000 бітів (8,5 дюймів х 11 дюймів х 40 000 пелів на квадратний
дюйм). При базовій швидкості служби ISDN у 64 Кбит/з передавання такої
сторінки займе близько однієї хвилини.
Сектор ITU-T стандартизував два методи стиснення даних без втрат
для факсимільного зв’язку: модифікований код Хаффмана та модифікований
метод READ. У типовому документі чорні та білі області мають тенденцію
до об’єднання. Якщо розглядати документ як послідовність ліній та звернути
увагу на розташування ділянок білого і чорного в рядки, можна виявити довгі
серії білих і чорних точок. Завдяки цій властивості можна припустити, що
стиснення, засноване на методі групового кодування, дасть добрий результат.
Вхідні дані, які складаються з двох значень, перетворяться на довжини серій,
які потім кодуються для передавання. Окрім цього, оскільки у загальному
11
випадку довгі серії чорних та білих точок менш ймовірні, ніж короткі, можна
скористатися перевагою кодування послідовностей змінної довжини.
ФАКСИМІЛЬНЕ СТИСНЕННЯ. МОДИФІКОВАНИЙ МЕТОД
ХАФФМАНА
Факсимільне зображення добре піддається стисканню, це пов'язано з
тим, що зображення є бінарними і в них присутні довгі послідовності, що
повторюються.
Бінарне зображення – зображення з двома кольорами: колір фону і
колір точки. Мінімальна роздільна здатність факсу така, що в одній лінії буде
не менше, ніж 1728 точок, оскільки точки бувають лише двох кольорів,
зображення можна ефективно стискати за допомогою RLE-кодування.
Для кодування факсимільних документів може застосовуватися код
Хаффмана, описаний вище. Цей метод можна застосувати для кожного рядка
зображення, кодуючи послідовності чорних і білих точок. Наприклад,
припустимо, що при скануванні окремого рядка виходить наступна
послідовність чорних і білих точок : W7, В7, W4, В8, W4, В7, W10 (у даному
випадку W означає білий, а В – чорний). Якщо розглядати кожен з цих
елементів як символ алфавіту джерела, тоді для кодування цих даних може
бути використаний метод кодування Хаффмана. Проте оскільки стандарт
ITU-T вимагає щонайменше 1728 точок у лінії, кількість різних кодів, а отже,
і середня довжина коду буде дуже великою.
Альтернативою є модифікований метод кодування Хаффмана. У цьому
методі довжина серії N розглядається як сума двох доданків:
N = 64m + n; m = 0, 1, 2…27; n = 0,1, 2,..., 63.
Тобто довжина кожної серії чорних або білих точок вважається
величиною, кратною 64 із залишком.
Тепер кожна довжина серії може бути представлена двома значеннями,
одним для m і іншим для n, і ці значення можуть кодуватися за допомогою
методу Хаффмана. Наприклад, рядок з 200 чорних точок поспіль може бути
12
виражений як 64*3+8. Для цього сектором ITU-T були визначені вісім зразків
документів і розрахована ймовірність знаходження в документах серій різних
довжин. Оскільки для серій з чорних і білих точок ці ймовірності
розрізняються, були злічені дві множини ймовірностей. На основі отриманої
інформації були складені дві таблиці. Довжина серії ділиться на 64, після
чого частка і залишок від поділу кодуються двома кодовими словами. Якщо
довжина серії менше 64 (частка від поділу дорівнює нулю), то така довжина
серії кодується тільки кодовим словом залишку. Серії завдовжки більше 64
точок кодуються двома кодами: кодом залишку (n) і кодом кратності (m). Є
ще декілька моментів, що стосуються цього коду. Кожен рядок закінчується
унікальним кодовим словом EOL (End Of Line – кінець рядка). Це кодове
слово, що ніколи не зустрічається в рядках даних, забезпечує відновлення
синхронізації у разі помилок. Усередині рядка повинні чергуватися кодові
слова для білих і чорних серій. Зверніть увагу на те, що для білих і чорних
серій використовуються різні кодові слова. Це забезпечує додатковий захист
від помилок. Нарешті, за угодою кожен рядок починається з білої серії.
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
табл. 1 Складені коди модифікованого коду Хаффмана
Довжина Біла серія
серії
Кодові слова залишку
0
00110101
1
000111
2
0111
3
1000
4
1011
5
1100
6
1110
7
1111
8
10011
9
10100
10
00111
11
01000
12
001000
13
000011
14
110100
15
110101
16
101010
Чорна серія
0000110111
010
11
10
011
0011
0010
00011
000101
000100
0000100
0000101
0000111
00000100
00000111
000011000
0000010111
13
17
101011
18
0100111
19
0001100
20
0001000
21
0010111
22
0000011
23
0000100
24
0101000
25
0101011
26
0010011
27
0100100
28
0011000
29
00000010
30
00000011
31
00011010
32
00011011
33
00010010
34
00010011
35
00010100
36
00010101
37
00010110
38
00010111
39
00101000
40
00101001
41
00101010
42
00101011
43
00101100
44
00101101
45
00000100
46
00000101
47
00001010
48
00001011
49
01010010
50
01010011
51
01010100
52
01010101
53
00100100
54
00100101
55
01011000
56
01011001
57
01011010
58
01011011
59
01001010
60
01001011
61
00110010
62
00110011
63
00110100
Кодові слова кратності 64
64
11011
128
10010
192
010111
256
0110111
0000011000
0000001000
00001100111
00001101000
00001101100
00000110111
00000101000
00000010111
00000011000
000011001010
000011001011
000011001100
000011001101
000001101000
000001101001
000001101010
000001101011
000011010010
000011010011
000011010100
000011010101
000011010110
000011010111
000001101100
000001101101
000011011010
000011011011
000001010100
000001010101
000001010110
000001010111
000001100100
000001100101
000001010010
000001010011
000000100100
000000110111
000000111000
000000100111
000000101000
000001011000
000001011001
000000101011
000000101100
000001011010
000001100110
000001100111
0000001111
000011001000
000011001001
000001011011
14
320
384
448
512
576
640
704
768
832
896
960
1024
1088
1152
1216
1280
1344
1408
1472
1536
1600
1664
1728
EOL
00110110
00110111
01100100
01100101
01101000
01100111
011001100
011001101
011010010
011010011
011010100
011010101
011010110
011010111
011011000
011011001
011011010
011011011
010011000
010011001
010011010
011000
010011011
000000000001
000000110011
000000110100
000000110101
0000001101100
0000001101101
0000001001010
0000001001011
0000001001100
0000001001101
0000001110010
0000001110011
0000001110100
0000001110101
0000001110110
0000001110111
0000001010010
0000001010011
0000001010100
0000001010101
0000001011010
0000001011011
0000001100100
0000001100101
000000000001
15
МОДИФІКОВАНИЙ КОД READ
Використання модифікованого коду Хаффмана значно скорочує
кількість бітів, що передаються у порівнянні з передаванням нестисненого
зображення. Додаткового збільшення продуктивності можна досягти, знаючи
про кореляцію між послідовностями чорно-білих серій точок у двох сусідніх
рядках. Насправді, у типових документах, що передаються факсом,
приблизно 50% чорно-білих і біло-чорних переходів знаходяться точно під
відповідними переходами попереднього рядка, а ще 25% відрізняються лише
на одну точку. Тому приблизно 75% усіх переходів можна з великою
ефективністю визначити відносно попереднього рядка. Ці міркування і стали
основою для створення модифікованого коду READ (Modified READ, MR),
(Relative Element Address Designate – відносне визначення адрес елементів).
У схемі MR довжини серій кодуються відповідно до розташування так
званих перемикаючих елементів. Перемикаючий елемент (changing element)
визначається як точка кольору, відмінного від кольору попередньої точки
тієї ж самої лінії. Перемикаючий елемент а1, кодується відстанню від однієї
з опорних точок : або від попереднього перемикаючого елементу а0 у тому
самому рядку, або від перемикаючого елементу b1 у попередньому рядку.
Вибір перемикаючого елементу а0 або b1 залежить від
конкретної
конфігурації.
а0 – стартовий, перемикаючий елемент кодованої лінії, який на початку
кодованої лінії встановлюється на уявний білий перемикаючий елемент,
розташований лівіше від першого елементу лінії, а у процесі кодування лінії
перевизначається після кожного кроку кодування;
а1 – наступний перемикаючий елемент праворуч від елементу а0 у
кодованій лінії;
а2 – наступний перемикаючий елемент праворуч від елементу a1 у
кодованій лінії;
16
b1 – перший, розташований на опорній лінії правіше за елемент а0
перемикаючий елемент, колір якого протилежний до кольору а0;
b2 – наступний перемикаючий елемент правіше від b1 на опорній лінії.
b1
a0
b2
a1
b1
a2
b2
a0
a1
мал. 3 Розташування перемикаючих елементів MR
Процедура кодування виглядає таким чином:
1. На першому кроці обирається один з двох можливих варіантів дій:
– Якщо перемикаючий елемент b2 розташований лівіше від перемикаючого
елементу a1, це кодується словом 0001. Після кодування позиція a1
зміщується так, щоб перемикаючий елемент a1 розташовувався під b2. Це
називається
режимом
пропуску.
Потім
повторюється
крок
1.
– Якщо попередня умова не виконується, переходимо до кроку 2.
2. На другому кроці також обирається один з двох можливих варіантів дій:
– Якщо позиція перемикаючого елементу a1 знаходиться в межах трьох
точок від позиції перемикаючого елементу b1 (|a1b1| < 3), тоді а1 кодується
вертикально, після чого стара позиція a1 стає новою позицією а0, a2 стає a1
тощо.
– Якщо позиція перемикаючого елементу a1 не знаходиться в межах трьох
точок від позиції перемикаючого елементу b1, тоді a1 кодується
горизонтально. Вслід за кодом горизонтального режиму 001 a0a1 і a1a2
кодуються
за
допомогою
одновимірного
модифікованого
Хаффмана. Потім стара позиція а2 стає новою позицією а0.
кодування
17
табл. 2 Процедура кодування MR
Крок 1 використовується для переміщення позицій перемикаючих
елементів і b2 після виконання кроку 2. Окрім цього, крок 1 дозволяє
уникнути великих серій. На кроці 2, якщо поточний перемикаючий елемент,
що кодується, виявляється у межах трьох позицій від такого ж переходу в
попередній лінії, тоді його позиція кодується одним з семи можливих значень
за
допомогою
модифікованого
кодування
Хаффмана.
Ця
ситуація
зберігається більшу частину часу. У окремих випадках, коли перехід у
поточній лінії не знаходиться в межах трьох позицій від такого ж переходу в
попередній лінії, наступні дві серії кодуються за допомогою модифікованого
кодування Хаффмана.
Схема MR більшою мірою чутлива до помилок, ніж схема
модифікованого
кодування
Хаффмана.
Результат
помилки
може
поширюватися на непередбачувані відстані. Щоб уникнути цього, для кожної
К-ї лінії застосовується модифікована схема кодування Хаффмана. Сектор
ITU-T рекомендує значення К = 2 для розрішення 3,85 лінії на міліметр і К=4
для розрішення 7,7 ліній на міліметр.
18
СЛОВНИКОВІ МЕТОДИ СТИСНЕННЯ
Вхідну послідовність символів можна розглядати як послідовність
рядків, що містять довільну кількість символів. Ідея словникових методів
полягає в заміні рядків символів на такі коди, які можна трактувати як
індекси рядків деякого словника. Рядки, що утворюють словник, далі
називатимемо фразами. При декодуванні здійснюється зворотна заміна
індексу на відповідну йому фразу словника.
Словник – це набір таких фраз, які, як ми вважаємо, будуть зустрічатися
в послідовності, що оброблюється. Індекси фраз мають бути побудовані так,
щоб у середньому їх представлення займало менше місця, ніж вимагають
рядки, що заміщуються. За рахунок цього і відбувається стиснення.
Зменшення розміру можливе в першу чергу за рахунок того, що
зазвичай у даних, що стискаються, зустрічається лише невелика частина всіх
можливих рядків довжини n, тому для представлення індексу фрази потрібна,
як правило, менша кількість бітів, ніж для представлення початкового рядка.
Далі, якщо у нас є гіпотези, які заслуговують довіри, про частоту
використання тих або інших фраз, або проводився якийсь частотний аналіз
даних, що обробляються, ми можемо призначити ймовірнішим фразам коди
меншої довжини.
Зазвичай просто передбачається, що короткі фрази використовуються
частіше за довгі. Тому в більшості випадків індекси будуються таким чином,
щоб довжина індексу короткої фрази була менше довжини індексу довгої
фрази. Такий прийом зазвичай сприяє поліпшенню стиснення.
19
КЛАСИЧНІ АЛГОРИТМИ ЗІВА-ЛЕМПЕЛА
Алгоритми словникового стиснення Зіва-Лемпела з’явилися у другій
половині 1970-х років. Це були так звані алгоритми LZ77 та LZ78, що були
розроблені спільно Зівом (Ziv) та Лемпелом (Lempel). Надалі первинні схеми
піддавалися багаточисельним змінам, внаслідок чого ми сьогодні маємо
десятки досить самостійних алгоритмів та незліченну кількість модифікацій.
LZ77 та LZ78 є універсальними алгоритмами стиснення, у яких
словник формується на підставі вже обробленої частини вхідного потоку,
тобто адоптивно. Принциповою відмінністю є лише спосіб формування фраз.
У модифікаціях первинних алгоритмів ця властивість зберігається. Тому
словникові алгоритми Зіва-Лемпела розділяють на два сімейства – алгоритми
типу LZ77 та алгоритми типу LZ78. Іноді також говорять про словникові
методи LZ1 і LZ2.
МЕТОД СТИСНЕННЯ LZ77
Цей словниковий алгоритм стиснення є найстарішим серед методів LZ.
Опис був опублікований у 1977 році, але сам алгоритм розроблений не
пізніше за 1975 рік. Алгоритм LZ77 є «засновником» цілого сімейства
словникових схем – так званих алгоритмів зі словником (вікном), що ковзає.
Дійсно, в LZ77 в якості словника використовується блок вже закодованої
послідовності. Як правило, по мірі виконання обробки, положення цього
блоку відносно початку послідовності постійно змінюється, словник «ковзає»
вхідним потоком даних.
Вікно, що ковзає, має довжину N (тобто у ньому містяться N символів),
і складається з 2 частин:
• послідовності довжини W = N - n вже закодованих символів, яка і є
словником;
• буфера попереднього перегляду (lookahead) довжини п; зазвичай п на
порядки менше за W.
20
Нехай до теперішнього моменту часу ми вже закодували t символів s1,
s2, .., st. Тоді словником будуть W попередніх символів st-(W-1),
st-(W-1)+1,…st. Відповідно, у буфері знаходяться символи, що очікують на
кодування, st+1, st+2, .., st+n. Вочевидь, якщо W ≥ t, то словником буде уся
вже оброблена частина вхідної послідовності.
Ідея алгоритму полягає в пошуку щонайдовшого збігу між рядком
буфера, що починається з символу st+1, і усіма фразами словника. Ці фрази
можуть починатися з будь-якого символу st-(W-1), st-(W-1)+1,…st і виходити
за межі словника, вторгаючись до області буфера, але повинні лежати у вікні.
Отже, фрази не можуть починатися з st+1, тому буфер не може
порівнюватися сам з собою. Довжина збігу не повинна перевищувати розміру
буфера. Отримана в результаті пошуку фраза st-(i-1), st-(i-1)+1,.., st-(i-1)+(j-1)
кодується за допомогою двох чисел:
1) зміщення (offset) від початку буфера, i;
2) довжини відповідності, або збігу (match length), j.
Зміщення і довжина відповідності грають роль вказівника (посилання),
що однозначно визначає фразу. Додатково у вихідний потік записується
символ s, що безпосередньо йде за рядком буфера, що співпав.
Таким чином, на кожному кроці кодер видає опис трьох об'єктів:
зміщення і довжини відповідності, що утворюють код фрази, рівної
обробленому рядку буфера, і одного символу s (літерала). Потім вікно
зміщується на j+1 символів управо і здійснюється перехід до нового циклу
кодування. Розмір зміщення пояснюється тим, що ми реально закодували
саме j+1 символів: j за допомогою вказівника на фразу в словнику, і 1 за
допомогою тривіального копіювання. Передача одного символу в явному
виді дозволяє вирішити проблему обробки ще жодного разу не бачених
символів, але істотно збільшує розмір стиснутого блоку.
21
Приклад:
Спробуємо стиснути рядок «кот_ломом_колол_слона» довжиною у 21
символ. Нехай довжина буфера дорівнює 7 символам, а розмір словника
більший за довжину рядка, що стискається.
Умовимося також, що:
• нульове зміщення зарезервували для позначення кінця кодування;
• символ s, відповідає одиничному зміщенню відносно символу st+i, з
якого починається буфер;
• якщо є декілька фраз з однаковою довжиною збігу, тоді обираємо
найближчу до буфера;
• у невизначених ситуаціях – коли довжина збігу нульова – зміщенню
привласнюємо одиничне значення.
табл. 3 Приклад кодування методом LZ77
Для кодування і нам достатньо 5 бітів, для j потрібно 3 біти, і нехай
символи потребують 1 байт для свого представлення. Тоді всього ми
витратимо 12х(5+3+8) = 192 біти. На початку рядок займав 21х8 = 168 бітів,
тобто LZ77 кодує наш рядок ще більш марнотратним чином. Не слід також
забувати, що ми опустили крок кодування кінця послідовності, який вимагав
би ще щонайменше 5 бітів (розмір поля і = 5 бітів).
Процес кодування можна описати наступним чином:
while ( ! DataFile.EOF() ){
22
/* знайдемо максимальний збіг; у match_pos отримаємо зміщення i, в
match_len – довжину j, в unmatched_sym – перший символ St+i+j, що не
співпав; вважаємо також, що у функції find_match враховується обмеження
на довжину збігу
*/
find_match (&match_pos, &match_len, &unmatched_sym);
/*запишемо до файлу стиснених даних опис знайденої фрази, при
цьому довжина бітового представлення i задається константою OFFS_LN,
довжина представлення j – константою LEN_LN, розмір символу s
приймаємо рівним 8 бітам
*/
CompressedFile.WriteBits (match_pos, OFFS_LN);
CompressedFile.WriteBits (match_len, LEN_LN);
CompressedFile.WriteBits (unmatched_sym, 8);
for (i = 0; i <= match_len; i++) {
// прочитаємо черговий символ
с = DataFile.ReadSymbol ();
//видалимо зі словника одну найстаршу фразу
DeletePhrase ();
/* додамо до словника одну фразу, що починається з першого символу
буфера */
AddPhrase ();
/* змістимо вікно на 1 позицію, додамо в кінець буфера символ с */
MoveWindow(c);
}
}
CompressedFile.WriteBits (0, OFFS_LN);
Приклад підтвердив, що спосіб формування кодів у LZ77 є
неефективним і дозволяє стискати лише порівняно довгі послідовності. До
деякої міри стискання невеликих файлів можна поліпшити, використовуючи
23
коди
змінної
довжини
для
зміщення
i.
Дійсно,
навіть
якщо
ми
використовуємо словник у 32 кбайти, але закодували ще тільки 3 кбайти, то
зміщення реально вимагає не 15, а 12 бітів. Окрім цього, відбувається
істотний програш через використання кодів однакової довжини при вказівці
довжин збігу j. Статистичний аналіз великих фрагментів тексту (близько
декількох мегабайт) вказує, що різні довжини збігів фраз зустрічаються з
різною ймовірністю.
Що стосується декодування стиснених даних, то воно здійснюється
шляхом простої заміни коду на блок символів, що складається з фрази
словника і символу, що передається явно. Природно, що декодер повинен
виконувати ті ж самі дії зі зміною вікна, що і кодер. Фраза словника
елементарно визначається за зміщенням і довжиною, тому важливою
властивістю LZ77 й інших алгоритмів з вікном, що ковзає, є дуже швидка
робота декодера.
Алгоритм декодування може мати наступний вигляд.
for (;;) {
// читаємо зміщення
match_pos = CompressedFile.ReadBits (OFFS_LN);
if (!match_pos)
// знайдена ознака кінця файлу, виходимо з циклу
break;
// читаємо довжину збігу
match_len = CompressedFile.ReadBits (LEN_LN);
for (i = 0; i < match_len; i++) {
// знаходимо в словнику черговий символ фрази, що співпала
с = Dict (match_pos + i);
//зміщуємо словник на 1 позицію, додаємо до його початку с
MoveDict (c);
// записуємо черговий розкодований символ до вихідного файлу
DataFile.WriteSymbol (c);
24
}
/*читаємо символ, що не співпав, додаємо його до словника й
записуємо до вихідного файлу
*/
с = CompressedFile.ReadBits (8);
MoveDict (c)
DataFile.WriteSymbol (c);
}
Алгоритми
з
вікном,
що
ковзає,
характеризуються
сильною
несиметричністю в часі – кодування значно повільніше за декодування,
оскільки при стисненні багато часу витрачається на пошук фраз.
МЕТОД СТИСКАННЯ LZSS
Алгоритм LZSS дозволяє досить гнучко поєднувати у вихідній
послідовності символи і вказівники (коди фраз), що у деякій мірі усуває
властиве LZ77 марнотратство, що проявляється у регулярній передачі одного
символу в прямому вигляді. Ця модифікація LZ77 була запропонована в 1982
році Сторером (Storer) і Жиманскі (Szymanski).
Ідея алгоритму полягає у додаванні до кожного вказівника символу
однобітового префіксу f, що дозволяє розрізняти ці об'єкти. Інакше кажучи,
однобітовий прапорець f вказує на тип і, відповідно, довжину тих даних, що
безпосередньо йдуть за ним. Така техніка дозволяє:
• записувати символи у явному вигляді, коли відповідний код має більшу
довжину. Отже, словникове кодування лише шкодить;
• обробляти символи, що до цього жодного разу не зустрічалися.
Приклад:
Закодуємо рядок "кот_ломом_колол_слона" з попереднього прикладу і
порівняємо коефіцієнт стискання для LZ77 і LZSS.
25
Нехай ми переписуємо символ у явному вигляді, якщо поточна
довжина максимального збігу буфера і якоїсь фрази словника менше або
дорівнює 1. Якщо ми записуємо символ, то перед ним видаємо прапор зі
значенням 0, якщо вказівник – зі значенням 1. Якщо є декілька фраз
однакової довжини, що співпадають, обираємо найближчу до буфера.
табл. 4 Приклад кодування методом LZSS
Таким чином, для кодування рядка за допомогою алгоритму LZSS нам
знадобилось 17 кроків: 13 разів символи були передані в явному вигляді, і 4
рази ми використали вказівники. Зазначимо, що при роботі алгоритму LZ77
нам занадобилось лише 12 кроків. З іншого боку, якщо задатися тими ж
довжинами для і та j, розмір закодованих за допомогою LZSS даних дорівнює
13х(1+8)+4х(1+5+3) = 153 бітам. Це означає, що рядок дійсно був стиснений,
тому що його початковий розмір 168 бітів.
Декодування інформації, стисненої алгоритмом сімейства LZ на
прикладі алгоритму LZSS
0 'к' 0 'о' 0 'т' 0 '_' 0 'л' 0 'о' 0 'м' 1 2 2 0 '_' 1 10 2 1 8 2 0 'л' 0 '_' 0 'с' 1 5 2 0 'н' 0 'а'
26
табл. 5 Декодування інформації, стисненої алгоритмом сімейства LZ на прикладі
алгоритму LZSS
З алгоритму декодування видно, що даний процес виконується
швидше, ніж процес кодування, тому що на кожному кроці не потрібно
багаторазово виконувати пошук у словнику.
27
СЛОВНИКОВІ МЕТОДИ СІМЕЙСТВА LZ З ТАБЛИЧНИМ СЛОВНИКОМ.
МЕТОД СТИСНЕННЯ LZ78
У даних методах словник представляє собою асоціативний масив,
ключем є індекс фрази, значенням – сама фраза. Найпершим методом цього
сімейства став алгоритм LZ78.
Алгоритм роботи:
На кожному кроці виконується пошук щонайдовшої фрази з буфера у
словнику, якщо фраза знайдена, у вихідний потік заносяться її індекс і
символ, що йде за нею; у словник додається нова фраза, що є конкатенацією
зі знайденої фрази і символу. Якщо фраза не знайдена, у вихідний потік
заноситься
зарезервований
індекс
і
символ
з
вхідного
потоку.
Приклад:
Нехай фраза з індексом "1" означає ситуацію, коли жодна фраза з буфера не
знайдена в словнику.0
табл. 6 Кодування методом LZ78
28
Для індексу достатньо 5 бітів інформації; символ S – 8 бітів; кожен
крок кодування – 8+5=13 бітів; 13 кроків*13 бітів = 169 бітів, а початкова
фраза складала 168.
МЕТОД СТИСНЕННЯ LZW
Алгоритм роботи LZW заснований на апріорному знанні вхідного
алфавіту. На першому кроці алгоритму увесь алфавіт заноситься до словника.
Кодування проходить таким чином: якщо фраза знайдена в словнику, то
ніяких дій не виконується, з вхідного потоку витягається наступний символ і
виконується пошук у словнику вже довшої фрази. Так триває доти, доки не
буде побудована фраза, якої немає в словнику. Коли це станеться, у вихідний
потік виводиться індекс останньої знайденої фрази, а поточною фразою стає
останній витягнутий з вхідного потоку символ плюс той, що йде за ним.
Часто використовується модифікація алгоритму, у якій після виконання
початкового словника, заноситься код очищення. Цей код виводиться до
вихідного потоку задля скидання параметрів алгоритму, що дозволяє
стискати більший об’єм інформації.
29
табл. 7 Кодування методом LZW
Необхідно 6 бітів для збереження словника. Закодована фраза займає
6*18=108 бітів, а початкова фраза складала 169 бітів.
Загальна характеристика словникових методів: коефіцієнт стиснення
для методів, що використовують вікно, яке ковзає, у 2-4 рази; для методів з
табличним словником – у 2,5-5 разів. Відмінність у продуктивності кодера та
декодера у 8-10 разів. Як правило, розглянуті методи рідко застосовуються в
чистому вигляді. Для досягнення більшого стиснення, до вихідного потоку
застосовують етап вторинного стиснення із застосуванням методу Хаффмана.
30
МЕТОДИ ОБЧИСЛЕННЯ ЦИФРОВИХ ДАЙДЖЕСТІВ
Цифровим дайджестом називається набір значень, обчислених на
підставі якого-небудь набору даних. Алгоритм обчислення цифрового
дайджесту завжди формує послідовність однієї і тієї ж довжини незалежно
від об'єму даних, що обробляються. Як правило, алгоритми отримання
дайджестів характеризуються вкрай малою кількістю колізій (часто колізію
не вдається отримати на протязі багатьох років розподілених обчислень).
Сфери застосування дайджестів:
1. Перевірка цілочисельності інформації.
2. Створення цифрової підписки.
3. Криптографія (шифрування паролів).
Застосування цифрових дайджестів у криптографії можливе тому, що
алгоритми фактично незворотні і відновлення початкового повідомлення
можливе тільки шляхом повного перебору комбінацій.
АЛГОРИТМ MD5
Логіку обчислення MD5 можна зобразити схемою:
мал. 4 Логіка обчислення MD5
Згідно з алгоритмом MD5 кожен блок початкового повідомлення (512
бітів) обробляється незалежно; у результаті цієї обробки з початкового
значення хеш-коду виходить новий проміжний результат. Після обробки
31
останнього блоку буде отриманий остаточний результат. Попередня обробка
даних
здійснюється
наступним
чином:
з початкового
повідомлення
отримують розширене, для цього повідомлення доповнюють одиницею і
набором нульових бітів так, щоб його довжина, плюс ще 64 біти, була
кратною 512. Якщо повідомлення вже має таку довжину, то до нього все
одно додається порожній блок. Після цього до результату приєднують 64бітну довжину повідомлення.
мал. 5 Обробка кожного 512-бітного блоку
Для кожного циклу використовується своя логічна функція, відповідно
до якої виконується перетворення 32-бітних слів дайджестом.
Використовуються функції:
fF=(B ∧ C) ∨ (not B ∧ D)
fG=(B ∧ D) ∨ (C ∧ not D)
fH=B xor C xor D
32
fL=C xor (B ∧ not D)
Схема циклу:
мал. 6 Схема циклу
Обробка 512-бітного слова:
CLS – циклічний зсув уліво;
T[i] – елемент масиву, що використовується для перейменування бітів.
T[i] =232 |sin(i)|; i= 1,64
Загальна схема перетворення:
A=B+CLSs(A+f(B1C1D1)+X[k]+T[i]);
CLSs – циклічний зсув уліво на s позицій.
Ініціалізація:
A=0x1234567
B=0x89ABCDEF
C=0xFEDCBA98
D=0x76543210
Завдяки такій ініціалізації навіть для порожнього повідомлення буде
обчислене нетривіальне значення хеш-функції.
Усі додавання при обчисленні MD5 виконуються за модулем 2. MD5
має достатню стійкість для використання при шифруванні паролів; для
повного перебору знадобиться 2128 обчислень хеш-функцій, а для пошуку
колізії 2128/2 операцій, тобто 264.
33
АЛГОРИТМ ОБЧИСЛЕННЯ ДАЙДЖЕСТУ SHA1
мал. 7 Логіка обчислення SHA1
Логіка побудування розширеного повідомлення співпадає з тією, що
використовується в MD5.
Відрізняється початкова ініціалізація хеш-коду:
A=0x67452301
B=0xEFCDAB89
C=0x98BADCFE
D=0x10325476
E=0xC3D2E1F0
Обробка кожного 512-бітного блоку:
мал. 8 Обробка кожного 512-бітного блоку
34
0≤t≤1gk1=0xA827999
Ціла частина 230 2
20≤t≤39kt=0x6ED9EBA1
Ціла частина 230 3
40≤t≤59kt=0x8F1BBCDC
Ціла частина 230 5
60≤е≤79kt=0xCA62C1D6
Ціла частина 230 10
мал. 9 Схема циклу
ЛОГІКА ВИКОНАННЯ ROUNDX
табл. 7 Логіка виконання ROUNDX
Номер циклу
Ft (B,C,D)
0≤t≤19
(B^C) ∨ (~B^D)
20≤t≤39
B xor C xor D
40≤t≤59
(B^C) ∨ (B^D) ∨ (C^D)
60≤t≤79
B xor C xor D
35
Слова Wt обчислюються на підставі початкових даних, за якими
ведеться обробка.
мал. 10 Обчислення слів
Wt=W t-16 xor W t-14 xor W t-8 xor W t-3
табл. 8 Порівняння MD5 та SHA1
Реалізація MD4, MD5, SHA1:
C++; OpenSSL; Java; java.security; System.Security.Cryptography
МЕТОДИ ЗБЕРІГАННЯ Й СТИСНЕННЯ ГРАФІЧНОЇ ІНФОРМАЦІЇ.
ФОРМАТИ ГРАФІЧНИХ ФАЙЛІВ
Зображення на екрані монітора формується з маленьких квадратиків
(іноді їх називають точками) – пікселів. Залежно від типу монітору та
відеокарти кількість таких пікселів на екрані може бути різною. Сучасні
відеокарти забезпечують розширення 1024 на 768 пікселів і більше. Кожному
пікселю відповідають один або декілька байтів відеопам'яті, що задають
атрибути пікселя: колір, яскравість. Отже, зображення на екрані – це масив у
відеопам'яті, кожен елемент якого містить значення атрибутів для одного
пікселя.
Усі графічні файли можна розділити на два великі класи: растрові
файли та векторні.
36
Растрове зображення – це зображення, складене за допомогою
окремих точок.
Векторне зображення – зображення, складене з групи більш складних
об'єктів і представлене за допомогою їх опису.
Зображення, побудоване за допомогою окремих точок – пікселів,
називається растровим. Реально зображення ділиться на квадратики (пікселі)
і дані про кожен з них кодується. Така схема вже багато віків тому була
придумана для вишивання візерунків хрестиком. Помітимо, що растрові
малюнки у комп'ютерах мають прямокутну форму: до будь-якого зображення
додається фон, що перетворює малюнок на прямокутник. Не знаючи розміру
пікселя, не можна побудувати зображення на основі закодованих даних. На
практиці використовують не розмір пікселя, а задають ширину та висоту (у
пікселях, у сантиметрах або в інших одиницях) малюнка і його розрішення.
Розрішення екрану – це щільність розміщення пікселів. Вона залежить
від якості кінескопа монітора. Прийнятою одиницею виміру розрішення є
кількість точок на дюйм – dpi (Dot Per Inch). При відображенні малюнків на
моніторі, використовують розрішення від 72 dpi до 120 dpi. При друці
найпоширенішим розрішенням для виведення тексту є 300 dpi, але для
високоякісного друку можна використовувати і більше розрішення (1440
dpi).
Пристрої, які формують зображення з окремих точок, називаються
растровими. Відеомонітор, матричний і лазерний принтери є растровими
пристроями.
Недоліки растрових зображень:
* Погане масштабування. При зменшенні зображення декілька сусідніх
точок перетворяться в одну, тому втрачаються дрібні подробиці. При
збільшенні масштабу відбувається збільшення розміру кожної точки, через
що з'являється ступінчастий ефект.
* Великий розмір файлу, оскільки включені дані про кожен піксель
зображення
37
ФОРМАТ BMP
Формат bmp (від слів BitMaP – бітова карта, або, бітовий масив)
представляє собою нестиснене зображення. Воно досить легко читається і
виводиться до ОС Windows, оскільки у неї включені спеціальні функції API,
які в цьому допомагають.
За рішенням розробників формат Bmp-файлу не прив'язаний до
конкретної апаратної платформи. Цей файл складається з чотирьох частин:
заголовка, інформаційного заголовка, таблиці кольорів (палітри) і даних
зображення. Якщо у файлі зберігається зображення з глибиною кольору 24
біти (16 млн. кольорів), то таблиця кольорів може бути відсутньою.
Заголовок файлу починається з сигнатури "BM", а потім йде довжина
файлу, виражена у байтах. Наступні 4 байти зарезервовано для подальших
розширень формату, а закінчується цей заголовок зміщенням від початку
файлу до записаних у ньому даних зображення. При 256 кольорах це
зміщення складає 1078.
Інформаційний заголовок починається з власної довжини (вона може
змінюватися, але для 256-кольорового файлу складає 40 байт) і містить
розміри зображення, розрішення, характеристики представлення кольору й
інші параметри.
Ширина і висота зображення задаються у точках растру і пояснень,
мабуть, не вимагають.
Кількість площин могла застосовуватися у файлах, що мають невелику
глибину кольору. При кількості кольорів 256 і більше воно завжди дорівнює
1, тому зараз це поле вже можна вважати застарілим, але для сумісності воно
зберігається.
Глибина кольору вважається найважливішою характеристикою способу
представлення кольору у файлі і вимірюється у бітах на точку. У даному
випадку вона дорівнює 8.
38
Компресія. У Bmp-файлах зазвичай не використовується, але поле у
заголовку для неї передбачено. Зазвичай вона дорівнює 0, і це означає, що
зображення не стиснене. Надалі використовуватимемо тільки такі файли.
Розмір зображення – кількість байт пам'яті, що вимагаються для
зберігання цього зображення, не рахуючи даних палітри.
Горизонтальне і вертикальне розширення вимірюються в точках растру
на метр. Вони особливо важливі для збереження масштабу відсканованих
картинок. Зображення, створені за допомогою графічних редакторів, як
правило, мають у цих полях нулі.
Кількість кольорів дозволяє скоротити розмір таблиці палітри, якщо в
зображенні реально є присутніми менше кольорів, ніж це допускає вибрана
глибина кольору. Проте на практиці такі файли майже не зустрічаються.
Якщо кількість кольорів набуває значення, максимально допустимого
глибиною кольору, наприклад 256 кольорів при 8 бітах, поле стає нульовим.
Кількість основних кольорів – йде з початку палітри, і його бажано
виводити без спотворень. Це поле буває важливим тоді, коли максимальна
кількість кольорів дисплея була меншою, ніж у палітрі Bmp-файлу. При
розробці формату, очевидно, приймалося, що кольори, які найчастіше
зустрічаються, будуть розташовуватись на початку таблиці. Зараз цієї вимоги
практично не дотримуються, тобто кольори не упорядковуються за частотою,
з якою вони зустрічаються у файлі. Це дуже важливо, оскільки палітри двох
різних файлів, навіть складених з одних і тих самих кольорів, утримували б
їх (кольори) у різному порядку, що могло істотно ускладнити одночасне
виведення таких зображень на екран.
Слідом за інформаційним заголовком йде таблиця кольорів, що є
масивом з 256 (за числом кольорів) 4-байтових полів. Кожне поле відповідає
своєму кольору в палітрі, а три байти з чотирьох – компонентам синьої,
зеленої та червоної складових для цього кольору. Останній, найстарший байт
кожного поля зарезервований і дорівнює 0.
39
Після таблиці кольорів знаходяться дані зображення, яке по рядках
растру записане від низу до верху, а усередині рядка – зліва направо.
Оскільки на деяких платформах неможливо зчитати одиницю даних, яка
менша від 4 байт, довжина кожного рядка вирівняна на межу в 4 байти, тобто
при довжині рядка, некратного чотирьом, вона доповнюється нулями. Цю
обставину обов'язково потрібно враховувати при зчитуванні файлу, хоча,
можливо, краще заздалегідь потурбуватися, щоб горизонтальні розміри усіх
зображень були кратні 4.
СТРУКТУРА BMP-ФАЙЛУ
табл. 9 Структура bmp-файлу
Ім’я
Довжина Зміщення
Заголовок файлу (BitMapFileHeader)
Type
2
0
Size
4
2
Reserved 1
2
6
Reserved 2
2
8
OffsetBits
4
10
Опис
Сигнатура "BM"
Розмір файлу
Зарезервовано
Зарезервовано
Зміщення зображення від початку
файлу.
Информационный заголовок (BitMapInfoHeader)
Size
4
14
Довжина заголовку
Width
4
18
Ширина зображення, точки
Height
4
22
Висота зображення, точки
Planes
2
26
Кількість площин
BitCount
2
28
Глибина кольору, біт на точку
Compression
4
30
Тип компресії (0 – не стисле
зображення)
SizeImage
4
34
Розмір зображення, байт
XpelsPerMeter 4
38
Горизонтальне розширення, точки
на метр
YpelsPerMeter 4
42
Вертикальне розширення, точки на
метр
ColorsUsed
4
46
Кількість кольорів, що
використовуються (0 –
максимально можливе для даної
глибини кольору)
ColorsImportant 4
50
Кількість основних кольорів
Таблица кольорів (палітра) (ColorTable)
ColorTable
1024
54
256 елементів по 4 байти
Данные изображения (BitMap Array)
Image
Size
1078
Зображення, що записане по
рядкам зліва направо та з низу
догори
40
ФОРМАТ GIF
мал. 11 Мінімально необхідний набір блоків - найпростіший неанімованний GIF
табл. 10 Таблиця для різних глибин кольору зображення
табл. 11 Таблиця для різних розмірів палітр та кількості кольорів картинки
41
СТИСНЕННЯ РАСТРОВИХ ЗОБРАЖЕНЬ
Піксель є неподільною точкою у графічному зображенні растрової
графіки на екрані монітора. Він характеризується прямокутною формою і
розмірами, що визначають просторове розрішення зображення. Біда
растрових файлів у тому, що вони великі, навіть дуже великі. Якщо
знехтувати заголовками файлу та іншими неграфічними даними, його розмір
пропорційний кількості пікселів у зображенні і кількості бітів, потрібних для
представлення
кожного
пікселя.
Повнокольорова
картинка
розміром
1024х768 пікселів займає більше двох мегабайт пам'яті. Використовуючи
метод, що зветься стисканням зображень, можна різко зменшити у розмірі
графічні файли. Існує два способи стискання:
1) без втрат інформації
2) з втратами.
Якщо ми зберігаємо креслення, то, природно, що стискання з втратами
нас не влаштує, зберігаючи ж якусь картинку, узагальнення відтінків її
кольорів цілком допустимо, а іноді призводить і до вдалих спецефектів.
Короткий опис формату GIF:
GIF – один з найпоширеніших і популярніших в Інтернеті форматів
зображень. Таке широке поширення GIF багато в чому визначається
особливостями його формату.
Загальні дані:
• Розмір картинки – від 1х1 до 65535х65535 пікселів.
• Кількість кольорів палітри – від 2 до 256.
• Кожен колір палітри має глибину 24 біта/піксель (вибір з 16 мільйонів
кольорів).
• Карта прозорості – 1-бітова (напівпрозорих кольорів немає).
• Кількість повторів анімації – від 1 до 65535, а також нескінченне.
• Час показу одного кадру анімації – від 1/100 секунди до 655 секунд.
• Кількість кадрів анімації – необмежена.
42
• Кількість невидимих текстових коментарів і розмір кожного коментаря
– необмежені.
Структура GIF-файлу:
1. Файли формату GIF мають блокову структуру. Це означає, що вони
складаються з окремих блоків, які в більшості випадків ніяк не пов'язані один
з одним. Програми, що не розпізнають деякі типи блоків, можуть просто
пропускати їх – для цього у кожного нестандартного блоку в заголовку
вказаний його розмір. Блоки графіки (картинки), що йдуть один за іншим,
складають анімацію. Вони змінюються на екрані і створюють ілюзію руху.
До або після них (або навіть між ними) у файлі можуть знаходитися інші
блоки:
1. Коментарі. Прихований текст, його можна побачити лише за допомогою
спеціальних програм – наприклад, GIF-аніматорів, таких, як Ulead GIF
Animator.
2. Простий
текст.
Рядки
символів
з
обмеженими
можливостями
форматування. Нині не використовується.
3. Блоки управління графікою, що задають параметри виведення окремих
картинок.
4. Глобальна і локальні палітри кольорів, що визначають, які саме кольори
будуть у картинок.
5. Особливі блоки, які можуть використовуватись лише тими програмами, які
знають про їх існування та призначення – наприклад, блок Netscape, що задає
кількість циклів анімації. Без нього анімація після завантаження сторінки
спрацьовує лише один раз.
Мінімальний
необхідний
набір
неанімованого GIF (дивитись мал. 11):
1. Дескриптор логічного екрану.
2. Глобальна палітра.
3. Дескриптор зображення.
4. Зображення.
блоків
для
найпростішого
43
На початку кожного файлу GIF знаходиться заголовок. Оскільки
відразу за ним іде дескриптор логічного екрану, заголовок вважається його
частиною. Він складається з тексту "GIF87a" або "GIF89a", залежно від
версії.
Дескриптор – це просто "описувач" або "опис". Логічний екран –
область реального екрану комп'ютера, куди виводяться усі картинки даного
файлу GIF. Вони можуть мати різний розмір і займати різне положення на
логічному екрані. W, H – ширина і висота логічного екрану в пікселях, тобто
розмір області виведення картинок. Зображення, що не уміщаються на
логічному екрані, повинні обрізатися за його розміром.
BG – номер кольору фону. Якщо у файлі присутня глобальна палітра,
то цим кольором заливаються області фону, де нема картинок. Але якщо при
цьому в найпершому, ще до усіх картинок, розширенні управління графікою
включена прозорість, то цей колір вважається прозорим.
R – співвідношення сторін початкового зображення. У версії GIF87a це
поле зарезервоване, і тут стоять нулі. Наскільки відомо, цей параметр ніколи
і ніким не використовується. Передбачалося, що піксель екрану може бути і
не квадратним, як було в старих комп'ютерах і як зараз буває при деяких
режимах DOS, і що для виведення таких зображень необхідно змінювати
розрішення екрану або розтягувати зображення так, щоб воно виглядало
реалістичнішим.
CT – наявність глобальної палітри. Якщо цей прапорець встановлений,
то відразу після дескриптора глобального екрану повинна починатися
глобальна палітра. Розмір палітри визначається полем Size.
Color – колірне розрішення початкової картинки. Число бітів, що
доводиться на кожен з трьох основних кольорів. Якщо файл GIF створений
безпосередньо з повнокольорового зображення, то Color дорівнюватиме 7, а
якщо з вже індексованого, то його значення залежатиме від глибини кольору
цієї індексованої картинки, причому дуже приблизно. Наприклад, якщо файл
створений на основі 16-кольорної картинки, то Color має бути рівним 1, і
44
початкова палітра має дорівнювати 1, початкова палітра передбачається 64кольоровою.
SF – прапорець сортування палітри. У версії GIF87a цей біт зарезервований, і
тут стоїть нуль. Вказує, чи відсортована палітра за значимістю кольорів, коли
першими йдуть найбільш значущі кольори. Значущість кольору визначається
тим, яку площу зображення він займає по відношенню до інших кольорів.
Size – розмір палітри та кількість кольорів картинки. Якщо прапорець
глобальної палітри CT скинутий, то тут мають стояти нулі.
Глобальна палітра
Зображення, що зберігаються у файлі GIF, індексовані. Картинки
складаються не з повнокольорових пікселів, а з номерів кольорів, а самі
кольори знаходяться у палітрі. Палітра складена з тріад, що у свою чергу
складаються з байтів червоного (R), зеленого (G) і синього (B) основних
кольорів. З усього розмаїття кольорів (сучасні комп'ютери і монітори можуть
показувати на екрані до 16 мільйонів кольорів) використовується лише від 2
до 256. Зведення числа кольорів до мінімуму без значного погіршення якості
зображення і без втрати інформації – схожий на мистецтво, і автоматизації
піддається погано. Багато графічних редакторів – такі як Adobe Photoshop,
наприклад – дозволяють інтерактивно обрати найкращий варіант індексації
картинки «на око».
Якщо вона є, глобальна палітра йде одразу за дескриптором логічного
екрану. Наявність палітри визначається прапором CT дескриптора, а розмір –
полем Size. Глобальна палітра діє на усі картинки, у яких немає своєї
локальної палітри. У тому аварійному випадку, якщо у файлі немає ані
глобальної, ані локальних палітр, програма перегляду може діяти на власний
розсуд
–
наприклад,
використовувати
системну
палітру.
Проте
рекомендується, щоб перші два кольори в ній були чорними і білими, щоб у
будь-якому випадку на екран вивелося хоч щось.
45
Дескриптор зображення
Діє на графічний блок (картинку), що йде за ним. Без нього картинка
виводиться не буде, так що його можна вважати невід'ємною частиною
графічного блоку. Між дескриптором і блоком графіки може знаходитися
тільки локальна палітра.
W, H – ширина і висота картинки в пікселях.
Left, Top – положення картинки на логічному екрані.
CT – наявність локальної палітри. Якщо цей прапорець встановлений,
то відразу після дескриптора зображення повинна починатися локальна
палітра. Розмір палітри визначається полем Size.
I – черезстрокова або звичайна розгортка картинки при виводі на
екран. При скачуванні картинки з Інтернету черезстрокова розгортка
дозволяє швидше отримати перше враження про зображення, хоча воно буде
ще недостатньо чітким. Проте файли з черезстроковою розгорткою трохи
більше за розміром, а при перегляді у відключеному режимі такі картинки
можуть виводитися повільніше.
SF – прапорець сортування палітри. У версії GIF87a цей біт
зарезервований, і тут стоїть нуль. Вказує, чи сортована палітра за значимістю
кольорів, коли першими йдуть найбільш значущі кольори. Значущість
кольору визначається тим, яку площу зображення він займає по відношенню
до інших кольорів.
Size – розмір локальної палітри і число кольорів картинки (див. вище).
Якщо прапорець локальної палітри CT скинутий, то тут повинні стояти нулі.
Локальна палітра
46
Якщо вона є, повинна йти одразу за дескриптором зображення
Наявність палітри визначається прапорцем CT дескриптора, а розмір – полем
Size. Діє вона тільки на той графічний блок (картинку), що йде одразу за
нею.
Для зменшення розміру файлу краще обмежитися однією глобальною
палітрою, не прибігаючи до локальних – особливо, якщо йдеться про
багатоколірні картинки. Максимальний розмір палітри при 256 кольорах –
768 байт, а якщо помножити на число картинок в анімації, то сума набігає
солідна.
Графічний блок
Картинка, стиснута за допомогою методу LZW. Вона розбита на окремі
субблоки по 255 байт. Число картинок у файлі, як і розмір кожної картинки,
нічим не обмежені. Анімованим GIF стає у тому випадку, якщо в ньому
більше однієї картинки. Тоді при перегляді файлу в браузері автоматично
включається анімація.
MC – початковий розмір LZW-коду. Рівний глибині кольору картинки,
за виключенням двоколірних, коли MC рівний не 1, а 2.
табл. 12 Початковий розмір LZW-коду
S – розмір субблоку даних, не включаючи сам байт S. У всіх субблоків,
окрім останнього, розмір має дорівнювати 255 байтам. У останнього
47
субблоку (або якщо він узагалі один) розмір може бути будь яким – від 1 до
255 байт.
Розширення управління графікою
Введено у версії GIF89a. Діє на перший же графічний блок (картинку),
що йде за ним. Між ним і блоком графіки можуть бути вставлені інші блоки
(наприклад, коментар) – це його роботі не заважає.
Delay – час затримки, у 1/100 сек. Час, впродовж якого ця картинка
залишається на екрані. Мінімальне значення – 1/100 секунди, максимальне –
приблизно 655 секунд. Таймер починає відлік лише після того, як картинка
виведена на екран, тому у різних програм перегляду час затримки може
істотно розрізнятися. Наприклад, якщо спробувати зробити анімований GIF –
годинник, то вони можуть, залежно від браузеру, за хвилину поспішати або
відставати більш ніж на секунду.
Tr – номер прозорого кольору. Якщо є локальна палітра, це номер
кольору в ній, якщо ж локальної палітри немає, то це номер кольору в
глобальній палітрі.
Disp – спосіб заміни картинки після показу:
табл. 13 Спосіб заміни картинки
UI – очікується реакція користувача. Ще один ніколи і ніким не
використовуваний параметр. Передбачалося, що якщо цей прапорець
48
встановлений, то після виведення цієї картинки для продовження анімації та
виведення наступних необхідно, наприклад, клацнути кнопкою мишки.
TF – прапорець прозорості. Якщо він встановлений, ця картинка
виводиться з прозорим фоном, колір якого визначається параметром Tr.
Розширення простого тексту
Введено у версії GIF89a. Передбачалося, що разом з картинками
передаватимуться текстові повідомлення, що з'являються на екрані в паузах
між ними або поверх них. Оскільки символи більше 0xF7 не виводяться
(замінюються на пробіли), це робить розширення непридатним для
виведення символів кирилиці (російських букв). Нині усі тексти у файлах
GIF ідуть у вигляді картинок, так що це розширення ніколи і ніким не
використовується.
Left, Top–положення області тексту на логічному екрані.
W, H – розмір області тексту. Рядки, що виходять за її рамки,
обрізаються. Переклади рядка мають бути заздалегідь вставлені до тексту.
cW, cH – розмір символів. Рекомендується використовувати значення
8х8 або 8х16 пікселів, що нині годиться лише для DOS.
FG – номер кольору тексту.
BG – номер кольору фону. Цим кольором заливаються області фону, де
немає тексту.
S – розмір субблоку даних, не включаючи сам байт S. У усіх субблоків,
окрім останнього, розмір має дорівнювати 255 байтам. У останнього
субблоку (або якщо він узагалі один) розмір може бути будь-яким – від 1 до
255 байт.
Розширення коментаря
49
Введено у версії GIF89a. В основному сюди записують дані про
авторські права творців файлу GIF – і людей, і програм. Щонайдовший текст
можна чекати у тому випадку, якщо програма безкоштовна або умовнобезкоштовна. Довжина тексту нічим не обмежується.
S – розмір субблоку даних, не включаючи сам байт S. У всіх субблоків,
окрім останнього, розмір має дорівнювати 255 байтам. У останнього
субблоку (або якщо він узагалі один) розмір може бути будь-яким – від 1 до
255 байт.
Розширення додатка
Введено у версії GIF89a. Розширення додатка – це спеціальні блоки
даних – не картинка і не текст. З ними можуть працювати тільки ті програми
(додатки), для яких вони призначені. Найбільшим відомим стало розширення
додатка Netscape, що описується нижче.
ID – ідентифікатор додатка. Текст з 8 символів, по якому програма
перегляду визначає, чи зможе вона прочитати дані, і якого вони типу.
Code – код перевірки ідентифікатора. Передбачалося, що програма, яка
створила GIF, синтезуватиме двійковий код для підтвердження своїх прав на
це розширення. На ділі тут теж знаходиться текст з 3 символів.
S – розмір субблоку даних, не включаючи сам байт S. У всіх субблоків,
окрім останнього, розмір має дорівнювати 255 байтам. У останнього
субблоку (або якщо він взагалі один) розмір може бути будь-яким – від 1 до
255.
Розширення додатка Netscape
Має йти одразу за глобальною палітрою (якщо вона є) або за
дескриптором логічного екрану (якщо її немає). Єдина мета цього
розширення – встановити кількість циклів анімації. Як можна здогадатися,
50
першим застосуванням, яке могло використовувати цю інформацію, був
браузер Netscape 2.0. Зараз це розширення є присутнім майже в усіх файлах
GIF, де є анімація.
? – тут стоїть 0x01, але що це означає, невідомо. Можливо, спочатку
цей
байт
передбачалося
використовувати,
але
потім
він
виявився
непотрібним.
Loop – кількість циклів анімації, від 0 до 65535. Тут є деякі
особливості. По-перше, без розширення Netscape цикл анімації спрацьовує,
але тільки один раз. Якщо ж вставити розширення Netscape у файл і
встановити Loop = 1, то цикл прокручуватиметься двічі, як і при Loop = 2. А
при Loop = 0 анімація крутиться нескінченно, так що її відключення, для
того, щоб виводилася тільки одна перша картинка, у будь-якому випадку
виявляється неможливим.
Висновок
Може здатися, що формат GIF зі своїми 256 кольорами вже остаточно
застарілий, проте порівняно з іншою технікою виведення зображень він
навіть може в чомусь і вигравати. Наприклад, застосування для створення
анімованих кнопок і банерів замість картинок GIF техніки Flash припускає,
що на кожному браузері встановлений плагин Flash або елемент ActiveX
Flash потрібної версії. Це може в окремих випадках привести до того, що
користувачі не лише не зможуть побачити рекламу, але і взагалі не зможуть
потрапити на цей сайт, тоді як підтримка GIF вбудована в усі браузери,
починаючи з найперших версій.
Формат PNG, що завойовує все більшу популярність, при усіх своїх
беззаперечних плюсах (повнокольорова картинка, прозорість з альфаканалом), не може забезпечувати такого сильного стиснення малокольорових
зображень, не кажучи вже про анімацію. Його анімована модифікація MNG
поки що не підтримується жодним браузером. Інші нові формати – такі, як
JPEG 2000 – орієнтовані в основному на фотографічні зображення і не
складають серйозної конкуренції формату GIF, тим паче що пройде ще
51
багато часу, поки браузери в усьому світі будуть користуватися підтримкою
цих нових форматів. У теперішній же час GIF, разом з JPEG, залишається
одним з двох основних форматів зображень, що використовуються в
Інтернеті, і, швидше за все, служитиме нам ще довго.
АЛГОРИТМ JPEG
У алгоритмі JPEG початкове зображення представляється двовимірною
матрицею розміру N*N, елементами якої є колір або яскравість пікселя.
Упаковка значень матриці виконується за три етапи.
- Дискретне косинусне перетворення
- Етап Квантування
- Етап Вторинного стискання
Висока ефективність стискання, яку дає цей алгоритм, заснована на
тому факті, що в матриці частотних коефіцієнтів, що утворюється з
початкової
матриці
після
дискретного
косинусного
перетворення,
низькочастотні компоненти розташовані ближче до лівого верхнього кута, а
високочастотні – внизу праворуч. Це важливо тому, що більшість графічних
образів на екрані комп'ютера складаються з низькочастотної інформації, так
що високочастотні компоненти матриці можна безболісно викинути.
«Викидання» виконується шляхом округлення частотних коефіцієнтів. Після
округлення
відмінні
від
нуля
значення
низькочастотних
компонент
залишаються, головним чином, в лівому верхньому кутку матриці. Округлена
матриця значень кодується з урахуванням повторів нулів. У результаті
графічний образ стискується більш ніж на 90%, втрачаючи дуже небагато в
якості зображення тільки на етапі округлення.
Дискретне косинусне перетворення
Дискретне косинусне перетворення (ДКП) є перетворенням масиву
пікселів у масив значень просторової частоти. Це перетворення є зворотнім з
точністю
до
просторового
помилок
округлення.
представлення
Воно
зображення
дозволяє
до
його
переходити
від
спектрального
52
представлення і назад. Зображення, представлене матрицею розміру NxN,
може
бути
представлене
за
допомогою
коефіцієнтів
двовимірного
косинусного перетворення таким чином:
𝑁−1 𝑁−1
2
(2𝑦 + 1)𝜋𝑣
(2𝑥 + 1)𝜋𝑢
𝑝(𝑥, 𝑦) = � � 𝐶(𝑢)𝐶(𝑣)𝑆(𝑢, 𝑣) cos �
� cos �
�
𝑁
2𝑁
2𝑁
𝑢=0 𝑣=0
де С(𝑓) = �
1⁄√2 , 𝑓 = 0
для f=u или f=v
1, 𝑓 > 0
Саме ДКП виглядає наступним чином:
𝑁−1 𝑁−1
2
(2𝑦 + 1)𝜋𝑣
(2𝑥 + 1)𝜋𝑢
𝑆(𝑢, 𝑣) = 𝐶(𝑢)𝐶(𝑣) � � 𝑝(𝑥, 𝑦) cos �
� cos �
�
𝑁
2𝑁
2𝑁
𝑥=0 𝑦=0
У алгоритмі JPEG використовують ДКП початкового зображення
блоками розміру 8х8 пікселів. Розмір вибраний так, щоб не сильно
збільшувати обчислювальну складність алгоритму і при цьому мати мінімум
візуальної втрати якості зображення. ДКП для зручності здійснюється
послідовно, у декілька етапів. Спочатку створюється ДКП матриця 8х8, що
використовує формулу:
DCT = 1/sqr(N), если i=0
ij
DCT = sqr(2/N)*cos[(2j+1)*i*3.14/2N], если i > 0
ij
N = 8, 0 < i < 7 , 0 < j < 7
У результаті маємо:
. 353553
. 490393
�. 461978
. 414818
𝐷𝐶𝑇 = �
. 353694
�. 277992
. 191618
. 097887
. 353553
. 353553
. 353553
. 353553
. 353553
. 353553
. 353553
. 415818
. 277992
. 097887 −.097106 −.277329 −.415375 −.490246
. 191618 −.190882 −.461673 −.462282 −.192353 . 190145
. 461366 �
−.097106 −.490246 −.278653 . 276667
. 490710
. 099448 −.414486
�
−.353131 −.354256 . 352567
. 354819 −.352001 −.355378 . 351435
−.490246 . 096324
. 416700 −.414486 −.100228 . 491013 −.274673�
−.462282 . 461366 −.189409 −.193822 . 463187 −.460440 . 187195
−.278653 . 416700 −.490862 . 489771 −.413593 . 274008 −.092414
Початкове зображення піддається зміщенню рівня яскравості так, щоб
значення яскравості були симетричні відносно 0. Для зображень, що містять
53
256 кольорів, дана процедура здійснюється шляхом віднімання зі значень
яскравості пікселів 128.
Наприклад, нам потрібно стиснути наступний фрагмент зображення:
95
143
�153
143
𝐼𝑀𝐺 = �
123
�133
160
154
88
144
151
144
112
151
168
155
88
151
162
133
116
162
166
153
87
151
166
130
130
166
159
144
95
153
162
143
143
170
135
126
88
170
151
153
147
188
101
106
95
183
126
159
162
166
93
118
95
181
117�
175
�
189
128�
98
133
−33 −40 −40 −41 −33 −40 −33 −33
15
16
23
23
25
42
55
53
� 25
23
34
38
34
23
−2 −11�
15
16
5
2
15
25
31
47
�
𝐼𝑀𝐺 = �
−5 −16 −12
2
15
19
34
61
23
34
38
42
60
38
0 �
� 5
32
40
38
31
7
−27 −35 −30
26
27
25
16
−2 −22 −10
5
Ось формула, за якою приводиться ДКП: RES*IMG*DCT
Для початку треба підрахувати проміжну матрицю: TMP = IMG*DCT
−103 −3
1
2
4
0 −1 5
89
−40 12
−2
−7
5
1
0
� 57
31 −30
6
2
0
5
0�
55
−28 24
1
0
−8 0
0
𝑇𝑀𝑃 = �
�
32
−60 18
−1
14
0 −8 1
−11 −37 17 −24 4
0 −4�
� 84
19
81 −16 −20
8
−3 4
0
22
40
11 −22
8
0 −3 2
Потім помножаємо її на ДКП матрицю: RES = TMP*DCT
91
3
−5
−6
−38 −57
9
17
�−80 58
0
−18
−52 −36 −11 13
𝑅𝐸𝑆 = �
−86 −40 44
−7
�−62 64 −13 −1
−16 14 −35 17
−53 32
−9
−8
2
0
1
−2
2
2
4
3
4�
−9
3
0
�
17 −6 4
3
−8 0 �
−11 2 −1
22
0
2
54
Етап квантування
На цьому етапі ми обчислимо матрицю квантування, використовуючи
цей псевдо код:
for i:=0 to 8 do
for j:=0 to 8 do
Q[i,j] = 1+((1+i+j)*q);
де q – це коефіцієнт якості, від нього залежить ступінь втрати якості
стиснутого зображення
для q = 2 маємо матрицю квантування:
3
5
7
9 11 13 15 17
5
7
9 11 13 15 17 19
�7
9 11 13 15 17 19 21�
9 11 13 15 17 19 21 23
𝑄=�
�
11 13 15 17 19 21 23 25
�13 15 17 19 21 23 25 27�
15 17 19 21 23 25 27 29
17 19 21 23 25 27 29 31
Тепер потрібно кожне число в матриці квантування розділити на число
у відповідній позиції в матриці RES, у результаті отримаємо:
30
0 0 0 0 0
−7
8 1 1 0 0
�−11 6 0 1 0 0
−5 −3 0 0 0 0
𝐴=�
−7 −3 2 0 0 0
4 0 0 0 0
� −4
−1
0 1 0 0 0
−3
1 0 0 0 0
0
0
0
0
0
0
0
0
0
0
0�
0
�
0
0�
0
0
Як бачимо, тут маємо досить багато нулів, ми отримаємо найбільш
довгу послідовність
нулів,
зигзагоподібного обходу блоку:
якщо
будемо
використовувати
алгоритм
55
табл. 13 Зигзагоподібний обхід блоку
1
3
4
10
11
21
22
36
2
5
9
12
20
23
35
37
6
8
13
19
24
34
38
49
7
14
18
25
33
39
48
50
15
17
26
32
40
47
51
58
16
27
31
41
46
52
57
59
28
30
42
45
53
56
60
63
29
43
44
54
55
61
62
64
Отже, ми отримали послідовність:
30 0 -7 -11 8 0 0 1 6 -5 -7 -3 0 1 0 0 0 1 0 -3 -4 -1 4 2 0 0 0 0
0 0 0 0 0 0 0 -3 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Етап Вторинного cтиснення
Найбільш розповсюдженим методом вторинного стиснення є метод
Хаффмана та його різновиди.
Відновлення зображення, стисненого за допомогою алгоритму JPEG
При розпаковці зображення виконується зворотна послідовність кроків:
1. Виконується декодування даних, отриманих у результаті вторинного
стискання. На цьому етапі відновлюється матриця квантованих коефіцієнтів.
2. Виконується деквантування матриці, внаслідок чого виходить
матриця близька до початкової матриці, отриманої після косинусного
перетворення. Вона є близькою, але не точною, за рахунок округлення на
етапах квантування і деквантування.
3. Виконується зворотне дискретне косинусне перетворення, яке
відновлює початковий масив пікселів.
𝑁−1 𝑁−1
2
(2𝑦 + 1)𝜋𝑣
(2𝑥 + 1)𝜋𝑢
𝑝(𝑥, 𝑦) = � � 𝐶(𝑢)𝐶(𝑣)𝑆(𝑢, 𝑣) cos �
� cos �
�
𝑁
2𝑁
2𝑁
𝑢=0 𝑣=0
де С(𝑓) = �
1⁄√2 , 𝑓 = 0
для f=u или f=v
1, 𝑓 > 0
JPEG без втрат
Це найпростіший режим роботи без втрати даних, заснований на
прогнозуючій моделі. Як правило, цей метод дозволяє досягти коефіцієнта
56
стискування близько 2:1, що значно менше, ніж коефіцієнти, які можуть бути
досягнуті в методах, заснованих на ДКП.
Одна з відмінностей: обробляється все зображення, а не блок розміру
8х8. При скануванні зображення кожне значення пікселя замінюється
значенням: Результат = Піксель - Прогноз
Тут
«Прогноз»
–
значення,
засноване
на
значеннях
деяких
відсканованих раніше сусідніх пікселях. Сенс полягає в наступному: як
правило, значення пікселя на реальному зображенні близьке до значень
сусідніх пікселів. Тому прогноз, заснований на значеннях сусідніх пікселів,
має бути близьким до фактичного значення або співпадати з фактичним
значенням. Якщо перетворити матрицю пікселів у різницеву матрицю,
засновану на прогнозах, багато значень виявляться рівними нулю, а інші
значення будуть невеликі. Перетворене зображення повинне упаковуватися
компактніше. Для упаковки, як правило, застосовують метод Хеффмана.
Схема JPEG дозволяє використовувати прогноз, заснований на
значеннях деяких або усіх пікселів, суміжних з поточним, але зустрінутих
раніше в процесі сканування зліва направо або зверху вниз. Для кожного
пікселя, окрім пікселів лівого стовпця і верхнього ряду, у яких є тільки один
попередній піксель.
мал. 13 Розташування пікселів
Можливі наступні режими кодування:
табл. 14 Режими кодування
Режим кодування Прогноз
0
Немає
1
A
2
B
3
C
4
A+B+C
5
A+((B-C)/2)
6
B+((A-C)/2)
7
(A+B)/2
57
Як видно з малюнка і таблиці, алгоритм стиснення без втрат може бути
налагоджений для будь-якої комбінації попередніх пікселів. У режимах з 1 по
3 використовуються одновимірні прогнози. У режимах з 4 по 7 – двовимірні.
Які з них задіються, залежить від реалізації і положення пікселя, що
кодується.
У будь-якому випадку задіються наступні правила:
1. Значення прогнозу для лівого верхнього пікселя дорівнює 2^(P - 1),
де P – глибина кольору початкового зображення.
2. Для інших пікселів верхнього ряду прогноз ґрунтується на значенні
лівого сусіда (режим 1).
3. Для інших пікселів лівого стовпця прогноз ґрунтується на значенні
сусіда згори (режим 3).
Основи стиснення зображень
Основні завдання, що вирішуються при цифровій обробці зображень:
Приклад кодування JPEG
DCT-матриця для блоку 8х8 пікселів
. 353553
. 490393
�. 461978
. 414818
𝐷𝐶𝑇 = �
. 353694
�. 277992
. 191618
. 097887
. 353553
. 353553
. 353553
. 353553
. 353553
. 353553
. 353553
. 415818
. 277992
. 097887 −.097106 −.277329 −.415375 −.490246
. 191618 −.190882 −.461673 −.462282 −.192353 . 190145
. 461366 �
−.097106 −.490246 −.278653 . 276667
. 490710
. 099448 −.414486
�
−.353131 −.354256 . 352567
. 354819 −.352001 −.355378 . 351435
−.490246 . 096324
. 416700 −.414486 −.100228 . 491013 −.274673�
−.462282 . 461366 −.189409 −.193822 . 463187 −.460440 . 187195
−.278653 . 416700 −.490862 . 489771 −.413593 . 274008 −.092414
Початкове зображення
95
143
�153
143
𝐼𝑀𝐺 = �
123
�133
160
154
88
144
151
144
112
151
168
155
88
151
162
133
116
162
166
153
87
151
166
130
130
166
159
144
95
153
162
143
143
170
135
126
88
170
151
153
147
188
101
106
95
183
126
159
162
166
93
118
95
181
117�
175
�
189
128�
98
133
58
Зображення після зміщення яскравості:
−33 −40 −40 −41 −33 −40 −33 −33
15
16
23
23
25
42
55
53
� 25
23
34
38
34
23
−2 −11�
15
16
5
2
15
25
31
47
�
𝐼𝑀𝐺 = �
−5 −16 −12
2
15
19
34
61
23
34
38
42
60
38
0 �
� 5
32
40
38
31
7
−27 −35 −30
26
27
25
16
−2 −22 −10
5
Матриця IMG*DCT
−103
89
� 57
55
𝑇𝑀𝑃 = �
32
� 84
19
22
−3
1
2
4
0 −1 5
−40 12
−2
−7
5
1
0
31 −30
6
2
0
5
0�
−28 24
1
0
−8 0
0
�
−60 18
−1
14
0 −8 1
−11 −37 17 −24 4
0 −4�
81 −16 −20
8
−3 4
0
40
11 −22
8
0 −3 2
Результуюча матриця ДКП:
91
3
−5
−6
−38 −57
9
17
�−80 58
0
−18
−52 −36 −11 13
𝑅𝐸𝑆 = �
−86 −40 44
−7
�−62 64 −13 −1
−16 14 −35 17
−53 32
−9
−8
2
0
1
−2
2
2
4
3
4�
−9
3
0
�
17 −6 4
3
−8 0 �
−11 2 −1
22
0
2
Матриця квантування для q=2:
3
5
�7
9
𝑄=�
11
�13
15
17
5
7
9
11
13
15
17
19
7
9
11
13
15
17
19
21
9
11
13
15
17
19
21
23
11
13
15
17
19
21
23
25
13
15
17
19
21
23
25
27
15
17
19
21
23
25
27
29
17
19
21�
23
�
25
27�
29
31
59
Результат квантування:
Результат обходу:
30
0 0 0 0 0
−7
8 1 1 0 0
�−11 6 0 1 0 0
−5 −3 0 0 0 0
𝐴=�
−7 −3 2 0 0 0
4 0 0 0 0
� −4
−1
0 1 0 0 0
−3
1 0 0 0 0
0
0
0
0
0
0
0
0
0
0
0�
0
�
0
0�
0
0
30 0 -7 -11 8 0 0 1 6 -5 -7 -3 0 1 0 0 0 1 0 -3 -4 -1 4 2 0 0 0 0
0 0 0 0 0 0 0 -3 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Зворотне ДКП:
𝑁−1 𝑁−1
2
(2𝑦 + 1)𝜋𝑣
(2𝑥 + 1)𝜋𝑢
𝑝(𝑥, 𝑦) = � � 𝐶(𝑢)𝐶(𝑣)𝑆(𝑢, 𝑣) cos �
� cos �
�
𝑁
2𝑁
2𝑁
𝑢=0 𝑣=0
де С(𝑓) = �
1⁄√2 , 𝑓 = 0
для f=u или f=v
1, 𝑓 > 0
Принцип перетворення матриці зображення в JPEG без втрат:
Результат = Піксель – Прогноз
60
ОБРОБКА ЗВУКОВИХ СИГНАЛІВ
Звукова інформація представляється в цифровому вигляді у двох
принципово різних формах – WAVE та MIDI.
WAVE – форма використовується для цифрових аудіодисків, а MIDI - в
електронних музичних інструментах.
WAVE-форма звуку
WAVE-форма звуку отримується при оцифруванні, або дискретизації,
безперервної звукової хвилі (англ. wave – хвиля), точніше, аналогового
аудіосигналу. При оцифруванні спеціальний пристрій – аналого-цифровий
перетворювач (АЦП) – вимірює амплітуду хвилі через рівні проміжки часу зі
швидкістю у декілька тисяч вимірів у секунду і запам'ятовує у Wave-файл
виміряні значення. Вони називаються вибірками (з англ. sample, звідки ще
одна назва дискретизації – сэмплинг). Зворотне перетворення WAVE-формы
звуку в аналоговий сигнал здійснюється цифро-аналоговим перетворювачем
(ЦАП).
На мал. 14 представлена фонограма перших 10 секунд 40-ої симфонії
Моцарта, що містить 2 205 000 вибірок. Якщо на вашому комп'ютері
встановлена звукова плата, ви зможете її прослухати, клацнувши мишею на
картинці. На мал. 15 показаний фрагмент цього запису, що містить тільки 50
вибірок, починаючи з місця, відміченого на мал. 14 вертикальною рисою.
мал. 14 Фонограма перших 10 секунд 40-ої симфонії Моцарта
61
мал. 14 Фонограма симфонії Моцарта
WAVE-форма цифрового звуку характеризується п’ятьма
параметрами:
•
Частотою дискретизації,
•
Розрядністю вибірок,
•
Кількістю каналів або звукових доріжок,
•
Алгоритмом компресії/декомпресії – кодеком,
•
Форматом зберігання.
Чистота дискретизації
Під
дискретизацією
сигналів
розуміють
перетворення
функцій
безперервних змінних у функції дискретних змінних, за якими початкові
безперервні функції можуть бути відновлені з заданою точністю. Кожне
значення функції дискретної змінної називається відліком. Дуже часто роль
відліків виконують квантовані значення функцій у дискретній шкалі
координат.
Під квантуванням розуміють перетворення безперервної за значеннями
величини у величину з дискретною шкалою значень з кінцевої множини
дозволених, які називають рівнями квантування. Сутність квантування
полягає в округленні миттєвих значень вхідної функції до найближчих
значень рівнів квантування. Якщо рівні квантування нумеровані, то
результатом перетворення є число, яке може бути виражене в будь-якій
числовій системі. Кількість вибірок в секунду називається частотою
дискретизації і вимірюється в герцах і кілогерцах (1 кГц=1000 вибірок на
сек.). При визначенні кількості вибірок слід враховувати, що чим менше
62
інтервал між відліками (вибірками) dt, тим більшою буде частота
дискретизації і сигнал буде описаний точніше. З іншого боку, для обробки
такого сигналу буде потрібний більший об'єм пам'яті, великі ресурси
процесора, більше часу. Тому для визначення оптимальної частоти
дискретизації користуються теоремою Котельникова (КотельниковаНайквіста).
Теорема каже: Якщо безперервний сигнал x(t), який існує на усій
числовій осі й має обмежений спектр [- w, w] замінити відліками з
мінімальним кроком dt=pi/Wm=1/2Fm, то по цій множині відліків
можливе безпомилкове відновлення сигналу x(t).
Тобто теоретично, для правильного відновлення аналогового сигналу
по його цифровому запису достатньо, щоб частота дискретизації більш ніж в
два рази перевершувала максимальну частоту звуку.
мал. 16 Визначення оптимальної частоти дискретизації
Таким чином, для якісного відтворення найвищого звуку 20 кГц, що
можливо почути, потрібна частота дискретизації не менше ніж 40 кГц.
Стандарт CD - DA цифрових аудіодисків вимагає частоти дискретизації 44,1
кГц (так звана CD-якість). Використовуються також частоти 22,05 (радіоякість) і 11,025 і 8 кГц (телефонна якість), що у багатьох випадках дають
задовільні результати (наприклад, для запису мовлення). Звук є складним
сигналом, але, як і будь-який інший сигнал, він може бути представлений за
63
допомогою ряду Фур'є у вигляді суми постійних складових, а також синусів і
косинусів, тобто гармонійних сигналів (або гармонік).
f1 =
A
x (t ) =
0
2
1
2π
; ω1 =
Tn
Tn
∞
∞
k =1
k =1
+ ∑ A k cos kω1t + ∑ Bk sin kω1t
Tn
2 2
Ak =
∫T x (t )cos kω1tdt
Tn − 2
n
Bk =
Tn
2
2
∫ x (t )sin kω1tdt
Tn − T2
n
C0 ∞
x (t ) =
+ ∑ C k cos(kω1t + ϕk )
2 k =1
C k = A 2k + B2k
ϕk = −arctg
Bk
Ak
Але при оцифровці звуку дискретизуються і високочастотні гармоніки
з
частотою,
що
перевищує
половину
частоти
дискретизації
(це
високочастотний, нечутний шум). При цьому з’являються нові небажані
гармоніки з чутного діапазону (низькочастотний шум, див. мал. 17).
мал. 17 Поява низькочастотних перешкод
64
Тому для отримання якісного цифрового звуку процес дискретизації
будується за наступною схемою:
• часткове пригнічення високочастотних перешкод в аналоговому
сигналі за допомогою аналогового фільтру;
• оверсемплінг – дискретизація з частотою, що значно перевищує
потрібну (при цьому шум, що утворюється, все ще лежить у нечутному
діапазоні);
• пригнічення високочастотного шуму в цифровому звуці за
допомогою цифрового фільтру;
• перетворення до необхідної частоти дискретизації.
Оверсэмплинг застосовується і при зворотному перетворенні до
аналогового сигналу. При цьому використовуються різні методи лінійної та
нелінійної інтерполяції.
Розрядність вибірки
Виміряна амплітуда (вибірка) перетвориться на ціле число з деякою
погрішністю, яка визначається розрядністю цього числа. Це перетворення в
числа із заданою розрядністю називається квантуванням. Погрішність при
квантуванні вносить шум тим більший, чим менше розрядність. Теоретично,
при
n-розрядному
квантуванні
відношення
сигнал/шум
(динамічний
діапазон) складатиме 6n дБ. Таким чином, при 8-розрядному оцифруванні
динамічний діапазон буде 48 дБ (якість УКВ-радіо, достатня для мови), а при
16-розрядному оцифруванні він дорівнює 96 дБ і практично покриває весь
нормально чутний діапазон. Іншими словами, при 8-розрядному кодуванні
розрізняються 256 рівнів гучності, а при 16-розрядному – 65536, що дає
більш точний запис. На CD-DA застосовується 16-розрядне квантування.
Звукові плати комп'ютерів зазвичай використовують 8 і 16-розрядне
квантування. Застосування оверсемплінгу в АЦП і ЦАП дозволяє значно
зменшити шум, що додається при квантуванні.
65
Канали
Звичайні звукові плати дозволяють використовувати 1 або 2 звукових
канали (доріжки) WAVE-звуку – "моно" та "стерео". Обидва канали
обробляються окремо за одними й тими ж алгоритмами, хоча й одночасно.
Тому нема принципових обмежень на число каналів. Збільшення кількості
каналів веде до пропорційного збільшення об’єму пам’яті, яку займає звукова
інформація.
Основні методи обробки звуку: стиснення, аналогова фільтрація,
цифрова фільтрація.
Компресія звуку
Позначимо
•
W – об'єм пам'яті в байтах для зберігання 1 секунди звуку в WAVE-формі,
•
w – швидкість потоку звукових даних в WAVE-формі в біт/сек,
•
H – частоту дискретизації (число вибірок на секунду),
•
B – розрядність квантування (число розрядів на вибірку),
•
C – кількість каналів.
Тоді очевидно, що w = H*B*C і, якщо B кратне 8, W = w/8. Отже,
•
швидкість потоку даних CD-якосты (H=44100, B=16, C=2) складає 1 411
200 біт/сек або 1378,125 Кбит/сек (така швидкість забезпечується тільки CD
-дисководом з не менш, ніж 2-кратною швидкістю),
•
1 година звуку з якістю CD-DA потребує 605,6 Мбайт (тому на аудіодиску
розміщується близько 70 хвилин нестисненого звуку),
•
швидкість потоку даних телефонної якості (H=8000, B=8, C=1) складає 64
000 біт/сек або 62,5 Кбит/сек (така швидкість забезпечується далеко не
кожним модемом, тож такий звук не може використовуватися в Інтернеттелефонії).
З метою зменшення об'єму і потоку звукових даних у WAVE-формі
використовуються
різні
спеціальні
алгоритми
компресії/декомпресії
(кодеки), оскільки звичайні алгоритми стискання інформації тут не дають
ефекту. Стискання аудіоданих можливе лише з деякою втратою інформації,
66
але облік психофізіологічних особливостей сприйняття звуку (наприклад, не
усі частоти в чутному діапазоні істотні для сприйняття), дозволяє у ряді
випадків зробити ці втрати практично непомітними. Проте слід враховувати
дуже високу чутливість людського слухового апарату, особливо до
тимчасових характеристик звуку. Найбільш відомими є наступні кодеки, що
використовуються в мультимедіа під Windows:
•
PCM (Pulse Code Modulation) – імпульсно-кодова модуляція (ІКМ) –
стискання може досягатися тільки за рахунок вибору менших значень
величин H, B і C (фактично, це нестиснений звук); квантування відбувається
за рівномірною шкалою з 2B значень;
•
DPCM (Differential PCM) – диференційна ІКМ (ДІКМ) – вибірка
представляє різницю від попередньої, що вимагає менше B бітів; стискує у
декілька разів;
•
ADPCM (Adaptive DPCM) – адаптивна ДІКМ (АДІКМ) – те ж, що ДІКМ,
тільки квантування відбувається не за рівномірною шкалою, а з урахуванням
динаміки змін амплітуди; стискує в декілька разів;
•
MPEG (Motion Picture Experts Group) – стандарти Групи експертів в
області кіно; для стискування звукової інформації використовуються
стандарти MP2 та MP3; застосовується психоакустична компресія, при якій
видаляються звуки, що не сприймаються людським вухом; стискує у декілька
десятків разів при досить високій якості;
•
RealAudio – метод, розроблений фірмою RealNetworks, стискує в декілька
десятків разів, але з невисокою якістю; використовується в Інтернеті для
програвання звукових файлів у реальному часі.
Для цифрової телефонії використовуються, як правило, інші кодеки.
Спектральна (частотна) форма представлення сигналів використовує
розкладання сигнальних функцій на періодичні складові.
Періодичність гармонійних коливань досліджував ще в VI столітті до
нашої ери Піфагор і навіть розповсюдив його на опис гармонійного руху
небесних тел. Термін «spectrum» («спектр») уперше застосував І. Ньютон в
67
1571 році при описі розкладання сонячного світла, пропущеного крізь скляну
призму, на багатоколірну смугу. Він же дав і перше математичне трактування
періодичності хвилевих рухів. У 18-му столітті рішеннями хвилевих рівнянь
(у додатку до струн) займалися Даніїл Бернуллі та Леонард Ейлер. По суті,
вже Бернуллі та Ейлер показали, що довільні періодичні функції є сумами
простих гармонійних функцій – синусів і косинусів кратних частот. Ці суми
дістали назву рядів Фур'є, після того, як у 1807 році французький інженер
Жан
Батист
Фур'є
обґрунтував
метод
обчислення
коефіцієнтів
тригонометричного ряду, яким можна відображувати з абсолютною точністю
(при нескінченній кількості членів ряду) або апроксимувати із заданою
точністю (при обмеженій кількості членів ряду) будь-яку періодичну
функцію, визначену на інтервалі одного періоду T = b - a, і що задовольняє
умовам Дирехле (обмежена, кусково-безперервна, з кінцевою кількістю
розривів 1-го роду). А саме:
∞
y(x) =(a0/2) + ∑ (ak cos(2 πkf1x) + bk sin(2 πkf1x), f1 = 1/T.
k =1
ak = (2/T) ∫ y(x) cos(2πkf1x) dx,
b
a
bk = (2/T) ∫ y(x) sin(2πkf1x) dx.
b
a
На перших етапах свого розвитку цей напрям розкладання функцій, що
отримав назву гармонійного аналізу, мав більш теоретичний характер і
використовувався, в основному, у природних науках для виявлення і
вивчення періодичності і складу періодичних складових (у тому числі
прихованих) в різних явищах і процесах (активність сонця, девіація
магнітного поля Землі, метеорологічні спостереження, висота припливів у
гаванях
і
тому
подібне).
Положення
різко
змінилося
з
появою
електротехнічних і радіотехнічних галузей науки й техніки і розвитком
радіозв'язку, де гармонійний склад сигналів набув конкретного фізичного
сенсу, а математичний апарат спектрального перетворення функцій став
основним інструментом аналізу й синтезу сигналів і систем. Нині
спектральний
аналіз є також одним з основних методів обробки
експериментальних даних в багатьох галузях науки й техніки.
68
В якості базисних функцій розкладання сигналів, в загальному
випадку, приймаються комплексні експоненціальні функції exp(jft), від яких з
використанням формул Ейлера можна перейти до речових синус –
косинусних
функцій.
Термін
«частотна»
зобов'язаний
походженням
зворотній змінній f = 1/|t| тимчасового представлення сигналів і функцій.
Поняття частотного перетворення не слід зв'язувати лише з тимчасовими
аргументами, оскільки математичний апарат перетворення не залежить від
фізичного сенсу незалежних змінних. Так, наприклад, при змінній "х", як
одиниці довжини, значення f буде просторовою частотою з розмірністю 1/|х –
число періодичних змін сигналу на одиниці довжини.
У математичному апараті частотного аналізу зручно використовувати
кутову частоту
ω = 2πf.
Для процесів за іншими незалежними змінними у
технічній літературі замість індексу частоти f часто використовується індекс
v, а для кутової частоти індекс k = 2πv, який називають хвильовим числом.
РОЗКЛАДАННЯ СИГНАЛІВ ПО ГАРМОНІЙНИХ ФУНКЦІЯХ
Поняття власних функцій
Зручність використання частотного представлення сигналів полягає в
тому, що гармонійні функції є власними функціями операцій перенесення,
інтегрування, диференціювання й інших лінійних операцій, інваріантних за
координатами. Припустимо, що початкова функція є лінійною комбінацією
функцій синуса та косинуса:
𝑠(𝑥) = 𝐴 sin(𝑥) + 𝐵 cos(𝑥)
Здійснимо довільний зсув функцій за аргументом на величину h. При
цьому отримуємо:
𝑠(𝑥 + ℎ) = 𝐶 sin(𝑥) + 𝐷 cos(𝑥)
𝐶 = 𝐴 cos(ℎ) − 𝐵 sin(ℎ)
𝐷 = 𝐴 sin(ℎ) + 𝐵 cos(ℎ)
69
де коефіцієнти C і D, як і в початковому виразі коефіцієнти А і В, не
залежать від аргументу, при цьому C2+D2=А2+В2. Таким чином, при
довільному перенесенні функції за аргументом (а рівно і при інтеграції,
диференціюванні й інших лінійних перетвореннях) будь-яку лінійну
комбінацію синуса і косинуса можна представити лінійною комбінацією цих
самих функцій.
Експоненціальний комплексний запис гармонійних функцій робить цю
властивість ще наочніше. Для довільної гармонійної функції маємо:
cos(𝜔𝑡 − 𝜑) = 𝐴 cos(𝜔𝑡) + 𝐵 sin(𝜔𝑡)
де 𝐴 = cos(𝜑) , 𝐵 = sin(𝜑) , 𝜑 – початковий фазовий кут коливання при
t = 0. Переходячи до комплексного запису даної функції з використанням
тотожностей Ейлера
[exp(𝑗𝜔𝑡) + exp(−𝑗𝜔𝑡)]
2
[exp(𝑗𝜔𝑡) − exp(−𝑗𝜔𝑡)]
sin(𝜔𝑡) =
2𝑗
cos(𝜔𝑡) =
отримуємо: cos(𝜔𝑡 − 𝜑) = 𝐶 exp(𝑗𝜔𝑡) + 𝐶 ∗ exp(−𝑗𝜔𝑡)
де:
𝐶 = 0,5 exp(−𝑗𝜑) , 𝐶 ∗ = 0,5 exp(𝑗𝜑)
–
величина,
комплексно
зв'язана з С. Застосовуючи в якості гармонійної складової розкладання
сигналу функцію ехр(jωt), можна розглядати другу функцію ехр(–jωt),
комплексно зв'язану з першою, як таку ж складову, але з негативною
частотою. Природно, що негативна частота є чисто математичною
абстракцією, але треба пам'ятати, що пара таких комплексно зв'язаних
складових у сумі завжди дає речову функцію.
Експоненціальні функції також є власними функціями лінійних
операцій. Для операції перенесення з використанням експоненціальних
функцій:
де
exp[𝑗𝜔(𝑡 + ℎ)] = exp(𝑗𝜔ℎ) ∗ exp(𝑗𝜔𝑡) = 𝐻(𝜔) ∗ exp(𝑗𝜔𝑡)
𝐻(𝜔) = exp(𝑗𝜔ℎ) – власне значення операції перенесення,
незалежне від змінної.
70
Для операції диференціювання:
𝑑[exp(𝑗𝜔𝑡)]
= 𝑗𝜔 exp(𝑗𝜔𝑡), 𝐻(𝜔) = 𝑗𝜔
𝑑𝑡
Для операції інтегрування:
� exp(𝑗𝜔𝑡)𝑑𝑡 = �
1
� exp(𝑗𝜔𝑡) , 𝐻(𝜔) = 1/𝑗𝜔
𝑗𝜔
У загальній формі, для будь-яких лінійних операцій перетворення:
𝑇[exp(𝑗𝜔𝑡)] = 𝐻(𝜔) exp(𝑗𝜔𝑡),
де T[.] – довільний лінійний оператор, 𝐻(𝜔) – власне значення
операції, незалежне від аргументу.
У
фахівців-практиків
комплексних
функцій
з
існує
їх
упередження
уявними
проти
частотами.
використання
Тому
надалі
використовуватимемо і речові функції, і їх комплексні аналоги, принаймні,
до тих пір, поки простота й зручність використання останніх не стане
очевидним.
Ряди Фур'є
Розкладанню в ряди Фур'є піддаються періодичні сигнали. Періодичну
функцію будь-якої форми, задану на інтервалі одного періоду
Т = b - a ту,
що задовольняє на цьому інтервалі умовам Дирехле (обмежена, кусковобезперервна, з кінцевим числом розривів 1-го роду), можна представити у
вигляді ряду Фур’є:
∞
𝑠(𝑡) = � 𝑆𝑛 exp(𝑗𝑛∆𝜔𝑡), 𝑆𝑛 = 𝑆(𝑛∆𝜔), ∆𝜔 =
𝑛=−∞
2𝜋
𝑇
де вагові коефіцієнти 𝑆𝑛 ряду визначаються за формулою:
1 𝑏
𝑆𝑛 = � � � 𝑠(𝑡) exp(−𝑗𝑛∆𝜔𝑡) 𝑑𝑡
𝑇 𝑎
(1)
(2)
Ряд Фур'є є ансамблем комплексних експонент exp(jn∆ωt) з частотами,
що утворюють арифметичну прогресію. Функцію вагових коефіцієнтів
S(n∆ω) прийнято називати комплексним спектром періодичного сигналу або
71
фур’е-образом функції s(t). Спектр періодичного сигналу є дискретною
функцією, оскільки він визначений тільки для цілих значень n з кроком за
частотою, зворотним до періоду: ∆ω = 2π/Т (чи ∆f = 1/T). Першу частотну
складову спектру при n = 1, рівну ω1 = 1⋅∆ω = 2π/T (чи f1 = 1/T), називають
основною частотою сигналу (першою гармонікою), інші частоти дискретного
спектру nω1 при n>1 називають гармоніками сигналу. Значення S(n∆ω) по
позитивних і негативних значеннях n є комплексно зв'язаними.
З чисто математичних позицій множина функцій exp(jn∆ωt) утворює
нескінченновимірний базис лінійного простору L2[a, b] ортогональних синускосинусных функцій, а коефіцієнти Sn по (2) є проекціями сигналу s(t) на ці
базисні функції. Відповідно, сигнал s(t) у формі ряду Фур'є (1) - це
нескінченновимірний вектор у просторі L2[a, b].
Підінтегральну функцію експоненти у виразі (2) з використанням
тотожності Ейлера exp(-jωt)=cos(ωt) - j⋅sin(ωt) можна розкласти на косинусну
і синусну складові і виразити комплексний спектр у вигляді дійсної і уявної
частин:
Sn = (1/T) ∫ s(t) [cos(n∆ωt) - j sin(n∆ωt)] dt = Аn - jBn.
b
a
An ≡ A(n∆ω) = (1/T) ∫ s(t) cos(n∆ωt) dt,
b
a
Bn ≡ B(n∆ω) = (1/T)
∫
b
a
s(t) sin(n∆ωt) dt.
(3)
(4)
(5)
На мал. 4.1.1 наведений приклад періодичного сигналу (прямокутний
імпульс на інтервалі (1-3.3), що повторюється з періодом Т=40) і форма
дійсної і уявної частини його спектру. Звернемо увагу, що дійсна частина
спектру є парною відносно нуля функцією A(n∆ω) = A(- n∆ω), оскільки при
обчисленні значень A(n∆ω) за формулою (4) використовується парна
косинусна функція cos(n∆ωt) = cos(-n∆ωt). Уявна частина спектру є непарною
функцією B(n∆ω) = -B(-n∆ω), оскільки для її обчислення по (5)
використовується непарна синусна функція sin(n∆ωt) = - sin(-n∆ωt).
72
мал. 18 Сигнал та його комплексний спектр.
Комплексні числа дискретної функції (3) можуть бути представлені у
вигляді модулів й аргументів комплексної експоненти, що дає наступну
форму запису комплексного спектру:
Sn = Rn exp(jϕn), (4.1.3')
Rn ≡ R2(n∆ω) = A2(n∆ω)+B2(n∆ω),
ϕn ≡ ϕ(n∆ω) = arctg(-B(n∆ω)/A(n∆ω)).
2
мал. 19 Модуль та аргумент спектру.
Модуль спектру R(n∆ω) називають двостороннім спектром амплітуд, а
аргумент спектру (послідовність фазових кутів ϕ(n∆ω)) - двостороннім
спектром фаз. Спектр амплітуд завжди є парною функцією: R(n∆ω) = R(n∆ω), а спектр фаз непарну: ϕ(n∆ω) = -ϕ(- n∆ω). Приклад спектру в
амплітудному та фазовому представленні для сигналу, показаного на мал. 18,
приведений на мал. 19. При розгляді спектру фаз слід враховувати
періодичність 2π кутової частоти (при зменшенні фазового значення до
величини менше -π відбувається скидання значення - 2π).
73
мал. 20 Ортогональність функцій
Якщо функція s(t) є парною, то усі значення B(n∆ω) по (5) дорівнюють
нулю, оскільки парні функції ортогональні синусним гармонікам і
підінтегральний добуток s(t) - sin(n∆ωt) дає нульовий інтеграл. Отже, спектр
функції буде представлений тільки речовими коефіцієнтами. Навпаки, при
непарності функції s(t) обнуляються усі значення коефіцієнтів А(непарні
функції ортогональним косинусним гармонікам) і спектр є чисто уявним. Цей
чинник не залежить від вибору меж завдання періоду функції на числовій осі.
На мал. 20(А) можна наочно бачити ортогональність першої гармоніки
синуса та парної функції, а на мал. 20(В) відповідно косинуса і непарної
функції в межах одного періоду. Враховуючи кратність частот наступних
гармонік першій гармоніці спектру, ортогональність зберігається для усіх
гармонік ряду Фур’є.
При n = 0 маємо Во = 0, і отримуємо постійну складову сигналу:
S0 ≡ Ao ≡ Ro ≡ (1/T)
∫
b
a
s(t) dt.
Тригонометрична форма ряду Фур’є.
Об’єднуючи у (1) комплексно об’єднані складові (члени ряду,
симетричні відносно центрального ряду S0), можна перейти до ряду Фур’є у
тригонометричній формі:
∞
s(t) = Ао+2 ∑ (An cos(n∆ωt) + Bn sin(n∆ωt)),
n= 1
(6)
∞
s(t) = Ао+2 ∑ Rn cos(n∆ωt + ϕn).
n= 1
(6')
Значення An, Bn обчислюються за формулами (4-5), значення Rn та ϕn за формулами (3').
74
Рядом (6) є розкладання періодичного сигналу s(t) на суму речових
елементарних гармонійних функцій (косинусних і синусних) з ваговими
коефіцієнтами, подвоєні значення яких (тобто значення 2⋅An, 2⋅Bn) не що
інше, як амплітуди відповідних гармонійних коливань з частотами n∆ω.
Сукупність амплітудних значень цих гармонік утворює односторонній
фізично реальний (тільки для позитивних частот n∆ω) спектр сигналу. Для
сигналу на мал. 18, наприклад, він повністю повторює праву половину
приведених на малюнку спектрів з подвоєними значеннями амплітуд (за
винятком значення Ао на нульовій частоті, яке, як це витікає з (6), не
подвоюється). Але таке графічне відображення спектрів використовується
досить рідко (за винятком чисто технічних додатків).
Ширше застосування для відображення фізично реальних спектрів
знаходить формула (6'). Спектр амплітуд косинусних гармонік при такому
відображенні називається амплітудно-частотним складом сигналу, а спектр
фазових кутів гармонік - фазовою характеристикою сигналу. Форма спектрів
повторює праву половину відповідних двосторонніх спектрів (див. мал. 19)
також з подвоєними значеннями амплітуд. Для парних сигналів відліки
фазового спектру можуть набувати тільки значень 0 або π, для непарних
відповідно ±π/2.
мал. 21 Розкладення сигналу в комплексний ряд Фур’є
75
Ряди Фур'є довільних аналогових періодичних сигналів можуть містити
нескінченно велику кількість членів. Проте однією з важливих переваг
перетворення Фур'є є те, що при обмеженні (усіченні) ряду Фур'є до будьякого кінцевого числа його членів забезпечується найкраще за середньою
квадратичною погрішністю наближення до початкової функції (для цієї
кількості членів).
На мал. 21 показане розкладення у комплексний ряд Фур'є модельного
сигналу, виконане в середовищі Mathcad. Модель сигналу задана з трьома
розривами першого роду (скачками). Будь-який стрибок функції містить усі
частоти діапазону до незкінечності, у зв'язку з чим ряд Фур'є також
нескінченний і дуже повільно затухає. На малюнку приведені значення
тільки перших 100 членів ряду, при цьому графік спектру сигналу, як це
зазвичай прийнято на практиці, побудований у вигляді тієї, що огинає
значень модулів коефіцієнтів ряду Sn і тільки по області позитивних значень
n.
Програма на мал. 22 продовжує програму мал. 21 і показує
реконструкцію сигналу по його спектру при обмеженні числа членів ряду
Фур'є. На верхньому графіку малюнка приведений реконструйований сигнал
при N = 8 (гармоніки першого піку спектру, центр якого відповідає головній
гармоніці сигналу і членові ряду n = ωs/∆ω), N = 16 (гармоніки двох перших
піків) і N=40 (п'ять перших піків спектру). Природно, що чим більше членів
ряду включено в реконструкцію, тим ближче реконструйований сигнал до
форми початкового сигналу.
76
мал. 22. Реконструкція сигналу (продовження програми на мал.. 21)
Принцип послідовного наближення до початкової форми наочно видно
на нижньому графіку малюнка. На ньому ж можна бачити і причини появи
пульсацій на реконструкції стрибків функцій, які носять назву ефекту
Гіббса. При зміні кількості підсумовуваних членів ряду ефект Гіббса не
зникає. Не змінюється також відносна амплітуда пульсацій (по відношенню
до амплітуди стрибка) і відносне загасання (по коефіцієнту послідовного
зменшення амплітуди пульсацій по відношенню до максимального викиду),
змінюється тільки частота пульсацій, яка визначається частотою останніх
підсумовуваних гармонік.
77
ВИКОРИСТАННЯ ДИСКРЕТНОГО ПЕРЕТВОРЕННЯ ФУР’Є(ДПФ)
Дискретна тимчасова область. Дискретна частотна область. Дискретне
перетворення Фур’є (ДПФ). Зворотне ДПФ.
• Цифровий спектральний аналіз
o Аналізатори спектру
o Обробка мови
o Обробка зображень
o Розпізнавання образів
• Проектування фільтрів
o Обчислення імпульсної характеристики за частотною
o Обчислення частотної характеристики за імпульсною
Швидке перетворення Фур'є (БПФ) - це простий алгоритм для
ефективного обчислення дискретного перетворення Фур'є (ДПФ)
мал. 23 Сімейство перетворень Фур’є як функція сигналу в тимчасовій області
78
Дискретне перетворення Фур'є (ДПФ), яке оперує дискретною за часом
вибіркою періодичного сигналу в тимчасовій області. Для того, щоб бути
представленим у вигляді суми синусоїд, сигнал має бути періодичним. Але в
якості набору вхідних даних для ДПФ доступне тільки кінцеве число відліків
(N). Цю дилему можна розв’язати, якщо подумки помістити нескінченне
число однакових груп відліків до і після групи, що обробляється, утворюючи,
таким чином, математичну (але не реальну) періодичність.
Фундаментальне рівняння для отримання N -точкового ДПФ виглядає
таким чином:
По відношенню до цього рівняння слід зробити деякі термінологічні
роз'яснення. X(k) (прописна буква X) є частотним виходом ДПФ у k-ій точці
спектру, де k знаходиться у діапазоні від 0 до N-1. N є числом відліків при
обчисленні ДПФ.
Значення x(n) (рядкова буква x) представляє собою n-й відлік у
тимчасовій області, де n також знаходиться у діапазоні від 0 до N-1. У
загальному
рівнянні
x(n)
може
бути
речовим
або
комплексним.
Зверніть увагу, що косинусоїдальні і синусоїдальні компоненти у рівнянні
можуть бути виражені у полярних або прямокутних координатах, зв'язок між
якими визначається за формулою Ейлера:
e jθ = cos θ + j sin θ
Вихідний спектр ДПФ X(k) є результатом обчислення згортки між
вибіркою, що складається з вхідних відліків в тимчасовій області, і набором з
N пар гармонійних базисних функцій (косинус і синус). Концепцію добре
ілюструє мал. 24, на якому представлена речова частина перших чотирьох
точок спектру (показані тільки косинусоїдальні гармонійні базисні функції).
Подібна процедура використовується для обчислення уявної частини спектру
на основі синусоїдальних функцій.
79
Перша точка X(0) є простою сумою вхідних відліків у тимчасовій
області, тому що cos(0) = 1. Коефіцієнт масштабування 1/N не враховується,
але має бути присутнім у кінцевому результаті. Зверніть увагу, що X(0) - це
середнє значення відліків у тимчасовій області, або просто зміщення по
постійному струму. Друга точка ReX(1) отримана множенням кожного
відліку з тимчасової області на відповідне значення косинусоїди, що має
один повний період на інтервалі N, з наступним підсумовуванням
результатів. Третя точка ReX(2) отримана множенням кожного відліку з
тимчасової області на відповідну точку косинусоїди, яка має два повні
періоди на інтервалі N, з наступним підсумовуванням результатів. Так само,
четверта точка ReX(3) отримана множенням кожного відліку з тимчасової
області на відповідну точку косинусоїди з трьома повними періодами на
інтервалі N і підсумовуванням результатів. Цей процес триває, доки не
будуть обчислені усі N вихідних відліків. Подібна процедура, але з
використанням синусоїд, застосовується для обчислення уявної частини
частотного спектру. Косинусоїди та синусоїди є базисними функціями
даного перетворення.
мал. 24 Згортка відліків у тимчасовій області з базисними функціями при БПФ для N=8
80
Припустимо, що вхідний сигнал є косинусоїдальним, таким, що має
період N, тобто він містить один повний період у нашій вибірці. Також
приймемо його амплітуду та фазу ідентичними першій косинусоїдальній
базисній функції cos(2πn/8). Вихідний спектр містить одну ненульову точку
ReX(1), а усі інші точки ReX(k) є нульовими. Припустимо, що тепер вхідна
косинусоїда зрушена управо на 90. Значення згортки між нею і відповідною
базисною косинусоїдальною функцією дорівнює нулю. Але алгоритм
перетворення припускає обчислення згортки з базисною функцією sin(2πn/8),
необхідне для отримання ImX(1). Це показує, чому необхідно обчислювати і
речові, і уявні частини спектру для визначення і амплітуди і фази частотного
спектру.
Зверніть увагу, що згортка синусоїдальної/косинусоїдальної функції
будь-якої частоти, відмінної від частоти базової функції, дає нульове
значення і для ReX(1), і для ImX(1).
Подібна процедура застосовується при обчисленні зворотного ДПФ для
відновлення відліків у тимчасовій області x(n) з відліків у частотній області
X(k). Відповідне рівняння виглядає таким чином:
Існують два основні типи ДПФ: речове ДПФ та комплексне ДПФ.
Комплексне ДПФ, де і вхідні, і вихідні величини є комплексними числами.
Оскільки вхідні відліки в тимчасовій області є речовими і не мають уявної
частини, уявна частина вхідних відліків завжди приймається рівною нулю.
Вихід ДПФ X(k) містить речову й уявну компоненти, які можуть бути
перетворені на амплітуду та фазу.
Речове ДПФ виглядає дещо простіше і, в основному, є спрощенням
комплексного
ДПФ.
перетворення
Фур'є
Більшість
(ШПФ)
алгоритмів
складена
з
обчислення
швидкого
використанням
формату
комплексного ДПФ, тому важливо розуміти, як працює комплексне ДПФ і як
воно співвідноситься з речовим ДПФ. Зокрема, якщо відомі вихідні частоти
81
речового ДПФ і вимагається використовувати зворотне комплексне ДПФ для
обчислення відліків у тимчасовій області, потрібно знати, як розмістити
вихідні точки речового ДПФ у форматі комплексного ДПФ перед
виконанням зворотного комплексного ДПФ.
Швидке перетворення Фур’є
Алгоритми БПФ засновані на тому, що при зменшенні довжини
послідовності час рішення задачі також зменшується, але не пропорційно, а
набагато більше.
Нехай сигнал x(n) має N відліків, причеому N=2m.
Розіб’ємо сигнал на дві послідовності:
x1(n ) = x (2n )
N
, где n = 0,1,2,..., − 1

2
x 2 (n ) = x (2n + 1)
Тоді спектри цих послідовностей будуть визначені як:
X1 (k ) =
N
−1
2
2
∑ x1(n )W − 2nk
N n =0
N
−1
2
2π
j
2
− ( 2 n +1) k
N
(
)
,
где
X 2 (k ) =
x
n
W
=
W
e
∑ 2
N n =0
Тоді загальний спектр виглядатиме як:
X(k ) =
N
−1
2
[
2
∑ x1(n )W − 2nk + x 2 (n )W −(2n +1)k
N n =0
]
Результуючий вираз можна записати як:
X(k ) = X1(k ) + W − k X 2 (k )
Цей алгоритм називається БПФ з проріджуванням за часом.
Число відліків у цьому алгоритмі не даремно вибране як ступінь числа 2. Це
дозволяє розбивати послідовність до двоточкового перетворення Фур'є:
82
мал. 25 Обчислення 8-точкового БПФ у трьох каскадах з використанням проріджування за
часом
Приклад обчислення БПФ для 8 відліків
Дискретне перетворення Фур’є:
Формула Ейлера:
e jθ = cos θ + j sin θ
Зворотне ДПФ:
n = 2m
x1(n ) = x (2n )
N
,
где
n
=
0
,
1
,
2
,...,
−1

(
)
(
)
x
n
=
x
2
n
+
1
2
 2
X1 (k ) =
N
−1
2
2
∑ x1(n )W − 2nk
N n =0
83
N
−1
2
2π
j
2
− ( 2 n +1) k
, где W = e N
X 2 (k ) =
∑ x 2 (n )W
N n =0
X(k ) =
N
−1
2
[
2
∑ x1(n )W − 2nk + x 2 (n )W −(2n +1)k
N n =0
X(k ) = X1(k ) + W − k X 2 (k )
]
Download