Квантование в разделе Квантование Сигнала не требует априорного знания о переданном сигнале. На практике можно часто делать образованные догадки о настоящем сигнале на основе прошлых передач сигнала. Использование таких образованных догадок, чтобы помочь квантовать сигнал, известно как прогнозирующее квантование. Наиболее распространенным методом прогнозирующего квантования является дифференциальная импульсно код модуляция (DPCM).
Функции dpcmenco
, dpcmdeco
, и dpcmopt
может помочь вам реализовать прогнозирующий квантователь DPCM с линейным предиктором.
Чтобы определить энкодер для такого квантователя, вы должны предоставить не только раздел и кодовую книгу, как описано в Represent Partitions и Represent Codooks, но и предиктор. Предиктор является функцией, которую 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)]
Примечание
Начальный нуль в векторе-предикторе имеет смысл, если вы рассматриваете вектор как полиномиальную передаточную функцию фильтра с конечной импульсной характеристикой (КИХ).
Простой специальный случай 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
В разделе Оптимизация параметров квантования описывается, как использовать обучающие данные с lloyds
функция, чтобы помочь найти параметры квантования, которые минимизируют искажение сигнала.
В этом разделе описываются аналогичные процедуры для использования dpcmopt
функция в сочетании с двумя функциями dpcmenco
и dpcmdeco
, которые впервые появляются в предыдущем разделе.
Примечание
Обучающие данные, которые вы используете с dpcmopt
должно быть типичным для видов сигналов, которые вы фактически будете квантовать с dpcmenco
.
Этот пример аналогичен примеру в последнем разделе. Однако, где был создан последний пример 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