Исходное кодирование

Представляйте разделы

Скалярное квантование является процессом, который сопоставляет все входные параметры в заданной области значений к общей ценности. Это карты процессов вводит в различной области значений значений к различной общей ценности. В действительности скалярное квантование оцифровывает аналоговый сигнал. Два параметра определяют квантование: раздел и книга шифров.

Раздел квантования задает несколько непрерывных, неперекрывающихся областей значений значений в наборе вещественных чисел. Чтобы задать раздел в среде MATLAB®, перечислите отличные конечные точки различных областей значений в векторе.

Например, если раздел разделяет строку вещественного числа на четыре набора

  • X: x ≤ 0}

  • X: 0 <x ≤ 1}

  • X: 1 <x ≤ 3}

  • X: 3 <x}

затем можно представлять раздел как трехэлементный вектор

partition = [0,1,3];

Длина вектора раздела является той меньше, чем количество интервалов раздела.

Представляйте книги шифров

Книга шифров говорит квантизатор, какую общую ценность присвоить входным параметрам, которые попадают в каждую область значений раздела. Представляйте книгу шифров как вектор, длина которого совпадает с количеством интервалов раздела. Например, вектор

codebook = [-1, 0.5, 2, 3];

одна возможная книга шифров для раздела [0,1,3].

Определите, в каком интервале каждый вход находится

Функция quantiz также возвращает вектор, который говорит, в каком интервале каждый вход находится. Например, вывод ниже говорит, что входные записи лежат в интервалах, маркированных 0, 6, и 5, соответственно. Здесь, 0th интервал состоит из вещественных чисел, меньше чем или равных 3; 6-й интервал состоит из вещественных чисел, больше, чем 8, но меньше чем или равный 9; и 5-й интервал состоит из вещественных чисел, больше, чем 7, но меньше чем или равный 8.

partition = [3,4,5,6,7,8,9];
index = quantiz([2 9 8],partition)

Вывод

index =

     0
     6
     5

Если вы продолжаете этот пример путем определения вектора книги шифров такой как

codebook = [3,3,4,5,6,7,8,9];

затем уравнение ниже связывает векторный index с квантованным quants сигнала.

quants = codebook(index+1);

Эта формула для quants точно, что quantiz функционируют использование, если вы вместо этого формулируете пример более кратко как ниже.

partition = [3,4,5,6,7,8,9];
codebook = [3,3,4,5,6,7,8,9];
[index,quants] = quantiz([2 9 8],partition,codebook);

Оптимизируйте параметры квантования

Разделите обзор

Квантование искажает сигнал. Можно уменьшать искажение путем выбора соответствующего раздела и параметров книги шифров. Однако тестирование и выбор параметров для больших наборов сигнала с прекрасной схемой квантования могут быть утомительными. Один способ произвести раздел и параметры книги шифров легко состоит в том, чтобы оптимизировать их согласно набору так называемых данных тренировки.

Примечание

Данные тренировки, которые вы используете, должны быть типичны для видов сигналов, которые вы будете на самом деле квантовать.

Пример: оптимизация параметров квантования

Функция lloyds оптимизирует раздел и книгу шифров согласно алгоритму Ллойда. Код ниже оптимизирует раздел и книгу шифров в течение одного периода синусоидального сигнала, начинающего с грубого исходного предположения. Затем это использует эти параметры, чтобы квантовать исходный сигнал с помощью параметров исходного предположения, а также оптимизированных параметров. Вывод показывает, что среднеквадратическое искажение после квантования намного меньше для оптимизированных параметров. Функция quantiz автоматически вычисляет среднеквадратическое искажение и возвращает его как третий выходной параметр.

% Start with the setup from 2nd example in "Quantizing a Signal."
t = [0:.1:2*pi];
sig = sin(t);
partition = [-1:.2:1];
codebook = [-1.2:.2:1];
% Now optimize, using codebook as an initial guess.
[partition2,codebook2] = lloyds(sig,codebook);
[index,quants,distor] = quantiz(sig,partition,codebook);
[index2,quant2,distor2] = quantiz(sig,partition2,codebook2);
% Compare mean square distortions from initial and optimized
[distor, distor2] % parameters.

Вывод

ans =

    0.0148    0.0024

Дифференциальная импульсная модуляция кода

Разделите обзор

Квантование в разделе Quantize a Signal не требует никакого априорного знания о переданном сигнале. На практике можно часто высказывать образованные предположения о существующем сигнале на основе прошлых передач сигнала. Используя такие образованные предположения, чтобы помочь квантовать сигнал известен как прогнозирующее квантование. Наиболее распространенный прогнозирующий метод квантования является дифференциальной импульсной модуляцией кода (DPCM).

Функции dpcmenco, dpcmdeco и dpcmopt могут помочь вам реализовать прогнозирующий квантизатор DPCM с линейным предиктором.

Терминология DPCM

Чтобы определить энкодер для такого квантизатора, необходимо предоставить не, только раздел и книга шифров, как описано в Представляют Разделы и Представляют Книги шифров, но также и предиктор. Предиктор является функцией, что использование энкодера DPCM, чтобы произвести образованное предполагает каждый шаг. Линейный предиктор имеет форму

y(k) = p(1)x(k-1) + p(2)x(k-2) + ... + p(m-1)x(k-m+1) + p(m)x(k-m)

где x является исходным сигналом, y(k) пытается предсказать значение x(k), и p является m - кортеж вещественных чисел. Вместо того, чтобы квантовать сам x, энкодер DPCM квантует прогнозирующую ошибку, x-y. Целочисленный m выше называется прогнозирующим порядком. Особый случай, когда   m = 1 называется модуляцией дельты.

Представляйте предикторы

Если предположение для k th значение x сигнала, на основе более ранних значений x,

y(k) = p(1)x(k-1) + p(2)x(k-2) +...+ p(m-1)x(k-m+1) + p(m)x(k-m)

затем соответствующий вектор предиктора для функций тулбокса

predictor = [0, p(1), p(2), p(3),..., p(m-1), p(m)]

Примечание

Начальный нуль в векторе предиктора целесообразен, если вы просматриваете вектор как полиномиальную передаточную функцию фильтра конечного импульсного ответа (FIR).

Пример: DPCM кодирование и декодирование

Простой особый случай DPCM квантует различие между текущим значением сигнала и его значением на предыдущем шаге. Таким образом предиктором является только      y(k) = x (k - 1). Код ниже реализует эту схему. Это кодирует пилообразное сообщение, декодирует его и строит обоих исходные и декодируемые сигналы. Сплошная линия является исходным сигналом, в то время как пунктирная линия является восстановленными сигналами. Пример также вычисляет среднеквадратичную погрешность между исходными и декодируемыми сигналами.

predictor = [0 1]; % y(k)=x(k-1)
partition = [-1:.1:.9];
codebook = [-1:.1:1];
t = [0:pi/50:2*pi];
x = sawtooth(3*t); % Original signal
% Quantize x using DPCM.
encodedx = dpcmenco(x,codebook,partition,predictor);
% Try to recover x from the modulated signal.
decodedx = dpcmdeco(encodedx,codebook,predictor);
plot(t,x,t,decodedx,'--')
legend('Original signal','Decoded signal','Location','NorthOutside');
distor = sum((x-decodedx).^2)/length(x) % Mean square error

Вывод

distor =

    0.0327

Оптимизируйте параметры DPCM

Разделите обзор

Раздел Optimize Quantization Parameters описывает, как использовать данные тренировки с функцией lloyds, чтобы помочь найти параметры квантования, которые минимизируют искажение сигнала.

В этом разделе описываются подобные процедуры для использования функции dpcmopt в сочетании с двумя функциями dpcmenco и dpcmdeco, которые сначала появляются в предыдущем разделе.

Примечание

Данные тренировки, которые вы используете с dpcmopt, должны быть типичны для видов сигналов, которые вы будете на самом деле квантовать с dpcmenco.

Пример: сравнение оптимизированные и неоптимизированные параметры DPCM

Этот пример подобен тому в последнем разделе. Однако, где последний пример создал predictor, partition и codebook прямым, но случайным способом, этот пример использует ту же книгу шифров (теперь названный initcodebook) как исходное предположение для нового оптимизированного параметра книги шифров. Этот пример также использует прогнозирующий порядок, 1, как желаемый порядок нового оптимизированного предиктора. Функция dpcmopt создает эти оптимизированные параметры, с помощью пилообразного x сигнала в качестве данных тренировки. Пример продолжает квантовать данные тренировки сам; в теории оптимизированные параметры подходят для квантования других данных, которые подобны x. Заметьте, что среднеквадратическое искажение здесь намного меньше, чем искажение в предыдущем примере.

t = [0:pi/50:2*pi];
x = sawtooth(3*t); % Original signal
initcodebook = [-1:.1:1]; % Initial guess at codebook
% Optimize parameters, using initial codebook and order 1.
[predictor,codebook,partition] = dpcmopt(x,1,initcodebook);
% Quantize x using DPCM.
encodedx = dpcmenco(x,codebook,partition,predictor);
% Try to recover x from the modulated signal.
decodedx = dpcmdeco(encodedx,codebook,predictor);
distor = sum((x-decodedx).^2)/length(x) % Mean square error

Вывод

distor =

    0.0063

Compand сигнал

Разделите обзор

В определенных приложениях, таких как речевая обработка, распространено использовать вычисление логарифма, названное компрессором, перед квантованием. Обратная работа компрессора называется расширителем. Комбинация компрессора и расширителя называется компандером.

Функция compand поддерживает два вида компандеров: µ-law и компандеры A-закона. Его страница с описанием перечисляет оба закона о компрессоре.

Пример: компандер µ-Law

Код ниже квантует экспоненциальный сигнал двумя способами и сравнивает получившиеся среднеквадратические искажения. Во-первых, это использует функцию quantiz с разделом, состоящим из длины интервалы. Во втором испытании compand реализует µ-law компрессор, quantiz квантует сжатые данные, и compand расширяет квантованные данные. Вывод показывает, что искажение меньше для второй схемы. Это вызвано тем, что интервалы равной длины хорошо подходят для логарифма sig, но не хорошо подходят для sig. Данные показывают, как компандер изменяет sig.

Mu = 255; % Parameter for mu-law compander
sig = -4:.1:4;
sig = exp(sig); % Exponential signal to quantize
V = max(sig);
% 1. Quantize using equal-length intervals and no compander.
[index,quants,distor] = quantiz(sig,0:floor(V),0:ceil(V));

% 2. Use same partition and codebook, but compress
% before quantizing and expand afterwards.
compsig = compand(sig,Mu,V,'mu/compressor');
[index,quants] = quantiz(compsig,0:floor(V),0:ceil(V));
newsig = compand(quants,Mu,max(quants),'mu/expander');
distor2 = sum((newsig-sig).^2)/length(sig);
[distor, distor2] % Display both mean square distortions.

plot(sig); % Plot original signal.
hold on;
plot(compsig,'r--'); % Plot companded signal.
legend('Original','Companded','Location','NorthWest')

Вывод и фигура ниже.

ans =

    0.5348    0.0397

Кодирование методом Хаффмана

Разделите обзор

Кодирование методом Хаффмана предлагает способ сжать данные. Средняя длина Кода Хаффмана зависит от статистической частоты, с которой источник производит каждый символ из своего алфавита. Словарь Кода Хаффмана, который сопоставляет каждый символ данных с кодовой комбинацией, имеет свойство, что никакая кодовая комбинация в словаре не является префиксом никакой другой кодовой комбинации в словаре.

huffmandict, huffmanenco и функции huffmandeco поддерживают Кодирование методом Хаффмана и декодирование.

Примечание

Для длинных последовательностей из источников, скашивавших дистрибутивы и маленькие алфавиты, кодирование арифметики сжимается лучше, чем Кодирование методом Хаффмана. Чтобы изучить, как использовать арифметическое кодирование, смотрите Арифметическое Кодирование.

Создайте словарь кода Хаффмана в MATLAB

Кодирование методом Хаффмана запрашивает статистическую информацию об источнике закодированных данных. В частности, входной параметр p в функции huffmandict перечисляет вероятность, с которой источник производит каждый символ в своем алфавите.

Например, рассмотрите источник данных, который производит 1 с с вероятностью 0.1, 2 с с вероятностью 0.1 и 3 с с вероятностью 0.8. Основной вычислительный шаг в кодировании данных из этого источника с помощью Кода Хаффмана должен создать словарь, который сопоставляет каждый символ данных с кодовой комбинацией. Команды ниже создают такой словарь и затем показывают вектор кодовой комбинации, сопоставленный с особым значением от источника данных.

symbols = [1 2 3]; % Data symbols
p = [0.1 0.1 0.8]; % Probability of each data symbol
dict = huffmandict(symbols,p) % Create the dictionary.
dict{1,:} % Show one row of the dictionary.

Вывод ниже показов, что самый вероятный символ данных, 3, сопоставлен с одноразрядной кодовой комбинацией, в то время как менее вероятные символы данных сопоставлены с кодовыми комбинациями 2D цифры. Вывод также показывает, например, что энкодер Хафмана, получающий символ данных 1, должен заменить последовательностью 11.

dict =

    [1]    [1x2 double]
    [2]    [1x2 double]
    [3]    [         0]


ans =

     1


ans =

     1     1

Создайте и декодируйте код Хаффмана Используя MATLAB

Пример ниже выполняет Кодирование методом Хаффмана и декодирование, с помощью источника, алфавит которого имеет три символа. Заметьте, что huffmanenco и функции huffmandeco используют словарь, который создал huffmandict.

sig = repmat([3 3 1 3 3 3 3 3 2 3],1,50); % Data to encode
symbols = [1 2 3]; % Distinct data symbols appearing in sig
p = [0.1 0.1 0.8]; % Probability of each data symbol
dict = huffmandict(symbols,p); % Create the dictionary.
hcode = huffmanenco(sig,dict); % Encode the data.
dhsig = huffmandeco(hcode,dict); % Decode the code.

Арифметическое кодирование

Разделите обзор

Кодирование арифметики предлагает способ сжать данные и может быть полезно для источников данных, имеющих маленький алфавит. Длина арифметического кода, вместо того, чтобы быть зафиксированной относительно количества закодированных символов, зависит от статистической частоты, с которой источник производит каждый символ из своего алфавита. Для длинных последовательностей из источников, скашивавших дистрибутивы и маленькие алфавиты, кодирование арифметики сжимается лучше, чем Кодирование методом Хаффмана.

arithenco и функции arithdeco поддерживают арифметическое кодирование и декодирование.

Представляйте параметры кодирования арифметики

Арифметическое кодирование запрашивает статистическую информацию об источнике закодированных данных. В частности, входной параметр counts в arithenco и функциях arithdeco перечисляет частоту, с которой источник производит каждый символ в своем алфавите. Можно определить частоты путем изучения набора тестовых данных из источника. Набор тестовых данных может иметь любой размер, который вы выбираете, пока каждый символ в алфавите имеет ненулевую частоту.

Например, прежде, чем закодировать данные из источника, который производит 10 x's, 10 лет и 80 z's в типичном 100 наборах символов тестовых данных, задают

counts = [10 10 80];

Также, если больший набор тестовых данных из источника содержит 22 x's, 23 года и 185 z's, то задают

counts = [22 23 185];

Создайте и декодируйте арифметический код Используя MATLAB

Пример ниже выполняет арифметическое кодирование и декодирование, с помощью источника, алфавит которого имеет три символа.

seq = repmat([3 3 1 3 3 3 3 3 2 3],1,50);
counts = [10 10 80];
code = arithenco(seq,counts);
dseq = arithdeco(code,counts,length(seq));

Квантуйте сигнал

Скалярный пример квантования 1

Код ниже показов, как функция quantiz использует partition и codebook, чтобы сопоставить вектор действительных чисел, samp, к новому вектору, quantized, записи которого или-1, 0.5, 2, или 3.

partition = [0,1,3];
codebook = [-1, 0.5, 2, 3];
samp = [-2.4, -1, -.2, 0, .2, 1, 1.2, 1.9, 2, 2.9, 3, 3.5, 5];
[index,quantized] = quantiz(samp,partition,codebook);
quantized

Вывод ниже.

quantized =

  Columns 1 through 6

   -1.0000   -1.0000   -1.0000   -1.0000    0.5000    0.5000

  Columns 7 through 12

    2.0000    2.0000    2.0000    2.0000    2.0000    3.0000

  Column 13

    3.0000

Скалярный пример квантования 2

Этот пример иллюстрирует природу скалярного квантования более ясно. После квантования выбранной синусоиды это строит исходные и квантованные сигналы. График контрастирует x, которые составляют синусоиду с точками, которые составляют квантованный сигнал. Вертикальная координата каждой точки является значением в векторном codebook.

t = [0:.1:2*pi]; % Times at which to sample the sine function
sig = sin(t); % Original signal, a sine wave
partition = [-1:.2:1]; % Length 11, to represent 12 intervals
codebook = [-1.2:.2:1]; % Length 12, one entry for each interval
[index,quants] = quantiz(sig,partition,codebook); % Quantize.
plot(t,sig,'x',t,quants,'.')
legend('Original signal','Quantized signal');
axis([-.2 7 -1.2 1.2])