Процедурная генерация звука в реальном времени. Основы
Автор: xdevxx
В статье предоставлен материал для новичков в данной теме. После прочтения статьи нельзя будет с ходу написать свой движок-убийцу OpenAL, но, как минимум, должно остаться понимание того, что имеют в виду когда упоминают различные звуковые эффекты, как их теоретически можно реализовать, и так далее.
Процедурная генерация звука в реальном времени. Основы
Введение
Основные понятия
Осцилляторы
Модуляция
Фильтрация
Характеристики фильтра
FIR/IIR фильтры
Дизайн фильтра (с примерами)
Программное обеспечение
Совсем немного математики
Построение АЧХ/ФЧХ, нормализация
Эффекты
Хор/фейзер/фланжер
Реверберация
Кратко о некоторых других эффектах
Пространственные эффекты
Бинауральные эффекты
Примеры
Источники
Введение
Звук – распространение волн в среде. Характеризуется амплитудой (силой) и спектром частот (характером) колебаний. Существует множество способов генерации данных, которые в дальнейшем можно воспроизвести как звуковые волны: от физического моделирования до фильтрации осцилляторов и даже простого создания звуков с помощью элементарных математических функций. Последнее является, в некоторой мере, аддитивным синтезом, когда сигнал создается через сумму тригонометрических функций с различными фазами и амплитудами, только несколько упрощенный, потому как в основе аддитивного синтеза лежит математика (см. преобразование Фурье), тогда как в вышеупомянутом методе – в основном подбор звучания «на слух».
В качестве примера подбора звучания «на слух» – sound toy (http://iquilezles.org/apps/soundtoy/index.html) от известного демосценера IQ/RGBA. Посмотреть краткий список различных способов создания звука с небольшим описанием к каждому можно в [1].
Стоит в самом начале упомянуть неплохой сборник примеров реализаций различных алгоритмов цифровой обработки сигналов (применительно к обработке цифрового звука) - [2], в процессе чтения данной статьи можно обращаться за примерами в этот архив. Высокоуровневый обзор звуковых технологий (довольно старый, но информация в нем еще довольно актуальна), используемых в играх, проблемах звуковых движков и пр.: [18].
В цифровом мире звук обычно представляется набором сэмплов: определенное количество раз в секунду (т.н. частота дискретизации) берется значение звукового давления и записывается в массив. Таким образом, получается дискретное представление сплошного сигнала. Естественно, чем больше частота дискретизации (соответственно, меньше время между снятием значений), тем точнее представляется исходный сигнал. Иллюстрация дискретизации сплошного сигнала из Wikipedia - Sampling rate:
В результате дискретизации аналогового сигнала (синий график),
получается набор равноудаленных сэмплов (черные точки).
Для представления синусоиды определенной частоты требуется минимум два сэмпла на период: один представляет волну в минимуме, другой – в максимуме. То есть, фактически, для представления синусоиды частотой N Гц требуется частота сэмплирования (дискретизации) Fs минимум 2*N Гц. В теории обработки сигналов эта теорема звучит так:
если спектр функции x(t) не содержит частот выше FN Гц, то ее можно восстановить однозначно и без потерь с помощью последовательности точек, разнесенных не более чем на 1/(2*FN) секунд;
и носит название теоремы Найквиста-Шеннона (англ. Nyquist-Shennon theorem) - в англоязычной литературе, или теоремы отсчетов (теоремы Котельникова) - в русскоязычной литературе.. Фактически, это объясняет наиболее распространённую частоту сэмплирования – 44100 Гц: максимальная частота звука, улавливаемого человеческим ухом лежит где-то в районе 20 КГц (минимальная частота – 20 Гц). Максимальную частоту, которую можно представить с заданной частотой дискретизации (фактически, равную Fs/2 Гц), называют частотой Найквиста.
Здесь же лежит еще одна важная деталь: при попытке получить частоты выше, чем частота Найквиста, возникает эффект алиасинга (англ. aliasing) – волны этих повышенных частот будут представлены совокупностью частот ниже частоты Найквиста неопределенным образом, что в итоге будет звучать грязно. Поэтому при понижении частоты дискретизации сигнала необходимо отфильтровывать частоты, превышающие частоты Найквиста для будущей частоты дискретизации (см. раздел «Фильтры» ниже).
Алиасинг в данном случае приведет к некорректному звучанию исходной волны
(исходный сигнал - темно-зеленый, результат будет звучать как синий сигнал)
Помимо частоты дискретизации другой важной характеристикой сигнала в дискретном мире является глубина дискретизации, так же называемая разрядностью или количеством уровней квантования. Эта величина показывает, сколько ячеек информации выделяется под хранение одного сэмпла. Для стандартного CD аудио используется глубина дискретизации в 16 бит на сэмпл, то есть, например если сигнал приведен к диапазону [-1; 1], то минимальный шаг внутри этого диапазона будет 2 / 65536 ≈ 3 * 10-5. Понижение глубины дискретизации на существующем сигнале может привнести квантизационный шум, этот факт используется например в эффекте bitcrusher (см. раздел «Кратко о некоторых других эффектах» далее).
В этой статье внимание будет заострено, в основном, на субтрактивном синтезе, так как это основной инструмент, используемый в старых аналоговых синтезаторах и демосцене.
Субтрактивный синтез означает, буквально, «вычитательное создание», и называется он так потому, что вначале берется сигнал (например, выходной сигнал с осциллятора), в котором присутствуют многие частоты, а затем эти частоты «вырезаются» различными фильтрами. На самом деле это не совсем так, поскольку фильтры с резонансом могут усиливать частоты, а не только их вырезать/оттенять, а некоторые эффекты могут даже добавлять частоты ([3], 9:00).
Вообще, данный источник ([3]) крайне рекомендуется к ознакомлению всем, кто понимает достаточно простую техническую речь на английском языке: в этом семинаре известный демосценер – Tammo “kb/farbrausch” Hinrichs – рассказывает об основах написания синтезаторов, показывая на примерах различные осцилляторы, фильтры и модуляции.
Но обо всем по порядку.
Основные понятия
Для начала стоит определить некоторые понятия, которые часто встречаются в различных статьях, связанных с программированием/редактированием звука.
В первую очередь, необходимо объяснить понятие «звуковой спектр», что это такое, и как с ним работать. Звуковой спектр - это состав аккустического сигнала, информация о том, как энергия сигнала распределена по частотам. Чаще всего визуализируется с помощью графика амплитуда-частота. Само понятие «спектр» было введено Ньютоном в качестве обозначения цветных полос, получающихся при пропускании белого света через призму. Звуковая волна, по аналогии с оптической может быть разложена на простейшие периодические составляющие, для этого используется преобразование Фурье. Смысл его, если кратко, в том, чтобы представить некую произвольную периодическую функцию - суммой множества простых периодических функций (в нашем случае - синус). В качестве примера возьмем квадратную волну (подробней о ней чуть дальше, в разделе «Осцилляторы»), иллюстрация из Wikipedia - Fourier series:
Представление исходной «квадратной» волны
суммой более простых синусоидальных волн
У каждого из простейших слагаемых, участвующих в преобразовании, своя амплитуда и частота. Чем больше слагаемых, тем точнее представляется исходная функция функция (это заметно на рисунке, сверху вниз идет увеличение количества слагаемых). Если же построить диаграмму, где ось X - частота простейшего слагаемого, а ось Y - соответствующая амплитуда, то получится спектральный состав анализируемого сигнала. Примеры подобных диаграмм можно увидеть в разделе «Осцилляторы». Наглядно процесс представлен на иллюстрации из Wikipedia - Fourier transform:
Красным показан исходный сигнал (временной домен),
синим - его базовые слагаемые (частотный домен)
Далее, понятие обертон (нем. oberton, англ. overtone — «верхний тон») в составе спектра звука означает любой призвук, частота которого выше фундаментальной (самой нижней) частоты звука. Обертоны бывают гармоническими (англ. harmonic) и негармоническими: в первом случае их частота кратна фундаментальной частоте, во втором же – нет. Базовая частота и обертоны формируют то, что называют тембром звука, его специфический «окрас», позволяющий, например, определить, какой музыкальный инструмент звучит. Ниже - иллюстрация гармонических обертонов (оригинальная иллюстрация взята с сайта Physics of Music):
Стоит упомянуть, что слух человека воспринимает музыкальные звуки, отношение частот которых равно двум, как очень похожие, на этом построена «октавная система». То есть частота ноты «до» в определенной октаве ровно в два раза больше частоты ноты «до» соседней, беолее низкой октавы: Fc2 / Fc1 = 2. Для того, чтобы определить частоту, соответствующую фортепианной клавише, можно воспользоваться следующей формулой (октава на фортепиано равномерно покрыта 12-ю клавишами, n - порядковый номер клавиши на фортепиано, для ноты «ля» субконтроктавы n = 0):
Также со звуком часто связывают употребление такого понятия как децибел (англ. decibel). На самом деле, это просто мера выражения отношения одной величины к другой, взятая в логарифмическом масштабе. Логарифмический масштаб в акустике нужен из-за гигантского динамического диапазона, который улавливает человеческое ухо – отношение громкости звука, который может вызывать повреждение слухового аппарата, к громкости самого тихого звука, улавливаемого ухом – примерно 1 триллион (1012), что в логарифмическом масштабе (по основанию 10) – всего лишь 12. То есть можно сказать что разница в громкости самого громкого и самого тихого звуков – 12 бел (назван в честь Александра Белла – того самого основоположника телефонии), или 120 децибел. Вот формулы, по которым рассчитывается количество бел (ну, а приставка деци- означает десятую часть, т.е. 1 Б = 10 дБ):
где I - интенсивность сигнала, I0 - интенсивность сигнала, с которым происходит сравнение.
В физике часто используют другое логарифмическое представление отношений – единицу Непер (в честь человека, который ввел понятие «логарифм»): только используется натуральный логарифм (по основанию e) вместо десятичного (по основанию 10).
Осцилляторы
Субтрактивный синтез начинается с осциллятора. Осциллятор (англ. oscillator) — генератор периодических звуковых волн различного характера.
Поскольку звуковые волны – это распространение колебаний в среде, а простейший вид колебаний – синусоидальные, то и простейший вид осциллятора – простой синус. Одна из основных характеристик звукового сигнала (как и света) – спектр. Сигнал, генерируемый синусоидальным осциллятором, будет иметь только одну ненулевую «запись» в спектре – ту, что соответствует частоте синуса. Т.к. для работы с фильтрами нужен более богатый спектр, то основные базовые осцилляторы в субтрактивном синтезе имеют более сложную спектральную характеристику; в то время как синусоидальные осцилляторы используются в основном для модуляции (о модуляции чуть позже).
Вот список осцилляторов, используемых в качестве базовых для последующего применения фильтров (иллюстрации взяты с этого сайта, см. разделы TRIANGLE/SQUARE/SAWTOOTH WAVE):
Треугольная волна (англ. triangle wave)
Треугольная волна и ее спектр показаны на рисунке выше. Обратите внимание, что шкала частот - нелинейная, и начинается не с 0 а с основной частоты сигнала (на рисунке выше - с первой гармоники с частотой в 100 Гц). Кратность гармоники указана выше столбика. Не трудно заметить, что для 100 Гц треугольной волны, в спектре встречаются 300 Гц, 500 Гц, 700 Гц и так далее – нечетные гармоники.
Квадратная волна (англ. square wave)
На спектре видно, что она так же (как и треугольная волна) состоит из нечетных гармоник, только затухают гармоники гораздо медленнее: например, 900 Гц в случае треугольной волны имеет затухание чуть меньше -40 дБ, а в случае квадратной – только около -20 ДБ.
Квадратная волна может звучать по-разному в зависимости от отношения длительности максимальных значений к длительности минимальных. Стандартное соотношение - 50/50. Обычно квадратная волна с неравным соотношением также называется пульс-волной. Спектр пульс-волны более богат, чем спектр квадратной волны, но в нем присутствуют периодические провалы.
Пилообразная волна (англ. sawtooth wave)
Так же, как и в случае с квадратной волной и пульс-волной, для пилообразной волны есть волна, в которую она может плавно перетечь – треугольная. Параметр, который отвечает за переход – отношение нарастания к спаду волны: то есть в случае с треугольной волной это 50/50 %, в случае с пилообразной – либо 100/0 %, либо 0/100 % (тогда получится обратная пилообразная волна).
Код для всех этих типов осцилляторов можно посмотреть в [4], картинки со распределением частот взяты из [5] (ссылку на конкретный раздел см. выше).
Шум (англ. noise)
Существует несколько типов шумовых генераторов (осцилляторами это назвать трудно, однако, чаще всего их объединяют для простоты). Типы также обычно называют цветами - опять же, по аналогии спектральной составляющей со светом.
Например, самый обычный псевдослучайный шум называют белым, поскольку спектр содержит все частоты в равной степени (как и спектр белого света – в равной степени содержит все частоты света из оптического диапазона). Более приятный для человеческого уха – мягкий шум, амплитуда частот в спектре которого обратно пропорциональна частоте, называют розовым (низкие частоты – красный свет – присутствуют в большей мере, а высокие частоты, соответствующие синему – практически отсутствуют). Иногда розовым шумом называют более широкий класс шумов: частоты этого шума пропорциональны 1/fα, где степень α близка к единице. Розовый шум – предмет исследования во многих областях, он часто встречается в природе, и вообще штука крайне интересная. Если степень α увеличить до 2, то получится красный шум, его так же иногда называют Броуновским (Brownian, его еще иногда называют неправильно, из-за некорректного перевода, коричневым). Нижние частоты в этом шуме еще более акцентированы, так что слушать этот вид шума даже более приятно, а так же он практически без изменений напоминает шум толпы, так что он незаменим для урбанистических сценок.
Если идти в обратную сторону (увеличивать амплитуду частоты в спектре пропорционально самой частоте), то получаются синий и фиолетовый шумы.
Модуляция
Один из простейших способов изменения сигнала – модуляция. Она позволяет изменять определенные свойства сигнала, используя другой сигнал. Обычно для этого используются так называемые низкочастотные осцилляторы (англ. Low Frequency Oscillator, LFO). Несмотря на то, что их обычно отделяют от обычных осцилляторов (по крайней мере, терминологически) - это такие же осцилляторы, только с частотой ниже порога восприятия человеческого уха (20 Гц). Наиболее простой вид модуляции – амплитудная, когда изменяется интенсивность сигнала. Ближайший аналог амплитудной модуляции по осциллятору в музыке – тремоло (англ. tremolo).
В синтезаторах также активно используется так называемые огибающие (англ. envelope), которые определяют кривые, задающие интенсивность сигнала. Самым знаменитым видом огибающих является ADSR-огибающая (англ. Attack Decay Sustain Release – атака, спад, удержание, освобождение), которая определяет интенсивность сигнала относительно нажатия клавиши синтезатора: при нажатии клавиши происходит быстрый взлет интенсивности сигнала – атака, далее идет спад до определенного уровня, который не изменяется в течение длительного удержания клавиши, и затем, когда клавишу отпускают, огибающая входит в последний режим – освобождение.
Также используется частотная модуляция, которая, по сути, задает изменение частоты сигнала, ближайшим аналогом которого в музыке является вибрато (англ. vibrato). В синтезаторах обычно реализуется не совсем честная частотная модуляция. Посредством простого смещения аргумента в осцилляторе достигается схожий эффект (такую модуляцию можно, скорее, назвать фазовой).
В более общем плане модулировать можно все что угодно, например, длительность линии задержки, фазу эффектов фейзер или фланжер (подробней об этом – далее). Для модуляции можно использовать не только простые волны, но и их комбинации. Несмотря на свою простоту, модуляция – одно из основных понятий синтезирования звука в целом.
#dsp, #filter, #fir, #iir, #soft synth, #ачх, #бих, #ких, #синтез звука, #фчх
26 января 2014 (Обновление: 22 фев 2014)
Комментарии [7]