# Сжатие файлов вейвлетами
Файл `messageText.txt` содержит сгенерированные текст `Lorem ipsum dolor sit amet...`, который более-менее похож на реальный текст.
При его размере в 0.5Мб все вариации в режиме: прочитать файл, закодировать, раскодировать; отработали за разумное время (с учётом того, что при запуске выполнялись не только эти действия, а ещё сбор неокотрой статистики).
Однако даже на содержимом, которое очень похоже на текст, ошибка декодирования получилась в лучшем случае **~60%**
<pre>
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| File | Factor | Stub (adapted) | Normalize | Wavelet | Errors | Bytes | Err, % | Runtime, ms |
+==================+========+====================+===========+===================+===========+===========+========+=============+
| messageText.txt | 1.00 | 0.000000 (false) | true | BiOrthogonal 1/1 | 260117 | 437050 | 59.52 | 197 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| messageText.txt | 1.00 | 0.061133 ( true) | true | BiOrthogonal 1/1 | 260117 | 437050 | 59.52 | 246 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| messageText.txt | 1.00 | 0.000000 (false) | true | Haar | 260117 | 437050 | 59.52 | 465 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| messageText.txt | 1.00 | 0.999543 ( true) | true | Haar | 260117 | 437050 | 59.52 | 616 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| messageText.txt | 1.00 | 0.000000 (false) | true | Haar | 260117 | 437050 | 59.52 | 627 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| messageText.txt | 1.00 | 0.000000 (false) | false | BiOrthogonal 1/1 | 260716 | 437050 | 59.65 | 307 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| messageText.txt | 1.00 | 59.484221 ( true) | false | BiOrthogonal 1/1 | 260716 | 437050 | 59.65 | 420 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| messageText.txt | 1.00 | 72.206343 ( true) | false | Haar | 260716 | 437050 | 59.65 | 555 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| messageText.txt | 1.00 | 0.000000 (false) | false | Haar | 260716 | 437050 | 59.65 | 615 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| messageText.txt | 1.00 | 9.491311 ( true) | false | Haar | 260716 | 437050 | 59.65 | 668 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| messageText.txt | 1.00 | 0.000000 (false) | false | Haar | 260716 | 437050 | 59.65 | 693 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| messageText.txt | 1.00 | 82.344180 ( true) | false | Haar | 260716 | 437050 | 59.65 | 768 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| messageText.txt | 1.00 | 0.000000 (false) | true | BiOrthogonal 1/3 | 261438 | 437050 | 59.82 | 238 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| messageText.txt | 1.00 | 0.517610 ( true) | true | BiOrthogonal 1/3 | 261438 | 437050 | 59.82 | 288 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| messageText.txt | 1.00 | 0.000000 (false) | true | BiOrthogonal 3/1 | 261443 | 437050 | 59.82 | 185 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
</pre>
Вейвлеты хорошо работают для сжатия изображения, потому что "в целом" для изображения верно, что соседние пиксели слабо отличаются, например, по значению в канале яркости, из-за чего разница значений в этих каналах будет незначительной и ей можно будет просто пренебречь.
Как и в изображении, каждый символ текста кодируется байтом, значение которого лежит в отрезке $[-128, 127]$, поэтому эти значения надо нормировать на отрезок $[0, 1]$, иначе разница соседних значений будет "слабо-ограниченной" (на самом деле, запускались тесты в том числе и с ненормированными данными (параметр `Normalize = false`), но как видно из таблицы они находятся в основном ниже, чем тесты с нормированными данными).
Для того, чтобы содержимое можно было сжать в 2 раза, значения, получающиеся в правой части в результате вейвлет-разложения стоит считать равными, чтобы их можно было не хранить в сжатом виде вообще. За это отвечает параметр `Stub`, который заменяет все знчаения в правой части вейвлет-преобразования на соответствующее значение. Это значение может быть подставлено в 2х режимах: константа (я выбрал 0) и адаптивный подбор. В адаптивном подборе пробовалось считать средние, минимальные/максимальные, медианные, ..., но на практике разница не была заметна совсем (в плане количества ошибок).
Дополнительно, было ещё построено распределение значений правой части вейвлет-преобразования для нормированных данных из самого успешного (по количеству ошибок) тесту. Распределение масштабировано в 2х вариантах с точностью: до десятых, до сотых. Из графиков ниже видно, что распределение ни эскспоненциалное (а хотелось бы), ни даже нормальное (потому что есть всплески на "больших" раницах).
<pre>
+------------+----------------------------------------------------------------------------------+
| Difference | Distribution |
+------------+----------------------------------------------------------------------------------+
| 0.00 | ████████████████████████████████████████████████████████████████████████ |
| 0.10 | ████████████████████████████████████████████████████████████████████████████████ |
| 0.20 | ███████████████████ |
| 0.30 | ███████████████████████████ |
| 0.40 | █████████████████████████████ |
| 0.50 | █████████████████████████████ |
| 0.60 | ████ |
| 0.70 | █ |
+------------+----------------------------------------------------------------------------------+
</pre>
<pre>
+------------+----------------------------------------------------------------------------------+
| Difference | Distribution |
+------------+----------------------------------------------------------------------------------+
| 0.00 | █████████████████████ |
| 0.01 | ████████████████████████████████████████████████████████████████████████████████ |
| 0.02 | ██████████████████████████████████████████████████████████ |
| 0.03 | ████████████████████████████████████████████████████████ |
| 0.04 | ████████████████████████████████████████████████████████ |
| 0.05 | ████████████████████████████████████████ |
| 0.06 | ███████████████████████████████████████████████████████ |
| 0.07 | ████████████████████████████████████████ |
| 0.08 | █████████████████████████████████████████████████████ |
| 0.09 | █████████████████████████████████ |
| 0.10 | █████████████████████████████████ |
| 0.11 | █████████████████████ |
| 0.12 | ████████████████████████████ |
| 0.13 | ███████████████ |
| 0.14 | █████ |
| 0.15 | ███████ |
| 0.16 | ██████ |
| 0.17 | █████ |
| 0.18 | ██████ |
| 0.19 | ██████ |
| 0.20 | ███████ |
| 0.21 | ████████ |
| 0.22 | ███████████ |
| 0.23 | █████████ |
| 0.24 | ████████ |
| 0.25 | ███████████ |
| 0.26 | ██████████ |
| 0.27 | ████████ |
| 0.28 | ███████████ |
| 0.29 | █████████ |
| 0.30 | ████████████ |
| 0.31 | ███████████ |
| 0.32 | █████████ |
| 0.33 | ███████████ |
| 0.34 | ██████████ |
| 0.35 | ████████████ |
| 0.36 | ████████ |
| 0.37 | ███████ |
| 0.38 | ███████ |
| 0.39 | ██████ |
| 0.40 | ████████ |
| 0.41 | ████ |
| 0.42 | █████████████████████ |
| 0.43 | ██████████ |
| 0.44 | ██████████████████████████████ |
| 0.45 | ████████ |
| 0.46 | ███████ |
| 0.47 | ████████ |
| 0.48 | ███ |
| 0.49 | █████████████████████ |
| 0.50 | ████████████ |
| 0.51 | █████████ |
| 0.52 | ███ |
| 0.53 | ████████████████████████████ |
| 0.54 | █████████████████ |
| 0.55 | ████████████ |
| 0.56 | █ |
| 0.57 | █ |
| 0.58 | █ |
| 0.59 | █ |
| 0.60 | █ |
| 0.61 | █ |
| 0.62 | █ |
| 0.63 | █ |
| 0.64 | █ |
| 0.65 | ██ |
| 0.66 | █ |
| 0.67 | █ |
| 0.68 | █ |
| 0.69 | |
| 0.70 | █ |
| 0.71 | |
+------------+----------------------------------------------------------------------------------+
</pre>
Дальше хуже...
Так же тесты запускались для файлов примерно со случайными данными, которые слабо похожи на текст. Результаты этих тестов представлены ниже
Для файла размером 1Мб:
<pre>
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| File | Factor | Stub (adapted) | Normalize | Wavelet | Errors | Bytes | Err, % | Runtime, ms |
+==================+========+====================+===========+===================+===========+===========+========+=============+
| message.txt | 1.00 | 0.000000 (false) | true | Haar | 1041903 | 1250001 | 83.35 | 517 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| message.txt | 1.00 | 0.000000 (false) | true | Haar | 1041903 | 1250001 | 83.35 | 650 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| message.txt | 1.00 | 0.000000 (false) | true | BiOrthogonal 1/1 | 1041903 | 1250001 | 83.35 | 664 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| message.txt | 1.00 | 0.474115 ( true) | true | BiOrthogonal 1/1 | 1041903 | 1250001 | 83.35 | 720 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| message.txt | 1.00 | 0.572578 ( true) | true | Haar | 1041903 | 1250001 | 83.35 | 999 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| message.txt | 1.00 | 0.000000 (false) | false | Haar | 1044024 | 1250001 | 83.52 | 565 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| message.txt | 1.00 | 189.346219 ( true) | false | Haar | 1044024 | 1250001 | 83.52 | 568 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| message.txt | 1.00 | 0.000000 (false) | false | BiOrthogonal 1/1 | 1044024 | 1250001 | 83.52 | 675 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| message.txt | 1.00 | 26.747067 ( true) | false | BiOrthogonal 1/1 | 1044024 | 1250001 | 83.52 | 718 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| message.txt | 1.00 | 196.274310 ( true) | false | Haar | 1044024 | 1250001 | 83.52 | 740 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| message.txt | 1.00 | 0.000000 (false) | false | Haar | 1044024 | 1250001 | 83.52 | 830 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| message.txt | 1.00 | 211.025841 ( true) | false | Haar | 1044024 | 1250001 | 83.52 | 875 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| message.txt | 1.00 | 0.117202 ( true) | true | BiOrthogonal 1/3 | 1046057 | 1250001 | 83.68 | 676 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| message.txt | 1.00 | 0.000000 (false) | true | BiOrthogonal 1/3 | 1046057 | 1250001 | 83.68 | 910 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| message.txt | 1.00 | 0.005474 ( true) | true | BiOrthogonal 3/1 | 1046148 | 1250001 | 83.69 | 730 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
</pre>
<pre>
+------------+----------------------------------------------------------------------------------+
| Difference | Distribution |
+------------+----------------------------------------------------------------------------------+
| 0.00 | ███████████████████████████████████████████ |
| 0.10 | ██████████████████████████████████████████████████████████████████████████████ |
| 0.20 | ████████████████████████████████████████████████████████████████████████████████ |
| 0.30 | ████████████████████████████ |
| 0.40 | █ |
| 0.50 | █ |
+------------+----------------------------------------------------------------------------------+
+------------+----------------------------------------------------------------------------------+
| Difference | Distribution |
+------------+----------------------------------------------------------------------------------+
| 0.00 | ███████████████████████████████ |
| 0.01 | ███████████████████████████████████████████████████████████████████████ |
| 0.02 | █████████████████████████████████████████████████████████████████████ |
| 0.03 | █████████████████████████████████████████████████████ |
| 0.04 | █████████████████████████████████████████████████████████████ |
| 0.05 | █████████████████████████████████████████████████ |
| 0.06 | ███████████████████████████████████████████████████████ |
| 0.07 | ███████████████████████████████████████████████████ |
| 0.08 | ██████████████████████████████████████ |
| 0.09 | ██████████████████████████████████████████████ |
| 0.10 | ████████████████████████████████████████████ |
| 0.11 | ███████████████████████████████████████████████████████████████ |
| 0.12 | ██████████████████████████████████████████████████████████████████████████ |
| 0.13 | ███████████████████████████████████████████████████████████████ |
| 0.14 | ████████████████████████████████████████████████████████████████████████████████ |
| 0.15 | ████████████████████████████████████████████████████████████ |
| 0.16 | ████████████████████████████████████████████████████████████████████████ |
| 0.17 | ████████████████████████████████████████████████████████████████████ |
| 0.18 | ██████████████████████████████████████████████████ |
| 0.19 | ██████████████████████████████████████████████████████████████ |
| 0.20 | ███████████████████████████████████████████████ |
| 0.21 | ████████████████████████████████████████████████████████████ |
| 0.22 | ████████████████████████████████████████████████████████████████ |
| 0.23 | ████████████████████████████████████████████████ |
| 0.24 | ████████████████████████████████████████████████████████████████ |
| 0.25 | ████████████████████████████████████████████████ |
| 0.26 | █████████████████████████████████████████████████████████████ |
| 0.27 | ██████████████████████████████████████████████████████ |
| 0.28 | ███████████████████████████████ |
| 0.29 | ████████████████████████████ |
| 0.30 | ███████████ |
| 0.31 | ███ |
| 0.32 | |
| 0.33 | |
| 0.34 | |
| 0.35 | |
| 0.36 | █ |
| 0.37 | █ |
| 0.38 | █ |
| 0.39 | █ |
| 0.40 | █ |
| 0.41 | █ |
| 0.42 | █ |
| 0.43 | █ |
| 0.44 | █ |
| 0.45 | █ |
| 0.46 | █ |
| 0.47 | █ |
| 0.48 | █ |
| 0.49 | █ |
| 0.50 | █ |
| 0.51 | █ |
| 0.52 | █ |
| 0.53 | █ |
| 0.54 | |
+------------+----------------------------------------------------------------------------------+
</pre>
Для файла размером 5Мб:
<pre>
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| File | Factor | Stub (adapted) | Normalize | Wavelet | Errors | Bytes | Err, % | Runtime, ms |
+==================+========+====================+===========+===================+===========+===========+========+=============+
| message5.txt | 1.00 | 0.000000 (false) | true | BiOrthogonal 1/1 | 4167117 | 5100500 | 81.70 | 2766 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| message5.txt | 1.00 | 0.971433 ( true) | true | BiOrthogonal 1/1 | 4167117 | 5100500 | 81.70 | 2983 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| message5.txt | 1.00 | 0.000000 (false) | true | Haar | 4167117 | 5100500 | 81.70 | 3610 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| message5.txt | 1.00 | 0.037613 ( true) | true | Haar | 4167117 | 5100500 | 81.70 | 3768 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| message5.txt | 1.00 | 0.000000 (false) | true | Haar | 4167117 | 5100500 | 81.70 | 4512 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| message5.txt | 1.00 | 0.000000 (false) | false | BiOrthogonal 1/1 | 4176265 | 5100500 | 81.88 | 2636 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| message5.txt | 1.00 | 207.595389 ( true) | false | BiOrthogonal 1/1 | 4176265 | 5100500 | 81.88 | 2933 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| message5.txt | 1.00 | 0.000000 (false) | false | Haar | 4176265 | 5100500 | 81.88 | 3572 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| message5.txt | 1.00 | 185.319220 ( true) | false | Haar | 4176265 | 5100500 | 81.88 | 3618 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| message5.txt | 1.00 | 0.000000 (false) | false | Haar | 4176265 | 5100500 | 81.88 | 3808 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| message5.txt | 1.00 | 248.244199 ( true) | false | Haar | 4176265 | 5100500 | 81.88 | 3969 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| message5.txt | 1.00 | 0.275206 ( true) | false | Haar | 4176265 | 5100500 | 81.88 | 4480 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| message5.txt | 1.00 | 0.313541 ( true) | true | BiOrthogonal 1/3 | 4183663 | 5100500 | 82.02 | 4014 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| message5.txt | 1.00 | 0.000000 (false) | true | BiOrthogonal 1/3 | 4183663 | 5100500 | 82.02 | 4162 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
| message5.txt | 1.00 | 0.000000 (false) | true | BiOrthogonal 3/1 | 4183924 | 5100500 | 82.03 | 3590 |
+------------------+--------+--------------------+-----------+-------------------+-----------+-----------+--------+-------------+
</pre>
<pre>
+------------+----------------------------------------------------------------------------------+
| Difference | Distribution |
+------------+----------------------------------------------------------------------------------+
| 0.00 | ████████████████████████████████████████████ |
| 0.10 | ███████████████████████████████████████████████████████████████████████████████ |
| 0.20 | ████████████████████████████████████████████████████████████████████████████████ |
| 0.30 | ████████████████████████████ |
| 0.40 | █ |
| 0.50 | █ |
+------------+----------------------------------------------------------------------------------+
+------------+----------------------------------------------------------------------------------+
| Difference | Distribution |
+------------+----------------------------------------------------------------------------------+
| 0.00 | ███████████████████████████████ |
| 0.01 | ████████████████████████████████████████████████████████████████████████ |
| 0.02 | ██████████████████████████████████████████████████████████████████████ |
| 0.03 | ██████████████████████████████████████████████████████ |
| 0.04 | ██████████████████████████████████████████████████████████████ |
| 0.05 | ██████████████████████████████████████████████████ |
| 0.06 | ███████████████████████████████████████████████████████ |
| 0.07 | ████████████████████████████████████████████████████ |
| 0.08 | ████████████████████████████████████████ |
| 0.09 | ███████████████████████████████████████████████ |
| 0.10 | ████████████████████████████████████████████ |
| 0.11 | ███████████████████████████████████████████████████████████████ |
| 0.12 | ██████████████████████████████████████████████████████████████████████████ |
| 0.13 | ███████████████████████████████████████████████████████████████ |
| 0.14 | ████████████████████████████████████████████████████████████████████████████████ |
| 0.15 | █████████████████████████████████████████████████████████████ |
| 0.16 | ████████████████████████████████████████████████████████████████████████ |
| 0.17 | ████████████████████████████████████████████████████████████████████ |
| 0.18 | █████████████████████████████████████████████████ |
| 0.19 | ██████████████████████████████████████████████████████████████ |
| 0.20 | ███████████████████████████████████████████████ |
| 0.21 | ████████████████████████████████████████████████████████████ |
| 0.22 | ███████████████████████████████████████████████████████████████ |
| 0.23 | ████████████████████████████████████████████████ |
| 0.24 | ███████████████████████████████████████████████████████████████ |
| 0.25 | ███████████████████████████████████████████████ |
| 0.26 | █████████████████████████████████████████████████████████████ |
| 0.27 | █████████████████████████████████████████████████████ |
| 0.28 | ███████████████████████████████ |
| 0.29 | ████████████████████████████ |
| 0.30 | ███████████ |
| 0.31 | ███ |
| 0.32 | |
| 0.33 | |
| 0.34 | |
| 0.35 | |
| 0.36 | █ |
| 0.37 | █ |
| 0.38 | █ |
| 0.39 | █ |
| 0.40 | █ |
| 0.41 | █ |
| 0.42 | █ |
| 0.43 | █ |
| 0.44 | █ |
| 0.45 | █ |
| 0.46 | █ |
| 0.47 | █ |
| 0.48 | █ |
| 0.49 | █ |
| 0.50 | █ |
| 0.51 | █ |
| 0.52 | █ |
| 0.53 | █ |
| 0.54 | |
+------------+----------------------------------------------------------------------------------+
</pre>