Кодирование звука

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

Ни для кого, думаю, не секрет, что если через динамик "прогнать" сигнал синусоидальной формы, то в результате получим "чистый" тон, высота которого зависит от длины периода сигнала, а громкость - от амплитуды. Сложный звук, в частности музыка или голос, получается наложением множества сигналов разной частоты, амплитуды и длительности.

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

Частота дискретизации (sample rate) измеряется в Герцах (килоГерцах) и определяет, сколько раз в секунду с сигнала снимается значение амплитуды. Снятое значение оцифровывается и затем обрабатывается компьютером. Если используются два канала (стереозвук), то амплитуда снимается с двух каналов одновременно. Оцифрованное значение амплитуды с учетом количества каналов называется сэмплом (sample). Конечно, чем выше частота дискретизаци, тем более высокие частоты могут быть оцифрованы и тем качественнее звук. Некоторые ее значения уже успели стать стандартными и укорениться в форматах WAVE-файлов (8000, 11025, 22050 и 44100 кГц).

Число уровней квантования определяет число бит, необходимых для представления одного оцифрованного значения амплитуды. По этому показателю оцифрованный звук обычно делится на 8-битный и 16-битный (256 и 65536 уровней квантования соответственно). Значения восьмибитного кода от 0 до 127 определяют отрицательную амплитуду сигнала, 128 - ноль, 129-255 - положительную. При 16 битах кода эти значения распределены иначе: минимум - (-32768), 0 - нулевая амплитуда, 32767 - максимум. Ясно, что чем больше уровней квантования, тем точнее передается амплитуда звука, что, бесспорно, положительно отражается на качестве воспроизведения.

Итак, цифровой сигнал представляет собой числа, характеризующие амплитуду сигнала в конкретный момент времени. Для представления цифрового звука, как и следовало ожидать, используется специальный формат под названием PCM (Pulse Code Modulation - Импульсно-Кодовая Модуляция (ИКМ)). В PCM кодируется стерео- и моно-, 8- и 16-битный звук. Форматы соответствующих кодов см. на рисунке.

Кроме PCM, есть формат под названием ADPCM (Adaptive Delta Pulse Code Modulation - Адаптивная Дельта-Импульсно-Кодовая Модуляция), суть которого в передаче не абсолютного значения амплитуды сигнала, а только приращения ее по отношению к предыдущему значению, что, конечно, позволяет сжимать данные. В этой форме кодировки первым передается байт, значение которого равно абсолютной амплитуде сигнала, а последующие данные - приращения. По количеству бит, выделенных на значение относительной амплитуды сигнала, ADPCM делится на несколько видов в зависимости от степени сжатия сэмпла. Например: 8 бит - в 2, -в 3, -в 4 бита. Естественно, в ADPCM можно кодировать только малоизменяющийся во времени восьмибитный сигнал (иначе резкие перепады амплитуды будут кодироваться с искажениями).

Обратим внимание на качество звука. На аудио-компакт-диске музыка записана с частотой дискретизации 44кГц и глубиной квантования 16 бит. Но откуда цифра 44? Ведь человеческое ухо способно воспринимать звук в лучшем случае до 22кГц. Однако рассуждая здраво и обратившись к науке, мы находим теорему Котельникова, которая гласит, что аналоговый сигнал можно передавать дискретно без потери качества с частотой не менее, чем в 2 раза большей максимальной частоты этого аналогового сигнала. Вот откуда берутся загадочные стандарты.

И напоследок одно практическое замечание: как кодируется тишина? Казалось бы, логично для ее создания использовать отсутствие звука, то есть нулевую амплитуду сигнала. Однако этот способ хорош не всегда. Если в процессе воспроизведения звука наступает момент тишины, то в качестве цифрового значения амплитуды тишины лучше использовать предыдущее значение амплитуды сигнала. То есть если последним сыгранным значением было, например, 1200, то далее во время тишины нужно посылать не 0,0,0..., а 1200,1200,1200... Это позволяет избежать характерных "щелчков" в динамиках.

Андрей ВОРОШКОВ

Версия для печатиВерсия для печати

Номер: 

20 за 1998 год

Рубрика: 

Азбука программирования
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!