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

Дата публикации 16 фев 2018 | Редактировалось 19 фев 2018
Предисловие
Всем привет! Меня зовут Владимир Садовников, и в последнее время я активно занимаюсь разработкой плагинов, осуществляющих цифровую обработку аудиосигналов (DSP, Digital Signal Processing) на процессорах архитектуры x86 и x86_64. Учитывая то, что такие плагины зачастую осуществляют обработку сигнала в реальном времени, приходится достаточно основательно заниматься вопросом оптимизации вычислительных алгоритмов. При этом, одним из основных приёмов оптимизации является написание кода на языке низкого уровня (ассемблере), который позволяет получить доступ ко всем возможным инструкциям и расширениям команд процессора. Одними из наиболее важных расширений являются SIMD (Single Instruction — Multiple Data, одна инструкция — множественные данне), которые и будут рассматриваться в этом цикле статей.
В свою же очередь, я постараюсь не только рассказать про SIMD, но и поделиться уже накопленным в процессе разработки опытом и постараться подробно аргументировать те или иные нюансы, возникающие в процессе решения задачи. Иными словами, SIMD в данном цикле статей будет рассматриваться больше как средство оптимизации решаемых задач.
В данной статье я бы хотел рассмотреть именно отдельные особенности разработки плагинов и показать применимость SIMD для цифровой обработки сигналов. Однако для начала следует немного изучить область, в которой нам придётся работать.

Немного акустики

Кратко — плагины работают со звуком,а звук в нашем случае — это совокупность гармонических колебаний воздуха. Из школьных уроков физики мы помним, что каждое гармоническое колебание в точке пространства можно представить как синусоидальное (или косинусоидальное) изменение значение какого-либо физического параметра во времени, характеризующееся параметрами начальной амплитуды[math]A_0[/math], частоты[math]f[/math] и начальной фазы[math]ω_0[/math]:

[math]A(t) = A_0 cos(2πft + ω_0)[/math]

Наше ухо воспринимает звук благодаря тому, что молекулы воздуха, колеблясь, создают переменное давление на барабанную перепонку, которая далее передаёт эти колебания в наш сложный внутренний ушной механизм. В итоге, колебания воздуха преобразуются в нервные импульсы и уходят на обработку в наш мозг.
Что же касается записи или воспроизведения звука, то для его преобразования в электрический сигнал чаще всего используется микрофон, который, по сути, является аналогом нашего уха. На рисунке 1 изображён график изменения амплитуды некоторого аналогового сигнала во времени, преобразованный в электрический сигнал [math]U(t)[/math].

001-analog-signal.png
Рисунок 1. График изменения амплитуды аналогового сигнала во времени.

Однако из курса физики мы помним, что электрические сигналы непрерывны как по времени, так и по амплитуде, а компьютер не может обрабатывать непрерывные данные, и поэтому мы вынуждены их предварительно дискретизировать как по времени, так и по амплитуде. Выполняет эту работу ADC (Analog-to-Digital Converter, цифро-аналоговый преобразователь, ЦАП) посредством замера с заданной периодичностью в равные интервалы времени уровня электрического сигнала и преобразования полученного значения в некоторое двоичное число (квантование), называемое отсчётом, или сэмплом (sample).
На рисунке 2 изображено взятие с некоторой периодичностью отсчётов [math]A(t)[/math] аналогового сигнала [math]U(t)[/math] и дальнейшее квантование отсчётов по уровням - [math]S(t)[/math]. Сетка по вертикальной оси показывает величины уровней квантования.

002-discretization.png
Рисунок 2. Дискретизация аналогового сигнала по времени и амплитуде.

При этом следует учитывать, что чем меньше уровней квантования сэмпла, тем больше величина ошибки квантования и, как следствие, больше добавляемый к сигналу шум, называемый шумом квантования. На рисунке 3 изображён график шума квантования, полученный как разность дискретизированного по времени сигнала [math]A(t)[/math] и квантованного сигнала [math]S(t)[/math].

003-discretization-noize.png
Рисунок 3. Шум квантования АЦП.

Из всего вышесказанного возникают две очень важные характеристики цифрового аудиосигнала, с которыми постоянно приходится работать — это частота дискретизации (sample rate) и разрядность (битность) сэмпла.

Частота дискретизации — это количество равноотстоящих по времени отсчётов, захватываемых ЦАП в секунду.

Разрядность сэмпла — количество бит информации, используемых для хранения значения величины амплитуды одного дискретного отсчёта.

Разумеется, чем выше частота дискретизации и разрядность сэмпла, тем больше памяти необходимо для хранения информации, и тем больше процессорного времени требуется на её обработку. Учитывая то, что обработка сигнала в большинстве случаев должна производиться в реальном времени и с минимальной задержкой, возникает необходимость в оптимизации размеров этой самой информации: нужно выбрать такие частоту дискретизации и разрядность сэмпла, чтобы человеческое ухо не смогло различить разницу между аналоговым сигналом и сигналом, прошедшим сначала аналого-цифровое, а затем обратное цифро-аналоговое преобразование.

Поэтому следует вернуться к особенностям нашего слуха и обратить внимание на восприимчивость человеческого уха ко всем трём параметрам гармонического колебания — амплитуде, частоте и фазе.
Что касается амплитуды сигнала, то принято считать, что человеческое ухо в среднем имеет динамический диапазон 130 дБ, при этом восприимчиво не к амплитуде колебания, а его среднеквадратичному значению, то есть энергии. Следует учитывать, что децибелы — логарифмическая величина, отражающая разницу между громким и тихим сигналом, таким образом динамический диапазон уха [math]D[/math] можно представить следующим уравнением:

[math]D=10 lg(P_{max}/P_{min}) = 20 lg (A_{max}/A_{min})[/math]

[math]P_{min}[/math], [math]P_{max}[/math] - минимальное и максимальное значения звукового давления;

[math]A_{min}[/math], [math]A_{max}[/math] - минимальная и максимальная амплитуда звукового сигнала.

Учитывая то, что величина звукового давления пропорциональна квадрату амплитуды звукового сигнала, справедливо то, что в формуле с использованием звукового давления используется коэффициент 10, а в формуле с использованием амплитуды — коэффициент 20.

Таким образом, получаем, что для полного динамического диапазона отношение амплитуд должно составлять:

[math]A_{min}/A_{max} = 10^{D/20} = 10^6.5 = 3162277[/math]раз

Если теперь вычислить двоичный логарифм числа и округлить в большую сторону, то получим, что для представления всего диапазона уровней достаточно 22 бит. Округлив значение до кратного размеру байта числа, получим, что для хранения одного сэмпла достаточно трёх байт или 24 бит, и профессиональная музыкальная индустрия использует именно такую разрядность семпла как стандарт для производства музыкальной продукции. Однако, учитывая, опять же, особенности нашего слуха различать громкость с шагом 0.1 дБ, в бытовом сегменте было принято решение использовать более сжатый динамический диапазон в 96 дБ, что позволяет кодировать звуковую информацию при помощи 16 бит или двух байт — стандарт CD (Compact Disc). В классической цифровой телефонии используются семплы разрядностью 8 бит, а для расширения динамического диапазона используется нелинейная шкала квантования по уровню (правила A-law, Mu-law).

Что касается частотного диапазона, то человеческое ухо способно воспринимать частоты в диапазоне от 20 Гц до 20 кГц. Используя эту особенность нашего слуха, можно воспользоваться теоремой Найквиста-Котельникова, которая гласит о том, что для качественного восстановления дискретного сигнала в аналоговый необходимо использовать частоту дискретизации [math]f_d[/math] вдвое большую верхней граничной частоты сигнала [math]f_{гр}[/math]:
[math]f_d = 2f_{гр}[/math]

Иными словами, для того, чтобы оцифровать частотный диапазон от 20 Гц до 20 кГц, достаточно брать отсчёты с частотой 40 кГц. Однако при этом нельзя производить дискретизацию сигнала без предварительной обработки, так как может возникнуть эффект алиасинга (aliasing, наложение) частот, обусловленный тем, что частоты выше после дискретизации будут либо зеркально отражены, либо перенесены в слышимый диапазон частот и создадут неприятный эффект. Подобная ситуация изображена на рисунке 4, где красным цветом изображено колебание [math]U_1(t)[/math], имеющее частоту [math]0.1f_d[/math], а зелёным цветом — колебание [math]U_2(t)[/math], имеющее частоту [math]1.1f_d[/math]. Также точками показаны взятые отсчёты [math]S(t)[/math] с некоторой частотой [math]f_d[/math].

004-aliasing.png
Рисунок 4. Эффект алиасинга на примере двух частот при дискретизации сигнала

Как видно из рисунка, значения отсчётов, взятых с частотой [math]f_d[/math], идентичны для обоих сигналов, то есть после дискретизации станет невозможным различить эти два исходных сигнала, а после обратного цифро-аналогового преобразования оба сигнала восстановятся как [math]U1(t)[/math].

При этом, если изобразить некоторую огибающую частотного спектра сигнала (рисунок 5) с неограниченной верхней полосой частот и огибающую спектра сигнала после дискретизации, то наложение частот после дискретизации будет выглядеть следующим образом: часть спектра будет зеркально отражена, а часть — перенесётся из области высоких частот в область низких.

005-aliasing.png
Рисунок 5. Перенос и отражение частот спектра сигнала (алиасинг)

Поэтому перед дискретизацией аналоговый сигнал предварительно проходит фильтрацию, которая устраняет все частоты выше [math]f_{гр}[/math] при помощи фильтра нижних частот (ФНЧ) или, по-английски, Low-pass filter. Однако спроектировать идеальный аналоговый ФНЧ (как и цифровой) невозможно, и поэтому фильтр имеет определённую переходную частотную зону, которую также следует включить в частотный диапазон ниже [math]f_{гр}[/math]. На рисунке 6 изображён пример некоторого ФНЧ, имеющего коэффициент передачи 1 в зоне пропускания, переходная зона которого расположена в диапазоне частот [math]f_1[/math] и [math]f_2[/math].

006-lowpass.png
Рисунок 6. переходная зона фильтра нижних частот

Поэтому частоту дискретизации выбирают с запасом — 44100 Гц (стандарт CD) либо 48000 Гц (современный бытовой стандарт). Можно ли использовать большую частоту дискретизации при обработке аудиосигнала? Определённо можно, это позволяет, например, избежать или минимизировать тот же эффект алиасинга, который может возникнуть уже при цифровой обработке, и современные аудиоинтерфейсы поддерживают такие частоты дискретизации, как 88,2 кГц, 96 кГц, 176,4 кГц и даже 192 кГц. Можно ли использовать меньшую частоту дискретизации? Можно. Например, в классической цифровой телефонии используется частота дискретизации 8 кГц, что позволяет передавать частотный диапазон 0.3-3.4 кГц. Такая достаточно низкая частота дискретизации обусловлена тем, что на момент разработки цифрового стандарта телефонии электроника и элементная база не были настолько хорошо развиты, как сейчас, и нужно было остановиться на каком-то компромиссе, чтобы передать речевую информацию и, при этом, не сильно потерять в её разборчивости.

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

007-phasing.png
Рисунок 7. Примеры звуковых сигналов, идентично воспринимаемых человеком

Выводы
Подведём краткий итог: для профессиональной цифровой обработки аудиосигналов должно использоваться оборудование с частотой дискретизации не менее 44100 Гц и разрядностью сэмпла не менее 24 бит, что уже подразумевает цифровой поток скоростью чуть более 1 Мбит/секунду на один аудиоканал. Также будем полагать, что верхний потолок частоты дискретизации также не безграничен и ограничивается некоторой частотой. Например, 192 кГц.

3 3.058
SadKo

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

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

Комментарии


      1. SadKo 16 фев 2018
        Поправьте кто-нибудь размер рисунков, пожалуйста...
      2. SadKo 16 фев 2018
        Сборка своих статей.
        Есть где-нибудь доки по тому, как формулы клепать? Не могу символ "омега" вписать.
      3. LastNoob 16 фев 2018
        Интересная тема, а это будет перевод или сборка своих статей?)