Английское название метода - Linear Prediction Coding (LPC).
Цель - сжатие потока Я-битовых элементов в предположении, что значение каждого из них является линейной комбинацией значений h предыдущих элементов. Где S/ - i-й Л-битовый элемент; Kj - некоторые коэффициенты, в общем случае непостоянные.
Основная идея состоит в том, чтобы в формируемый поток записывать ошибки предсказаний: разности между реальными S, и предсказанными значениями:
Размер данных в результате применения LPC не изменяется. Более того, размер элементов R может даже увеличиваться на единицу: /?'=Л+1 - за счет добавления бита для сохранения знака разности.
Чем точнее предсказание, тем больше в преобразованной последовательности элементов с близкими к нулю значениями, тем лучше можно сжать такую последовательность.
Для сжатия результата работы метода может быть применена любая комбинация методов - RLE, MTF, DC, PBS, HUFF, ARIC, ENUC, SEM...
Методы этой группы являются трансформирующими и поточными (т. е. могут применяться даже в том случае, когда длина блока с данными не задана). Скорость выполнения прямого преобразования равна скорости обратного преобразования и зависит только от размера данных, но не от их содержания, т. е. Скорость=0(Размер). Памяти требуется порядка Л байт.
Из краткого описания общей идеи видно, что
1) можно один раз, при инициализации, задать как А, так и К/,
2) с точки зрения сложности вычислений и качества сжатия полезно ограничить й, но периодически определять оптимальные К/,
3) теоретически одна и та же зависимость может быть задана несколькими формулами, например
5/=(&_,+й_2)/2 и £> 5и/2 + Яа/2, но реально, из-за использования целочисленной арифметики, они не эквиваленты; в данном случае при вычислении S\- используется два округления вместо одного, поэтому мы получим различие.
ПРЯМОЕ ПРЕОБРАЗОВАНИЕ
В базовом простейшем случае иллюстрируется одной строкой:
//предполагаем, что S[i]*S[i-l] и, следовательно, D[i]«0 D[i]=S[i]-S[i-l];
где S[N] - исходный массив (Source, источник); D[N] - выходной массив преобразованных данных (Destination, приемник, с отклонениями, т. е. разностями, дельтами).
Такой вариант обычно называется дельта-кодированием (Delta Coding), поскольку записываем приращения элементов относительно значений предыдущих элементов. Если в значениях элементов имеется ярко выраженная линейная тенденция, то в результате получаем ряд чисел с близкими значениями.
Три строки, если требуется писать в тот же массив:
current=S[i]; //возьмем очередной элемент
S[i]=current-last; //вычислим его разность с прошлым
last=current; //теперь очередной стал прошлым
Например, из блока (12, 14, 15, 17, 16, 15, 13, 11, 9), применив этот простейший вариант преобразования, получим: (2,1,2, -1, -1, -2, -2, -2).
Более сложный вариант: Л=4, предполагаем, что .£,=1/4: S[i>( S[/-l] + S[/-2] + S[/-3] + SD-4] )/4. Тогда в алгоритме:
D[i]=S[i] - (S[i-l]+S[i-2]+S[i-3]+S[i-4])/4;
Здесь мы предполагаем, что явно выраженная линейная тенденция отсутствует и значение очередного элемента примерно равно значению предыдущего, причем D[i] приобретает отрицательные и положительные значения с равной вероятностью. Чтобы компенсировать влияние случайных возмущений, значение следующего элемента принимаем равным среднему арифметическому нескольких последних элементов. С другой стороны, чем больше элементов усредняем, тем консервативнее наша модель, тем с большим запаздыванием она будет адаптироваться к существенным изменениям (необязательно линейного характера) во входных данных.
Если результат преобразования требуется записывать в тот же входной массив S, то это можно реализовать следующим образом. Введем вспомогательный массив Last, в котором будем хранить исходные значения последних четырех преобразованных элементов массива S.
int Last[4]={ 0,0,0,0 }; int last_pos=0;
И далее в цикле преобразования для каждого элемента S[/] выполняем:
current=S[i]; // возьмем очередной элемент и вычислим
// его разность с предсказываемым значением: S[i]=current-(Last[0]+Last[1]+Last[2]+Last[3])/4; Last[last_pos]=current; // внесем current в массив Last last_pos=(last_pos+l)S3; // новое значение позиции в Last
С&. Упражнение. Как будет выглядеть алгоритм для модели S[/]=( S[/-1] + S[/-2] + +S[A-3) )/3? Будет ли он выполняться быстрее или медленнее рассмотренного варианта с л=4 и К/=1/4?
Обратное преобразование
Алгоритм очень похож на алгоритм прямого преобразования. Единственное отличие - теперь вычисляем не разность, а сумму предсказываемого значения и отклонения:
S[i]=D[i]+S[i-l]; // по предположенному S[i]=S[i-l]
Если для D и S используем один и тот же массив (S): S[i]-S[i]+S[i-1]; // сумма дельты с предыдущим элементом
В случае Л=4 , К/=1/4 :
S[i]-D[i] + (S[i-l]+S[i-2]+S[i-3]+S[i-4])/4;
Если пишем в тот же массив, то и в этом случае, в отличие от прямого преобразования, не требуется каких-то ухищрений:
S[i]=S[i] + (S[i-l]+S[i-2]+S[i-3]+S[i-4])/4;
Действительно, к моменту обратного преобразования очередного элемента S[i] в ячейках S[/-l],..., S[i-4] уже находятся восстановленные значения, а не отклонения, что нам как раз и нужно. Таким образом, использовать при разжатии два массива совершенно необязательно.
Пути увеличения скорости сжатия
Если можно записывать в тот же массив, то можно обойтись без излишнего массива Last[A] и связанных с ним операций, выполняемых на каждом шаге цикла преобразования.
Рассмотрим все тот же пример с А=4 , Kj=l/4. Сделаем так, чтобы внутри цикла было присваивание:
S[i-4]=S[i] - (S[i-l]+S[i-2]+S[i-3]+S[i-4])/4;
Тогда первые 4 элемента нам придется записывать отдельно:
First[0]«S[0];
First[l]-S[l] - S[0];
First[2]-S[2] - (S[l]+S[0])/2;
First[3]=S[3] - (S[2]+S[l]+S[0])/3;
Далее с помощью цикла преобразуем цепочку из последних (N-4) элементов и запишем результаты в первые (N-4) ячейки массива S:
for (i=4; i<N; i++)
S[i-4]=S[i] - (S[i-l]+S[i-2]+S[i-3]+S[i-4])/4;
Или даже так:
sum=S[3)+S[2]+S[l]+S[0]; for (i=4; i<N; i++)
j=S[i-4], S[i-4]=S[i] - sum/4, sum=sum-j+S[i];
Теперь мы можем переписать первые 4 преобразованных элемента из вспомогательного массива First в S:
for (i-0; i<4; i++) S[N-4+i]-First[i];
Таким образом, дополнительной памяти вне функции преобразования не требуется, внутри - только я элементов, скорость преобразования в общем случае та же, какая была бы при записи во второй массив.
Единственное осложнение - метод, сжимающий данные, полученные в результате преобразования LPC, должен сначала обработать А элементов из конца массива S, а лишь затем (N-h) из начала.
Если работаем не с потоком, а с блоком и длина массива S известна заранее, можно обрабатывать из конца в начало: в цикле по i от 7V-1 до 0 делаем: S[/+1]-=S[/].
Увеличение скорости разжатия
Если памяти достаточно и входных данных много, может оказаться выгодным сделать табличную реализацию каких-то арифметических операций (функций). С целью ускорения работы основного цикла можно, например, за счет этого избежать операции деления, выполняемой обычно гораздо дольше, чем операции сложения/вычитания и записи/чтения в/из памяти.
Например, вместо S[i-3)=S[i] - (S[i-l]+S[i-2]+S(i-3])/3;
намного быстрее на большинстве процессоров и для большинства компиляторов будет
S[i-3]-S[i]- Value[ S[i-l]+S[i-2]+S[i-3] ];
или даже
// R - размер элементов массива S в битах S[i-3]-Value2[ (S[i-l]+S[i-2]+S[i-3] )«R + S[i] ] ;
Упражнение. Напишите циклы, заполняющие вспомогательные массивы Value[] и Value2[].
Естественно, такой подход применим и для увеличения скорости сжатия.
Пути улучшения степени сжатия
Как мы уже отмечали, целесообразно повторно вычислять коэффициенты Kj через каждые Р шагов. На основании последних обработанных данных находим значения коэффициентов, оптимальные с точки зрения точности предсказания значений элементов, встреченных в блоке последних обработанных данных. Если Р=\, такой вариант обычно называется адаптивным. При большом значении Р вариант называется статическим, если значения Kj записываются в сжатый поток, и "полуадаптивным", "блочно-адаптивным" или "квазистатическим", если в явном виде значения Kj не записываются.
При сжатии с потерями можем сохранять не точные значения каждой разности Di = 5, - 1(K/Sj), а только первые В бит или, например, номер первого ненулевого бита. Но тогда при сжатии нужно использовать на следующих шагах то же значение 5„ которое получится при разжатии, а именно Si"= I.(KjSj)+Di, т. е. результат предсказания плюс сохраненная часть разности - дельты.
Метод LPC применяется обычно для сжатия аналоговых сигналов. И как правило, каждый элемент сигнала отклоняется от своего предсказываемого значения не только из-за "сильных" обусловленных изменений - эволюции, но и из-за "слабых" фоновых колебаний, т. е. шума. Поэтому возможно два противоположных типа моделей:
■ вклад шума невелик по сравнению с вкладом эволюции;
■ вклад эволюции невелик по сравнению с вкладом шума.
В первом случае мы будем предсказывать значение S[/j на основании сложившейся линейной тенденции, во втором - как равное среднему арифметическому h предыдущих элементов.
1 Тенденция может быть и нелинейной, например S[i]=:S[i-l]+2*(S[i-lJ-S[i-- 2J), но такие модели на практике в большинстве случаев менее выгодны и мы их рассматривать не будем.
Если ресурсов достаточно, можно вычислять предсказываемые значения, даваемые несколькими моделями, и затем либо синтезировать эти несколько предсказаний, либо выбирать (через каждые Р шагов) ту модель, которая оптимальна на заданном числе предыдущих элементов.
Требуется минимизировать ошибки предсказаний, поэтому рациональнее (выгоднее) та модель, которая дает наименьшую сумму абсолютных значений этих ошибок:
Эта задача имеет элементарное аналитическое решение: min\D\ = min (\Y— -К*Х\) ->К = Y*X', где Y-вектор из S[i] (реально наблюдаемых), К-матрица коэффициентов и Х-матрица S[i-x] (x = l,...,h). Но 1) сложность вычисления обратной матрицы не менее 0(h2) и перевычислять ее невыгодно, 2) высокая точность прогноза обычно не нужна, так как на практике стационарные последовательности встречаются редко.
Рассмотрим подробнее на примерах.
Общий случай
Если h-\, то учитывается только один последний элемент: S[/]=/C-S[/'-l]. Об эволюции не известно ничего, но можно предполагать, что К=1.
Упражнение. Изобразите сигнал, оптимально сжимаемый с помощью модели сл=1 иК=-1.
Все это, однако, не помешает нам действовать следующим образом: выберем начальное значение К0, шаг StepK изменения К, размер окна F, а также Р. Будем следить, с какой из трех моделей - К=К0, Kp=K0+StepK, Km=K0--StepK - сжатие последних F элементов лучше (меньше суммарная ошибка предсказания), и через каждые Р элементов выбирать лучшую (в данный момент) из трех моделей, с помощью которой и будут сжиматься следующие Р элементов.
Если это не текущая, а одна из двух с ±StepK, то изменяются и Кр с Кт, если, конечно, их значения не совпадают с границами: -1 или 1.
Например, можно использовать К0=0, StepK=\IA, F=10 и Р=2. Имеет смысл задать еще один параметр М - минимальный размер выигрыша оптимальной модели у текущей. Если выигрыш меньше М, то отказываемся от смены модели.
Следующий по сложности вариант использует переменный шаг для К. Также мы можем похожим образом корректировать F (например, изменять с шагом StepF, через каждые Q обработанных элементов).
Если h=2
Выражение S, = ^Г KjSj можно всегда переписать в таком виде: ./=1-1
s^/r^+zV^s^-s,..,.,).
J-1 Поэтому модель при А=2 можно представить как
S[i№S[i-1] + К2( S[/-l] - S[/-2]).
Найдем значения коэффициентов эволюционной модели. Если шум стремится к нулю, то изменения элементов объясняются только линейной тенденцией (эволюцией). Иначе говоря:
S[i]-S[i-l]=S[i-l]-S[i-2].
Отсюда получаем: /ч=1, К2=\.
Для шумовой модели S[/]=(S[M]+S[/-2])/2, и коэффициенты Kj получим из системы:
К\+К2=\/2 (коэффициент при S[/'-l])
-К2=1/2 (коэффициент при S[/-2])
Находим: К\=\, К2= -1/2. Таким образом, имеет смысл корректировать К2 в диапазоне не от 0 до 1, как может показаться на первый взгляд, а от -1/2 до 1.
Если А=3
S[Z№S[M] + Ј2(S[M]-S[/-2]) + *j-(S[f-2]-S[i-3]). (2.1)
У эволюционных моделей уже нет однозначного ответа о К\, К2 и Ку. Ki=l, K2+Ky=l (так как в общем случае через 3 точки нельзя провести прямую). Например, можно взять К2=3/4 и Ку=1/4, т. е. последнее приращение имеет втрое больший вес, чем предпоследнее. Или же #2-2, Ку= -1 (вторая производная постоянна).
Шумовая модель в одномерном случае одна при любых А, и при Л=3:
S[/]=(S[M] + S[/-2] + S[/-3])/3 (2.2)
Попробуем совместить обе модели - шумовую и эволюционную. При каких К\, К2 и Кз эволюционная (2.1) становится шумовой (2.2)? Из системы
Ki+K2=l/3 (коэффициент при S[/-l]);
-К2+К3=\/3 (коэффициент при S[/-2]);
-Ку=\/3 (коэффициент при SJ7-3])
находим: К\=1, К2= -2/3, К3= -1/3.
Имеет смысл пытаться корректировать £3 от -1 до 1„ при этом: (К2+К1) от -1 (шумовая модель) до 1 (эволюционная), т. е. К2
от (- l-ЛГз) до (1-К3):
|
к2\к3 |
-1 |
|
|
1 |
|
-l-Ki |
|
ш |
|
|
|
|
|
|
|
|
|
l-Ki |
э |
э |
э |
э |
Ш - такая пара значений (К2= -2/3, Къ= -1/3) соответствует шумовой модели; Э - такие пары К2+Ку=\ соответствуют эволюционной (а остальные -"средней").
При Л = 2 существует только одна эволюционная модель (через две точки всегда можно провести только одну прямую), по которой предсказываемое значение 5[/] = 5(2,[/] (рис. 2.1.);
При Л = 3 возможно использование множества модел гй: например, если считать изменение Sfrl-ST'-l] более важным, чем S[i-2]-S[i-3], то такая модель может дать, например, предсказание 5,(3,[/] или, е:ли считать S[i-2]--S[i-3] и S[i]-S[i-\] равноправными, прогнозное значение £<3)[/'].
|
|
Кроме того, при й=3 возникает возможность уменьшать шум. Метод заключается в следующем. После того как найдено среднее значение (S[/-1]+S[i-2]+S[i-3])/3, определим, какой из трех элементов больше отклоняется от него. Будем считать, что именно этот элемент содержит больше шума, чем остальные два, поэтому именно его учитывать не будем (или, что то же самое, положим его равным полусумме двух остальных). В качестве предсказания, даваемого шумовой моделью, возьмем полусумму двух остальных элементов.
Аналогично при Л=4 есть возможность взять 3 приращения ("дельты") и оставить те два, которые ближе к среднему всех трех.
Остается добавить, что ряд методов для сжатия речи с потерями (CELP, CS-ACELP, MELP) использует LPC для вычисления нескольких характеристик фрагментов сигнала (процесс называется LPC analysis). После обратного процесса (LPC synthesis) получается сигнал с теми же характеристиками, но совершенно другими данными, т. е. значениями элементов.
Двумерный случай
Рассмотрим только самый простой обход плоскости' - строками. В каждой точке плоскости уже обработанные, известные элементы -выше данной точки, а также на том же уровне, но левее ее.
'Задача обхода плоскости возникает при обработке двумерных данных. Цель обхода - создание одномерного массива D из двумерного S. Подробнее смотри в разд. 2.
|
sri-z.-n |
Sri-Ll |
S[/-L+l] |
|
st«-i] |
sm |
|
Здесь L - число элементов в строке. Ближайших к S[i] элементов - четыре. Обозначим для краткости так:
|
А |
В |
С |
|
D |
Е |
|
У шумовой модели есть 4 варианта с Л=1,6 вариантов с й=2,4 варианта с А=3 и один с А=4:
E=tf, D + К2С + КуВ + К4А (2.3)
Можно изначально задать К\=К2=Ку=К4=\14 и корректировать Kt вышеизложенным методом. Границы будут заданы условиями: Kj>0, K1+K2+K3+ +К4=1, и, например, Ki=K3, К2=К4 (и таким образом, Ki+Kz=l/2, достаточно корректировать К{).
У вариантов с й>2 есть возможность уменьшать шум тем же методом, что и в одномерном случае.
Таким образом, если использовать только 4 или меньше ближайших элементов, шумовая модель дает 20 вариантов: 4 - с й=1, 6 - с А=2, 8 - с А=3 и 2 - с А=4.
Эволюционная модель делает то же предположение, что и в одномерном случае: сохраняется линейная тенденция, приращение на текущем шаге примерно равно приращению на предыдущем. Но теперь, в двумерном случае, необходимо как минимум 3 элемента, а не 2:
E=ArB + Ј2-(D-A);
E=AVD + K2(B-A); (2.4)
E=Ki-D + K2iB-A) + K3iC-B). (2.5)
Первые два варианта, по предположению эволюционной модели, сводятся к одному: Ki=K2=l. В третьем, при коррекции в рамках эволюционной модели, границы таковы: К\-1,К2+Ку=1.
Попробуем построить модель с А=4, объединяющую два противоположных полюса - шумовой и эволюционный.
При каких Ки Кг и К3 эволюционная модель (2.5) становится шумовой: (2.3)c*i-l/4?
К\=1 /4 (коэффициент при D)
Ку= 1 /4 (коэффициент при С)
К2-Ку= 1 /4 (коэффициент при В)
~К2= 1 /4 (коэффициент при А)
Решений нет, и правильный ответ: ни при каких. Потому что в (2.3) коэффициенты при С, В и А должны быть К{>0. Применяя это условие к (2.5), получаем:
(С): *3Х);
(А): К2<0;
(В): К2-К3>0 (это несовместимо с результатами по С и А).
Тем не менее синтез шумовой и эволюционной модели при А=4 возможен. Будем брать предсказание того из 20 вариантов шумовой модели, который ближе всего к предсказанию эволюционной, т. е. разность между ними минимальна.
Как раз такой путь реализован в популярном алгоритме PNG, а именно в самом сложном, самом интеллектуальном его фильтре Paeth: 3 варианта шумовой модели (с использованием элементов А, В и D) и эволюционная модель (2.4). По сути это тот же метод, что и описанный выше в подразд. "Общий случай", только вместо среднего по трем точкам берется "двумерное эволюционное" значение и исключаются два элемента, а не один. Другой синтез возможен, если эволюционную модель модифицировать:
Е=К, D +К2(В-А) +tf3-(C-B)+i:4-A; (2.6)
Е=АГ, D +К2(В-А) +Л:3-(С-В)+Л:4-В; (2.7)
Е=Л:, D +*2-(В-А) +Ку(С-В)+КАС. (2.8)
Чтобы формулы описывали эволюционную модель, должно быть АГ4=0, К\=К2+К3=1. В шумовой модели /^=1/4, а К2, Kj и КА найдем из условий: коэффициенты при А, В и С должны быть равны 1/4:
в случае (2.6) С: АГ3=1/4, В:К2=1/2, А: .£,= 3/4;
в случае (2.7) С: Я3=1/4, А:К2=-1/4, В:ЛГ4=3/4;
в случае (2.8) А: К2—1/4, В:/С3=-1/2, O.K^Va.
Рассмотрим, например, (2.7). Имеет смысл корректировать К\ от 1/4 (шумовая модель) до 1 (эволюционная); КА найдется из условия К\+КА=\; Ку=1/4; К2+К3 от 0 (шумовая) до 1 (эволюционная), т. е. К2 от -1/4 до 3/4.
Таким образом, из (2.7) получается эволюционная модель при К\=1, К2=3/4 и шумовая при /ч=1/4, К2= -1/4.
Sk Упражнение. Каким будет синтез эволюционной и шумовой моделей в случаях (2.6) и (2.7) ?
LPC в алгоритме PNG
Для сжатия изображения можно выбрать одну из следующих LPC-mo-делей (называемых также фильтрами): 1) Е=0 (нет фильтра);
2) E=D (элемент слева);
3) Е=В (элемент сверху);
4) E=(B+D)/2;
5) вышеописанный алгоритм Paeth.
Все 5 моделей - варианты шумовой модели, и только последняя модель является комбинированной, учитывающей эволюцию.
LPCe алгоритме Lossless Jpeg
Может быть задан один из восьми предсказателей-фильтров:
1) Е=0 (нет фильтра);
2) Е=В (элемент сверху);
3) E=D (элемент слева);
4) Е=А (выше и левее);
5) E=B+D-A;
6) E=B+(D-A)/2;
7) E=D+(B-A)/2;
8) E=(B+D)/2.
Пятый, шестой и седьмой - варианты эволюционной модели, остальные - шумовой.
Выбор фильтра
Итак, имеем множество фильтров Spa[X,Y\=S0(KiyS[X-i,Y-j]) дающих оценки-предсказания Spn для значения элемента в позиции (X,Y) как функцию S„ от значений элементов контекста, т. е. элементов, соседних с текущим S[X,Y].
Два уже рассмотренных (в подразд. "Общий случай") пути дальнейших действий:
1) выбрать одно значение Sp„, даваемое той функцией S„, которая точнее на заданном числе предыдущих элементов;
2) выбрать значение, вычисляемое как сумма всех Sp„, взятых с разными весами: Sp = Z(WnSp„), 0<W„<1.
Кроме довольно очевидного способа - корректировки W„, весов, с которыми берутся предсказания, даваемые разными фильтрами, есть и еще варианты:
■ Брать те К значений Spn, которые дают Sn, лучшие на К (задаваемом числе) ближайших элементов контекста (некоторые из этих Sn могут совпадать, и их останется меньше чем К).
■ Все функции Sn сортируются по значению точности предсказания на ближайших элементах контекста, и выбирается несколько функций, дающих лучшую точность.
Четвертый вариант является простым расширением первого. Третий же предполагает постановку в соответствие каждому элементу одной S„, дающей для него самое точное предсказание. В обоих случаях, если требуется выбрать одну S„ из нескольких 5, с одинаковым значением точности, можно посмотреть значения точности этих St на большем числе элементов.
Во 2, 3 и 4-м часто полезно уменьшить шум вышеописанным способом. И в конечном итоге сложить оставшиеся Sp = T,(Wn-SpJ. В простейшем случае Wn=\IH, где Я- количество оставшихся Sn.
И еще три простых, но важных замечания.
Во-первых, сжатие обычно лучше, если значения оценок-предсказаний Spn не выходят за границы диапазона допустимых значений элементов входного потока S[i]. EcimA<S[i]<B, то и Spn[/] должны быть ^<Sp„[j]<S.
Во-вторых, если известно, что доля шума постоянна во всем блоке данных, очень полезно делать SEM до LPC, если нет другого метода для отделения шума.
И в-третьих, в каждой точке (х,у) веса Кл)) значений 5„,ь из (х-а, у-Ь) должны зависеть от расстояния до (х,у), вычисляемого как R~{a2+b2)ia. Эти веса должны убывать с увеличением расстояния R. Из четырех ближайших элементов контекста, рассмотренных в подразд. "Двумерный случай", D и В находятся на расстоянии 1, а А и С на расстоянии 2т. Поэтому, если как в формуле (2.3), шумовая модель складывает значения четырех ближайших элементов контекста с разными весами К-,:
e=a:,-d+к2с+КуВ+а:4а
имеет смысл задавать /ч=ЛТ3, ^2=^4. и еще из-за учета расстояний K-JK\=2m (и конечно, К1+К2+К3+К4= 1).
. Точно так же при вычислении точностей фильтров на элементах контекста ошибки их предсказаний У^ъ (а точнее, абсолютные значения этих ошибок) должны учитываться с весами АГа,ь, зависящими от расстояний: К^Ща2+Ь2)1П).
У эволюционной модели, использующей 4 элемента контекста (А, В, С, D), приращения (В-А), (D-A) и (С-В) находятся на равном расстоянии и имеют одинаковый вес. Но если используется больше четырех элементов, тоже необходимо вычислять расстояния.
Характеристики методов семейства LPC:
Степень сжатия: увеличивается примерно в 1.1-1.9 раза.
Типы данных: методы предназначены для сжатия количественных | данных.
Vip Настольные наборы с гравировкой.
Симметричность по скорости: в общем случае 1:1.
Шлюз IP телефонии iGATE - ip телефония. Телефонизация! Московский номер.
Характерные особенности: чем меньше доля "шума" в данных, тем ^ выгоднее применение методов LPC.