Современные цифровые источники сигнала не поддерживают разрядность менее 16 бит, поэтому для формирования PCM-видеосигнала с 14-битными семплами данных необходимо понизить разрядность – провести повторное квантование. Простейший способ выполнения этой операции – это отбросить два младших бита. Разница между исходным и квантованным сигналом называется ошибкой квантования или шумом квантования. Для сигналов малой амплитуды ошибка квантования сильно коррелирует с сигналом, что приводит к нелинейным искажениям. Дизеринг заключается в подмешивании к сигналу x(t) шума d(t) перед выполнением операции квантования и позволяет сделать ошибку практически независимой от исходного сигнала (рис. 1).
Рис. 1. Схема дизеринга
Наиболее распространенным типом дизеринга является стандартный TPDF-дизеринг, когда к сигналу подмешивается шум с треугольным распределением и пиковой амплитудой ±1 LSB (шаг квантования). Данную операцию было решено реализовать на ПЛИС, т.к. они вполне позволяют получить как псевдослучайную шумовую последовательность бит на основе регистра сдвига с линейной обратной связью (РСЛОС, LFSR), так и истинно случайную последовательность при использовании генератора Галуа (GARO). Мы выбрали последний вариант.
При реализации PCM Format C в 14-битном режиме разрядность понижается на 2 бита и поэтому, чтобы затронуть младший бит, шум потребуется 3-битный. Шум с треугольным распределением можно получить сложив шум от двух источников с равномерным распределением. Прибавляя единицу к результату, мы получим шум, изменяющийся в нужном нам диапазоне от -3 до +3:
noise = n1 + n2 + 1;
где n1 и n2 – двухбитные сигналы шума с равномерным распределением.
Алгоритм дизеринга заключается в том, что очередной 16-разрядный семпл данных data суммируется с ошибкой предыдущего округления dither_err и шумом noise, учитывая возможные переполнения. Отбрасывая от получившейся суммы два младших бита, получаем результирующий 14-разрядный семпл out. Отброшенные биты – это ошибка округления.
dither = data + dither_err + noise out = dither_L[15:2] dither_err = dither[1:0]
Данный алгоритм по своей сути является нойз-шейпингом 1-го порядка.
Результаты проверки в программе RightMark Audio Analyzer представлены на графиках ниже (Рис. 2-4). Здесь показаны спектры тестовых сигналов – исходный 16-битный сигнал, 14-битный сигнал с усечением 2 младших битов без дизеринга, 14-битный сигнал с дизерингом Adobe Audition с 2 видами шума и 14 битный сигнал с реализованным в кодере дизерингом.
Рис. 2. Уровень шума
Рис. 3. Динамический диапазон
Рис. 4. Коэффициент нелинейных искажений
Численные результаты проверки в программе RightMark Audio Analyzer:
Test | 16 bit Source file |
14 bit No dither |
14 bit Audition Triangular |
14 bit Audition Gaussian |
14 bit Coder Triangular |
Noise level, dB (A) | -97.8 | -89.4 | -82.7 | -84.4 | -84.7 |
Dynamic range, dB (A) | 97.8 | 89.1 | 83.5 | 84.3 | 84.8 |
THD, % | 0.00033 | 0.00169 | 0.00171 | 0.00155 | 0.00158 |
IMD + Noise, % | 0.00354 | 0.00854 | 0.018 | 0.017 | 0.016 |
Ниже показаны примеры кадров с выключенным и включенным дизерингом.