Прикладной SIMD 001: введение (часть 2)

Дата публикации 16 фев 2018 | Редактировалось 19 фев 2018
Анатомия сэмпла
Разобравшись с частотой дискретизации и минимальной разрядностью сэмпла для нужд профессиональной аудиообработки, необходимо решить ещё один вопрос: каким образом семпл будет храниться в памяти.
Как уже ранее упоминалось, для дискретизации по уровню сигнала может быть использована как линейная, так и нелинейная шкала. Нелинейная шкала была введена в цифровой телефонии для того, чтобы расширить динамический диапазон сигнала, но при этом сэкономить на размере сэмпла. На рисунке 8 представлены примеры линейной (синий цвет) и линейно аппроксимированной (красный цвет) логарифмической шкалы квантования для положительной составляющей сигнала.

008-curves.png
Рисунок 8. Линейная и аппроксимированная логарифмическая шкалы квантования.

Как видно из рисунка, при использовании нелинейной шкалы для сигналов с малой амплитудой выделяется большее количество кодовых комбинаций, а для сигналов с большой амплитудой — меньшее количество. Таким образом, когда сам АЦП был 12-битным, при помощи процедуры компандирования (companding — compression + expanding, компрессия + расширение) после ЦАП сжимался до 8 бит, а перед АЦП снова разжимался в 12-битный сэмпл. Существенным недостатком такого представления семпла является то, что из-за использования логарифмической шкалы семплы нельзя складывать без предварительного преобразования к линейной шкале и назад. Для сэмплов большей разрядности необходимость в такой экономии отсутствует, поэтому современных аудиоинтерфейсах используется линейная шкала квантования.

Помимо этого, сэмпл может быть представлен как в виде числа без знака, так и в виде числа со знаком. Если сэмпл представлен в виде числа без знака, то это подразумевает, что исходный аудиосигнал также имеет строго положительную амплитуду, а это говорит о том, что в сигнале присутствует достаточно существенная постоянная составляющая. Наличие постоянной составляющей подразумевает постоянное протекание тока по электрическим цепям, то есть, без необходимости повышенное энергопотребление. Мало того, в профессиональной аудиоаппаратуре по звуковому тракту зачастую предусматривается возможность подачи фантомного питания (постоянное напряжение величиной 48 вольт), которое может быть использовано для работы подключаемого к тракту оборудования и крайне необходимо для конденсаторных микрофонов. Иными словами, необходимость оцифровывать 48 вольт постоянного напряжения отсутствует, а уровни квантования выбираются так, чтобы ноль был в середине диапазона квантования, то есть значение сэмпла хранилось в виде числа со знаком.

Осталось выяснить, в каком виде удобнее всего производить обработку сэмпла. Сам по себе сэмпл может быть представлен как в виде числа с фиксированной запятой, так и в виде числа с плавающей запятой, при этом следует обратить внимание, что целое число — это частный случай числа с фиксированной запятой, у которого отсутствует дробная часть. На рисунке 9 достаточно схематично изображены структуры целого и вещественного чисел. Более подробно формат чисел с плавающей точкой будет описан в одной из дальнейших статей.

009-number-formats.png
Рисунок 9. Структуры знаковых чисел с фиксированной и плавающей точкой.

У каждой формы представления есть свои плюсы и минусы. Числа с фиксированной запятой быстро суммируются и умножаются, но при этом подвержены такой неприятной вещи, как переполнение. Выполнение более сложных операций, таких как вычисление комплексных чисел, трансцендентных функций и тригонометрии, на них сильно затруднены, и для того, чтобы не потерять в качестве, необходимо детально, с оглядкой на возможности вычислительного оборудования, продумывать каждый шаг алгоритма DSP. В свою очередь, числа с плавающей запятой лишены всех этих недостатков, но при этом обладают другими существенными минусами — это пониженная скорость вычислений и более дорогая аппаратная реализация. Однако эти недостатки полностью компенсируется удобством разработки кода, осуществляющего цифровую обработку сигнала.

Теперь следует обратить внимание на то, какие форматы чисел с плавающей запятой предоставляет современный ПК архитектуры x86 и x86_64. Это два основных типа — float (одинарной точности) и double (двойной точности). Ниже в таблице приведены характеристики этих типов данных.

Характеристикаfloatdouble
Количество байт/бит4/32 8/64
Знаковых бит11
Бит под мантиссу 23 52
Бит под порядок 8 11
Десятичных знаков ~7.2 ~15.9
Наименьшее абсолютное значение 1.4E-45 5.0E-324
Наибольшее абсолютное значение 3.4E+38 1.7E+308
Таблица 1. Основные характеристики чисел float и double

Как видно из таблицы, у типа float суммарно под мантиссу и знак в сумме выделено 24 бита. Учитывая то, что у мантиссы старшая единица ещё дополнительно отбрасывается, реальное количество бит, используемых под мантиссу, равно 25. Поэтому даже формат float в полной мере достаточен для того, чтобы качественно обрабатывать 24-битные сэмплы. Формат double также может быть использован для вычислений повышенной точности, однако занимает вдвое больше памяти, чем float, и поэтому не используется так часто.

Аудиопоток
После того, как мы определились с форматом семпла, необходимо понять, что из себя представляет аудиопоток, с которым приходится работать при обработке звука. Захват аудиосигнала со звуковой карты может быть выполнен как в одноканальном режиме, так и в многоканальном режиме. При этом, для каждого канала работает свой АЦП, преобразующий за один, условно говоря, такт аналоговый сигнал в сэмпл. Совокупность преобразованных за один такт сэмплов со всех каналов называется фреймом (frame).

Логично, предположить, что если процессор будет моментально реагировать на каждый поступающий на обработку фрейм, то это приведёт к достаточно частому срабатыванию прерываний ввода-вывода с частотой, равной частоте дискретизации сигнала, что очень негативно скажется на производительности центрального процессора ввиду необходимости переключения в режим обработки прерываний. Мало того, никакое аудиоприложение не сможет сгенерировать такой точный по таймингу аудиопоток, так как это также потребует значительных накладных расходов. С другой стороны, потеря или задержка одного сэмпла приводит к ощутимо слышимым артефактам при воспроизведении записи. Поэтому между аудиоинтерфейсом и центральным процессором фреймы пересылаются группами, которые называются периодами (period).

Размер периода обычно для удобства принимается равным степени двойки: 32, 64, 128 и т.д. Операционные системы, поддерживающие режим жёсткого реального времени, позволяют выставлять достаточно небольшие значения для периодов — 64 или даже 32 фрейма на период. В случае использования операционных систем, не поддерживающих режим реального времени, приходится довольствоваться куда большими периодами — от 512 фреймов и более.
Разумеется, пока фрейм ещё до конца не сформирован, он не может быть передан между звуковой картой и процессором. И, наоборот, пока фрейм передаётся, поверх него нельзя осуществлять запись. Поэтому имеет место быть двойная, тройная и более буферизация фреймов: выделяется область памяти под хранение нескольких фреймов, называемая буфером (buffer). На рисунке 10 наглядно изображена структура аудиопотока в стандарта 5.1.

010-audio-stream.png
Рисунок 10. Наглядная структура аудиопотока стандарта 5.1.

Разумеется, чем больше размер фрейма, тем меньше процессорного времени тратится на обработку прерываний от устройства ввода-вывода (звуковой карты), но при этом тем больше увеличивается время отклика системы, задержка, или латентность (latency), то есть задержка между моментом, когда сигнал поступил на вход АЦП, и моментом, когда уже оцифрованный сэмпл поступил на обработку процессором.
[math]lat = L_d/f_d[/math]
  • [math]lat[/math] - время отклика (секунды);
  • [math]L_d[/math] - длина периода в фреймах;
  • [math]f_d[/math] - частота дискретизации (Гц).

Разумеется, возникает логичный вопрос: почему большая задержка — это плохо? Дело, опять же, в особенностях нашего психоакустического восприятия: наше ухо нормально воспринимает задержку сигнала длительностью в среднем до 15 миллисекунд. Большая задержка вызывает уже дискомфорт, а при подмешивании исходного сигнала ощущается уже так называемый эффект эха. Если музыкант при записи своего инструмента будет слышать себя же в канале мониторинга со значительной задержкой, это вызовет у него очень большой дискомфорт и, возможно, даже сделает в принципе невозможной запись. Это справедливо также и для концертных выступлений, где необходимо производить обработку звука «на лету». С другой стороны очевидно, что при обычном воспроизведении музыки или микшировании записей ввиду отсутствия необходимости записывать источник сигнала задержка не играет такой важной роли, поэтому можно выиграть много драгоценного процессорного времени, просто увеличив размер периода.

Выводы

Подведём ещё раз итоги по вышеизложенному материалу. Для современной профессиональной обработки звука используются сэмплы, использующие линейную шкалу квантования и представленные в виде знакового числа с плавающей точкой размером 4 (float) либо 8 (double) байт. Сэмплы, захваченные одновременно из нескольких аудиоканалов, объединяются во фреймы. Фреймы объединяются в периоды и проходят дополнительную буферизацию, образуя цифровой аудиопоток. Чем больше размер периода или буфера, тем больше задержка между захватом и воспроизведением звука. Чем меньше размер периода, тем больше ресурсов процессора требуется на обработку аудиопотока.

1 2.221
SadKo

SadKo
Владимир Садовников

Регистрация:
4 июн 2007
Публикаций:
8