Скалярное квантование - это процесс, который отображает все входы в заданном диапазоне на общее значение. Этот процесс сопоставляет входы в другом диапазоне значений с другим общим значением. В действительности скалярное квантование оцифровывает аналоговый сигнал. Квантование определяют два параметра: разбиение и кодовая книга.
Раздел квантования определяет несколько смежных неперекрывающихся диапазонов значений в наборе вещественных чисел. Чтобы указать раздел в среде 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 соответственно. Здесь 0-й интервал состоит из вещественных чисел, меньших или равных 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Код ниже показывает, как 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
Этот пример иллюстрирует характер скалярного квантования более ясно. После квантования дискретизированного синусоидального сигнала он строит график исходного и квантованного сигналов. Сюжет контрастирует 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])
