partition=[-.75 -.25 .25 .75];
codebook=[-.825 -.5 0 .5 .825];
[ind, xQ, D] = quantiz(x, partition, codebook);
plot(i,x), hold on, stem(i,xQ)
legend('Исходный сигнал','Результат квантован.')
for n=1:4
prt(n,i)=partition(n); plot(i,prt,'k')
end
for m=1:5
cdbk(m,i)=codebook(m); plot(i,cdbk,'r-.')
end
figure
stem(i,ind), title('Индексы')
ind, xQ, D
Исходный и квантованный сигналы приведены на рис. 27, график значений индексов (отсчетов) приведен на рис. 28.
Рис.27. График исходного и квантованного сигнала
Рис.28. График значений индексов
1.3. Дополнительные замечания о моделировании квантования в Simulink и MATLAB
В библиотеке Simulink Library пакета MATLAB (вер.6.1) имеется несколько разделов, содержащих блоки квантования и квантования с последующим кодированием. Рассмотрим эти блоки.
В разделе Simulink\Nonlinear находим блок квантования Quantizer (рис.37):
Рис.37. Блок квантования Quantizer
Точно такой же блок квантования имеется в разделе DSP Blockset\Quantizers. В том же разделе находятся еще два блока: Uniform Encoder – блок равномерного квантования с кодированием и соответствующий декодер Uniform Decoder (рис.38).
Рис.38. Блоки равномерного квантования с кодированием
Чтобы разобраться с возможностями этих блоков, сравним результаты их работы между собой, для чего в среде Simulink создадим схему, показанную на рис.39:
Рис.39. Схема для исследования блоков равномерного квантования с кодированием
С выхода генератора синусоидальных колебаний сигнал единичной амплитуды и частотой, равной 1 рад/с (рис.2), подается на входы квантователя и равномерного кодера. На рис.41 показан выходной сигнал квантователя с единичным интервалом квантизации, а на рис.42 и рис. 43 показан выходной сигнал 2-битного равномерного кодера.
Очевидное различие выходных сигналов квантователя и кодера обусловлено различием алгоритмом их работы.
Так, квантователь преобразует входной сигнал u в выходной сигнал y по правилу округления к ближайшему целому:
y = q round(u/q),
где q – интервал квантизации (в данном примере q=1), round() – функция округления к ближайшему целому.
Равномерный кодер осуществляет две операции над каждым отсчетом входного сигнала:
квантует значение с той же точностью;
кодирует значение с плавающей запятой в целое значение.
На первом шаге происходит квантование входного значения на 2B равномерных уровней в диапазоне [-V,(1-21-B)V], где B – параметр Bits, а V – параметр Peak (в данном примере B=2, V=1). Процесс квантования округляет как положительные, так и отрицательные входные значения к ближайшему снизу уровню квантования, за исключением тех, которые попадают точно на границу квантования. Количество бит B может быть любым целым числом от 2 до 32, включительно.
На следующем шаге квантованные вещественные числа с плавающей запятой преобразуются (кодируются) в одно из 2B целых чисел. Если параметр Output type установлен в значение Unsigned integer (целое положительное число) (соответствующий вид выходного сигнала показан на рис.42), наименьшее вещественное значение –V преобразуется в целое число 0, а наибольшее вещественное значение (1-21-B)V преобразуется в целое число 2B-1. Промежуточные квантованные значения с плавающей точкой линейно (равномерно) преобразуются в целые числа из диапазона (0, 2B-1). Для обеспечения эффективности, выходные данные кодера имеют тип (uint8, uint16, или uint32), с минимальным количеством бит, равным или большим B.
Если параметр Output type установлен в значение Signed integer (целое число со знаком) (соответствующий вид выходного сигнала показан на рис. 43), наименьшее вещественное значение –V преобразуется в целое число –2B-1, а наибольшее вещественное значение (1-21-B)V преобразуется в целое число 2B-1-1. Промежуточные квантованные значения с плавающей точкой линейно (равномерно) преобразуются в целые числа в диапазоне [-2B-1, 2B-1-1]. Для обеспечения эффективности, выходные данные кодера имеют тип (uint8, uint16, или uint32), с минимальным количеством бит, равным или большим B.
Рис.40. Исходный сигнал Рис.41. Выход квантователя
Рис.42. Выход равномерного кодера (Unsigned integer) Рис.43. Выход равномерного кодера (Signed integer)
Процедуру квантования можно реализовать в MATLAB с помощью m-функции quantiz():
[index,quants,distor] = quantiz(sig,partition,codebook)
При этом входными данными являются – вектор данных sig, вектор границ интервалов partition и вектор кодовой таблицы codebook, а выходными данными являются – вектор индексов index, вектор значений квантованного сигнала quants, средний квадрат ошибки distor (скаляр).
Варианты синтаксиса той же функции:
index = quantiz(sig,partition)
[index,quants] = quantiz(sig,partition,codebook)
В Simulink аналогом функции quantiz является блок Sampled Quantizer Encode. Особенность этого блока – элементы вектора входных данных должны подаваться на его вход одновременно (в смысле модельного времени). Проще всего это реализовать, импортируя данные из рабочего пространства MATLAB с помощью блока From Workspace. Другая особенность – в качестве ошибки квантования выдается не скаляр, а вектор квадратов ошибки для каждого из отсчетов. Выходные данные, как и входные, поступают не по мере их формирования в модельном времени, а сразу, в виде векторов. Поэтому анализировать такие данные с помощью блока Scope невозможно, и приходится прибегать к экспорту данных в рабочее пространство MATLAB с помощью блоков To Workspace.
Блок Uniform Encoder, в отличие от блока Sampled Quantizer Encode, обеспечивает только равномерное квантование и может работать с последовательно поступающими на его вход отсчетами сигнала. Параметры настройки блока Uniform Encoder – числа V и B, где V – максимальная амплитуда сигнала; B – количество бит, которым представляются отсчеты квантованного сигнала. Количество уровней квантования при этом равно 2B, т.е. может быть только степенью двойки. На выходе блока наблюдается единственный параметр – массив целых положительных (как вариант – массив целых со знаком) чисел, выдаваемых в модельном времени, так что выходной сигнал может быть просмотрен с помощью блока Scope (осциллоскоп).
Блок Quantizer реализует только равномерное квантование. Единственным параметром настройки блока является интервал квантования. Как следствие, число уровней квантования произвольно и зависит от соотношения максимального значения сигнала и интервала квантования.
И в заключение несколько слов о названиях блоков. Ни один из блоков «кодирования», т.е. в названии которых содержится слово Encoder, не осуществляет кодирование в том смысле, что не преобразует массив целых десятеричных чисел в массив целых двоичных чисел. Слово Encoder означает лишь, что такое преобразование, при желании, может быть легко выполнено.
Требования к содержанию отчета: составьте отчет в электронном виде, включающий все команды, вводимые в командной строке MATLAB и все полученные графики.
Достарыңызбен бөлісу: |