Два источника по отдельности могут звучать без перегрузки, а вместе дать слишком большой уровень. Например, два отсчёта (sample)отсчёт (sample) — Значение сигнала в один момент дискретизации, одно число. В звукозаписи его также называют сэмплом. по 0,8 складываются в 1,6. Чтобы собрать несколько генераторов в синтезатор, нужно выбрать уровень каждого источника, сложить их отсчёты и оставить место для пиков.
Микширование (mixing)микширование (mixing) — Суммирование аудиосигналов с независимо выбранными коэффициентами усиления источников. здесь означает суммирование (summation)суммирование (summation) — Сложение значений выражения при переборе указанных индексов. Например, сумма x[n] от n = 0 до N−1 включает ровно N отсчётов. сигналов с независимо заданными коэффициентами усиления. Панорамирование (panning)панорамирование (panning) — Распределение сигнала между каналами воспроизведения для изменения положения слухового образа. В обычном стерео меняет вклад в L и R., преобразование частоты дискретизации (sample rate)частота дискретизации (sample rate) — Число отсчётов в каждом канале за одну секунду, то же число кадров аудиоданных в секунду. Измеряется в герцах: 44 100 Гц означает 44 100 отсчётов на канал в секунду. и устройство голосов синтезатора (synth voice)голос синтезатора (synth voice) — Набор генераторов и обработки, который звучит одной нотой: источники, микшер, фильтр, усилитель и огибающая. Одноголосный синтезатор играет одну ноту одновременно. разбираются отдельно.
Рабочий сигнал: от байтов к float
Отсчётотсчёт (sample) — Значение сигнала в один момент дискретизации, одно число. В звукозаписи его также называют сэмплом. — значение одного канала в один момент дискретизации (sampling)дискретизация (sampling) — Измерение непрерывного сигнала через равные промежутки времени: вместо функции времени сохраняется последовательность отсчётов.. В файле оно закодировано по правилам формата; внутри обработчика удобно использовать представление отсчётов с плавающей точкой (floating-point sample representation)представление отсчётов с плавающей точкой (floating-point sample representation) — Хранение значений отсчётов в числовом формате со знаком, значащей частью и показателем степени. Номинальную полную шкалу аудио обычно принимают за ±1, но сам формат позволяет хранить значения за её пределами., обычно float. Разделим обязанности:
| Слой | Что определяет | Пример |
|---|---|---|
| WAV и кодирование отсчётов | Описание формата, порядок байтов и каналов | 16-битный integer PCM: FF 7F означает 32767 |
| C++ | Типы, преобразования, точность и правила арифметики | float допускает дроби; приведение к целому само не ограничивает диапазон |
| Аудиологика | Масштаб, усиление, сумму и подготовку выхода | Разделить код на 32768, умножить на gain, сложить источники |
WAV (WAVE file)WAV-файл (WAVE file) — Звуковой файл со структурой RIFF и типом формы WAVE. Чанк fmt описывает параметры звука, чанк data содержит отсчёты; обычно это несжатый PCM. — контейнер: он может содержать целочисленный PCM (pulse-code modulation, PCM)импульсно-кодовая модуляция (pulse-code modulation, PCM) — Представление сигнала последовательностью квантованных отсчётов, взятых через равные промежутки времени. В WAV код формата 1 означает PCM с целыми отсчётами., отсчёты с плавающей точкой и другие кодирования. Поэтому декодер сначала читает описание формата. Расположение данных объясняет статья о WAV, а отдельные целые коды — статья о PCM.
Для знакового 16-битного PCM выберем масштаб 32768. Пример C++17 предполагает, что байты уже прочитаны в допустимый std::int16_t:
#include <cstdint>
float pcm16ToFloat (std::int16_t sample) noexcept
{
return static_cast<float> (sample) / 32768.0f;
}Код 16384 становится 0,5; −32768 — −1; 32767 — примерно 0,9999695. При этом соглашении положительная граница чуть ниже +1. Перевод меняет представление, но не восстанавливает точность, потерянную при исходном квантовании (quantization)квантование (quantization) — Замена значения отсчёта одним из конечного набора представимых уровней. Разность между выбранным уровнем и исходным значением называется ошибкой квантования..
Номинальную полную шкалу (full scale)полная шкала (full scale) — Опорная граница уровня выбранного аудиоформата или тракта. Для нормированных аудиоотсчётов обычно принята за ±1; числовой формат с плавающей точкой способен хранить значения за этой границей. рабочего сигнала принимаем за −1…+1. Это соглашение аудиотракта: сам float способен представить 1,6 и −2. Значения больше единицы по модулю можно сохранить внутри линейных вычислений и ослабить позже. Нужно знать границы следующего участка: целочисленного файла, устройства или обработчика, который уже ограничивает либо нелинейно преобразует сигнал.
Обратный путь требует отдельной политики: проверить конечность числа, ограничить диапазон, масштабировать, округлить и ограничить целую шкалу до приведения типа. При +1 умножение на 32768 даёт 32768, а максимум int16_t — 32767. Готовый код и граничные случаи разобраны в разделе об обратной записи; здесь используем этот путь после микширования.
Усиление одного источника
Линейное усиление (linear gain)линейный коэффициент усиления (linear gain) — Безразмерный множитель аудиосигнала: 1 сохраняет амплитуду, значение между 0 и 1 уменьшает её, значение больше 1 увеличивает. Отрицательный множитель также меняет знак сигнала. — коэффициент, на который умножается каждый отсчёт (Smith, глава 5.3). При постоянном коэффициенте действует формула (1).
- номер кадра; далее рассматриваем один канал;
- ,
- входной и выходной отсчёты, без единиц измерения;
- линейный коэффициент усиления, без единиц измерения.
При g = 0 получается тишина, при g = 1 отсчёты сохраняются. Коэффициент 0,5 уменьшает амплитуду (amplitude)амплитуда (amplitude) — Наибольший модуль отклонения колеблющейся величины от равновесного значения. Для синусоиды обозначается A; единицы совпадают с единицами сигнала. вдвое, 2 — увеличивает вдвое. Например, 0.0f, 0.5f, -0.5f после умножения на 0,5 превращаются в 0.0f, 0.25f, -0.25f. В C++ суффикс f обозначает литерал типа float.
Коэффициент −1 меняет полярность (polarity): положительные значения становятся отрицательными и наоборот. Для синусоиды это равнозначно сдвигу на 180°; для произвольной формы волны смена знака не обязательно совпадает со сдвигом во времени на половину периода (period)период (period) — Время одного полного повторения периодического колебания. Обозначается T, измеряется в секундах и связано с частотой как T = 1/f..
Уменьшение амплитуды вдвое соответствует изменению уровня примерно на −6,02 дБ. Воспринимаемая громкость (loudness)громкость (loudness) — Ощущение того, насколько сильным кажется звук. Зависит от звукового давления, частотного состава и условий восприятия. зависит также от частотного состава и условий прослушивания. Перевод gain в децибелы уже разобран в математической справке.
Два источника: сначала уровни, затем сумма
Пусть источники имеют одинаковую частоту дискретизации и их кадры сопоставлены по времени. Каждый источник сначала умножается на свой коэффициент, затем вклады складываются по формуле (2). Сложение сигналов — основная операция линейной обработки (Smith, глава 5.2).
- ,
- отсчёты первого и второго источников одного канала в одном кадре;
- ,
- независимые коэффициенты усиления источников;
- отсчёт общей суммы до ограничения выхода.
Если x1 = 0.8, x2 = 0.4, g1 = 0.5, g2 = 0.25, то первый вклад равен 0,4, второй — 0,1, результат — 0,5. Изменяя g1, мы меняем только первый вклад. Общий коэффициент после суммы меняет оба сразу и сохраняет выбранное соотношение.
Ниже самостоятельная функция C++17 для одного канала. Все три массива должны содержать не менее count элементов, выход не должен перекрываться с входами, значения и коэффициенты должны быть конечными и разумными по величине. Нулевой count допустим. Вычисления не выделяют память.
#include <cstddef>
void mixTwo (const float* first, const float* second,
float* output, std::size_t count,
float gain1, float gain2) noexcept
{
for (std::size_t n = 0; n < count; ++n)
output[n] = gain1 * first[n] + gain2 * second[n];
}Здесь каждый выходной элемент перезаписывается. Если вместо этого накапливать источники через output[n] += ..., выход нужно обнулить один раз перед всеми источниками. Очистка перед каждым источником стирает предыдущие; отсутствие очистки примешивает старое содержимое буфера.
Для стерео (stereo)стерео (stereo) — Аудиоформат с двумя каналами, обычно левым и правым. Кадр несжатых стереоданных содержит два отсчёта одного момента времени. ту же операцию выполняют отдельно над L и R, с общей временной шкалой кадров. Складывать L с R ради получения моно (mono)моно (mono) — Аудиоформат с одним каналом. Кадр несжатых монофонических данных содержит один отсчёт. — другое преобразование. Если частоты дискретизации различаются, одинаковые индексы ещё не обозначают одинаковое время: сначала потребуется передискретизация.
Фаза: сумма может расти и уменьшаться
Для двух синусоид одной частоты (frequency)частота (frequency) — Число полных колебаний за секунду. Обозначается f и измеряется в герцах; 1 Гц означает одно колебание в секунду. результат зависит от разности фаз (phase)фаза (phase) — Положение внутри периода колебания, выраженное углом: полный период соответствует 360°, или 2π радиан. Начальная фаза — её значение в момент t = 0.. При совпадении фаз положительные и отрицательные отклонения совпадают по времени: такое сложение называют конструктивным (constructive interference). В противофазе отклонения направлены в разные стороны — сложение деструктивное (destructive interference). Сумма остаётся синусоидой той же частоты, хотя её амплитуда и начальная фаза могут измениться (Julius O. Smith, Sinusoids at the Same Frequency).
Если амплитуда каждого после усиления равна 0,5, то:
- при 0° сумма имеет амплитуду 1;
- при 90° — примерно 0,7071: пики источников не совпадают;
- при 180° отсчёты противоположны и полностью компенсируются;
- при 360° результат тот же, что при 0°.
В противофазе с амплитудами 0,8 и 0,5 останется синусоида амплитудой 0,3. Полное исчезновение требует равных противоположных вкладов в каждом кадре. Два разных инструмента обычно не выполняют это условие; сложение не гарантирует ни удвоения, ни уменьшения уровня.
В визуализации 1 источники имеют исходную амплитуду 1. Начальные коэффициенты — 0,5 и 0,5, фаза — 0°. Поменяйте фазу на 90° и 180°, затем нажмите «Перегрузка»: коэффициенты станут 0,8, фаза — 0°. Пунктир из точек показывает, что получилось бы при ограничении суммы до ±1. «Сбросить» возвращает все три исходных параметра.
- g₁x₁
- g₂x₂
- сумма
- после ограничения
- полная шкала ±1
Амплитуда суммы: 1,000 (0,00 дБ относительно 1). Сумма помещается в ±1; ограниченная линия совпадает с ней.
Параметры работают с включённым JavaScript. Показано начальное состояние.
График рисует идеальные синусоиды на протяжении двух периодов. Амплитуда в статусе вычисляется по формуле для всей синусоиды. У настоящего блока максимум отсчётов может быть ниже этой амплитуды, если вершина лежит между ними. Формула амплитуды и расчёт для 90° приведены в математической справке.
Запас уровня и распределение усиления
Запас уровня (headroom)запас уровня (headroom) — Расстояние от текущего или ожидаемого пикового уровня до предела выбранного участка аудиотракта. Обычно выражается в децибелах. — расстояние от текущего или ожидаемого пика до предела выбранного участка тракта. Если предел соответствует 1, а пик равен 0,5, запас составляет примерно 6,02 дБ. При пике 0,8 остаётся около 1,94 дБ; при 1 запаса нет. Это именно пиковая оценка: низкий RMS (RMS level)среднеквадратичный уровень (RMS level) — Корень из среднего квадрата значений сигнала на выбранном интервале. Имеет те же единицы, что и сигнал; у синусоиды за целое число периодов равен амплитуде, делённой на √2. сам по себе не защищает от короткого большого пика.
Два совпадающих пика по 0,8 дают 1,6. Усиление каждого источника на 0,5 превращает вклады в 0,4 и 0,4, а сумму — в 0,8. Отношение источников сохранилось, до ±1 осталось место.
Можно получить ту же сумму общим усилением 0,5 после линейного сложения, если промежуточные 1,6 нигде не обрезались. Но если между суммой и ослаблением расположен целочисленный буфер, жёсткое ограничение или другой нелинейный обработчик, результат уже может измениться. Распределение усиления по тракту (gain staging)распределение усиления по тракту (gain staging) — Выбор уровней на отдельных этапах аудиотракта с учётом пиков, запаса и допустимого диапазона каждого этапа. означает выбор уровней на отдельных этапах с учётом этих границ.
Для двух источников, каждый из которых не превышает 1 по модулю, действует консервативная оценка из математической справки:
Следовательно, |g1| + |g2| ≤ 1 достаточно, чтобы идеальная сумма не вышла за ±1 при любых сочетаниях отсчётов. Для трёх источников аналогично складывают модули трёх коэффициентов. В реальных вычислениях оставляют небольшой запас и учитывают округление (rounding)округление (rounding) — Замена числа ближайшим допустимым значением, например ближайшим целым для round. Выбор при равном расстоянии до двух значений определяется отдельным соглашением..
Сумма может поместиться в ±1 и при больших коэффициентах. Например, при g1 = g2 = 0.8 два одинаковых противофазных источника дают ноль. Использовать такую компенсацию как постоянную защиту опасно: достаточно изменить фазу или один источник, чтобы пик вырос. Деление на число источников даёт эту гарантию для входов в ±1. Соотношение уровней инструментов в миксе выбирают с учётом их звучания.
Реализация с juce::AudioBuffer
Пример использует JUCE 9.0.3, C++17 и модуль juce_audio_basics. Три буфера заранее подготовлены с одинаковым числом каналов и кадров, с согласованными назначениями каналов; выход имеет отдельную память и не перекрывается с источниками. Частота дискретизации и временное выравнивание проверяются вызывающим кодом: сам AudioBuffer их не хранит.
#include <juce_audio_basics/juce_audio_basics.h>
void mixBuffers (const juce::AudioBuffer<float>& first,
const juce::AudioBuffer<float>& second,
juce::AudioBuffer<float>& output,
float gain1, float gain2) noexcept
{
jassert (&output != &first && &output != &second);
jassert (first.getNumChannels() == output.getNumChannels());
jassert (second.getNumChannels() == output.getNumChannels());
jassert (first.getNumSamples() == output.getNumSamples());
jassert (second.getNumSamples() == output.getNumSamples());
output.clear();
const int count = output.getNumSamples();
for (int channel = 0; channel < output.getNumChannels(); ++channel)
{
output.addFrom (channel, 0, first, channel, 0, count, gain1);
output.addFrom (channel, 0, second, channel, 0, count, gain2);
}
}clear() обнуляет выход, addFrom() добавляет выбранный участок источника с его коэффициентом. Исходные буферы сохраняются. Общее усиление после микширования можно применить через output.applyGain (masterGain). Эти операции не ограничивают результат до ±1 (исходники JUCE 9.0.3).
jassert сообщает о нарушении условий при отладке. В release-сборке вызывающий код должен обеспечить допустимые размеры буферов (buffer size)размер буфера (buffer size) — Длина или вместимость аудиобуфера в единицах конкретного API. В настройках аудиодрайвера обычно означает число кадров, то же число отсчётов на канал. Объём в байтах зависит также от числа каналов и формата отсчёта., расположение памяти и значения gain. Нельзя передать один выходной буфер как источник: очистка уничтожит нужные отсчёты. Разные объекты тоже могут ссылаться на общую память, поэтому сравнения адресов объектов недостаточно.
В аудиоколбэке (audio callback)аудиоколбэк (audio callback) — Функция, которую аудиосистема вызывает для передачи очередного блока входных данных и получения выходных. Обработчик должен завершиться до срока, когда нужны данные. функция использует готовую память; чтение файла и изменение размеров буферов выполняют заранее. Коэффициенты в этом примере постоянны внутри блока. При изменении регулятора во время звучания их следует плавно менять, например через juce::SmoothedValue, чтобы скачок уровня не создавал щелчок; реализация такого управления выходит за рамки примера.
Ограничение выхода и клиппинг
Если сумма выходит за допустимый диапазон и превышения заменяются крайними значениями, возникает клиппинг (clipping)клиппинг (clipping) — Ограничение значений сигнала крайними допустимыми уровнями при выходе за диапазон. Срезает вершины волны и создаёт искажения.: вершины срезаются. Для выбранного предела ±1 жёсткое ограничение (hard clipping) заменяет 1,6 на 1, а −1,6 на −1. Оно меняет форму волны и необратимо объединяет разные входные значения в одно (Julius O. Smith, Clipping Nonlinearity).
Сравним две цепочки на отсчёте 1,6. Линейное ослабление на 0,5 даёт 0,8. Ограничение до 1 с последующим ослаблением на 0,5 даёт 0,5. Утраченные вершины уже не восстанавливаются простым снижением gain.
Предохранительное ограничение итогового конечного отсчёта перед кодированием можно записать так:
#include <algorithm>
float boundOutput (float sample) noexcept
{
return std::clamp (sample, -1.0f, 1.0f);
}Предусловие — конечное число: NaN требует отдельной обработки. Эта функция задаёт только предел рабочего значения. Для записи в integer PCM остаются масштабирование, округление, ограничение целой шкалы и упаковка байтов из статьи о PCM. Политика преобразования JUCE может отличаться от собственного кодера, в том числе на крайних кодах.
Ограничивать каждый источник до сложения — значит менять его отдельно. Например, вклады 1,2 и −0,4 без промежуточного ограничения дают 0,8, а после ограничения первого до 1 — 0,6. Поэтому защиту формата ставят на соответствующей границе, сохраняя линейные промежуточные результаты там, где это допустимо.
Если защита постоянно срезает пики, нужно пересмотреть уровни источников и общей суммы. Лимитер (limiter)лимитер (limiter) — Устройство, которое не пропускает сигнал выше заданного уровня — потолка. По статической характеристике это компрессор с бесконечной степенью сжатия; границу гарантируют пиковый детектор и предварительный анализ. управляет усилением сигнала в зависимости от его уровня; clamp просто заменяет значения за границей диапазона крайними. При восстановлении волны её пики между отсчётами могут превышать ±1, даже если сами отсчёты помещаются в этот диапазон. Такие пики требуют отдельной оценки.
Новые частоты после среза
Пока сумма не выходит за предел, микширование линейно: результат для суммы источников равен сумме результатов для каждого из них. Поэтому в выходе нет частот, которых не было во входах: меняются только амплитуды и фазы составляющих. Срез нарушает это свойство, и в спектре появляются новые составляющие (Zölzer, «Digital Audio Signal Processing», §10.1, с. 341).
У одной синусоиды срез добавляет гармоники, кратные её частоте, а симметричный срез — только нечётные (статья о лимитере). Тон при этом сохраняет высоту и становится ярче. У суммы нескольких тонов появляются ещё и интермодуляционные составляющие (intermodulation) на сочетаниях частот с целыми и (там же, с. 342–343).
Возьмём два источника, как в начале статьи: синусоиды C4 (261,63 Гц) и E4 (329,63 Гц) с амплитудой 0,8 каждая. По отдельности они помещаются в ±1, сумма доходит до 1,6, и clamp срезает 26,5 % отсчётов. Таблица 2 перечисляет составляющие результата ниже 1 кГц. Самые сильные новые составляющие слабее исходных тонов всего на 19 дБ. Две из них, 193,63 и 397,63 Гц, ближе всего к исходным тонам. Они не входят в гармонический ряд ни C4, ни E4 и не совпадают с нотами: 193,63 Гц лежит между F♯3 (185 Гц) и G3 (196 Гц), а 397,63 Гц на 5,6 Гц выше G4.
| Частота, Гц | Сочетание | Уровень, дБ |
|---|---|---|
| 57,63 | 3 · E4 − 4 · C4 | −37 |
| 125,63 | 2 · E4 − 3 · C4 | −36 |
| 193,63 | 2 · C4 − E4 | −19 |
| 261,63 | C4 | 0 |
| 329,63 | E4 | 0 |
| 397,63 | 2 · E4 − C4 | −19 |
| 465,63 | 3 · E4 − 2 · C4 | −36 |
| 533,63 | 4 · E4 − 3 · C4 | −37 |
| 648,89 | 5 · C4 − 2 · E4 | −39 |
| 784,89 | 3 · C4 | −26 |
| 852,89 | 2 · C4 + E4 | −19 |
| 920,89 | C4 + 2 · E4 | −19 |
| 988,89 | 3 · E4 | −26 |
Новые составляющие ниже 600 Гц идут с шагом в разность частот тонов, 68 Гц, но самой частоты 68 Гц в результате нет. Её дало бы сочетание с чётной суммой , а симметричный срез одинаково обходится с положительными и отрицательными значениями и таких сочетаний не создаёт, как не создаёт и чётных гармоник.
Чем больше нот в сумме, тем плотнее набор таких составляющих. Поэтому намеренные искажения обычно применяют к отдельным нотам или к аккордам из немногих нот, например к квинтам на электрогитаре (power chords) (там же, с. 343). У квинты C4 + G4 два ближайших сочетания, 131,26 и 522,37 Гц, оказываются меньше чем в 1 Гц от C3 и C5. Темперированная квинта близка к отношению частот 3:2, а при точном 3:2 эти сочетания совпали бы с C3 и C5.
В цифровом срезе гармоники и сочетания выше ещё и отражаются вниз: происходит наложение спектров (aliasing)наложение спектров (aliasing) — Наложение частотных составляющих при дискретизации: разные непрерывные сигналы дают одинаковые отсчёты. Частота выше границы Найквиста может проявиться как более низкая., как показано в статье о лимитере. Отражения ослабляет передискретизация (oversampling)передискретизация (oversampling) — Работа с частотой дискретизации выше необходимой для полезной полосы. В АЦП уменьшает долю шума квантования в полезной полосе и смягчает требования к входному фильтру, в ЦАПе отодвигает спектральные копии. Новых сведений об исходном звуке не добавляет.: сигнал переводят на частоту в раз выше, срезают, убирают фильтром всё выше исходной и возвращаются к исходной частоте. Чем больше , тем дальше граница отражения и тем слабее гармоники, которые за неё уходят. Объём вычислений растёт вместе с , поэтому его не делают сколь угодно большим (Zölzer, §10.4, с. 350–351). Другой способ — метод антипроизводной (antiderivative antialiasing): вместо значения функции среза в отсчёте берут её среднее на отрезке между соседними входными отсчётами (там же, с. 351–352). Как и PolyBLEP из статьи об осцилляторах, он получает поправку интегрированием, а не повышением частоты дискретизации.
Для предохранителя на выходе всё это — ещё один довод в пользу запаса уровня. Передискретизация и метод антипроизводной нужны эффектам, которые срезают сигнал намеренно.
Самопроверка
Два источника дают в одном кадре 0,75 и 0,5. Коэффициенты равны 0,8 и 0,4. Какой получится отсчёт?
. Хотя сумма коэффициентов больше 1, этот конкретный кадр помещается в полную шкалу. Гарантии для всех возможных входов нет.
Почему два одинаковых источника с gain 0,5 не всегда дают амплитуду 1?
Результат зависит от их относительной фазы. При совпадении фаз амплитуда равна 1, при 90° — примерно 0,7071, при противофазе вклады полностью компенсируются.
В float сохранился пик 1,6. Можно ли получить 0,8 общим усилением 0,5? А если пик уже ограничили до 1?
До ограничения — да, если промежуточный тракт сохранил форму сигнала. После ограничения получится 0,5: линейное ослабление не возвращает срезанную вершину.
Синусоиды 1000 и 1100 Гц складываются, и сумма симметрично срезается. Появится ли составляющая 100 Гц? Какие новые частоты окажутся ближе всего к исходным?
Нет: 100 Гц — сочетание с чётной суммой , а симметричный срез таких не создаёт. Ближе всего окажутся Гц и Гц. Дальше с тем же шагом 100 Гц идут 800 и 1300 Гц.
Источники
- Smith S. W. The Scientist and Engineer’s Guide to Digital Signal Processing. Гл. 5.2: Requirements for Linearity. в списке литературы → — масштабирование и сложение сигналов.
- Smith S. W. The Scientist and Engineer’s Guide to Digital Signal Processing. Гл. 5.3: Static Linearity and Sinusoidal Fidelity. в списке литературы → — постоянное усиление и линейная обработка.
- Smith J. O. III. Physical Audio Signal Processing for Virtual Musical Instruments and Audio Effects. Clipping Nonlinearity. в списке литературы → — жёсткое ограничение и его необратимость.
- Zölzer U. Digital Audio Signal Processing. §10.1–10.2, с. 341–343; §10.4, с. 350–352. в списке литературы → — линейность и новые частоты на выходе нелинейной обработки, плотный спектр при срезе аккорда, квинты при намеренных искажениях, наложение спектров при срезе, передискретизация и метод антипроизводной.
- Smith J. O. III. Mathematics of the Discrete Fourier Transform (DFT) with Audio Applications. Sinusoids at the Same Frequency. в списке литературы → — сложение синусоид одной частоты; авторская версия на DSPRelated.
- JUCE 9.0.3. AudioSampleBuffer — очистка буфера, добавление источника с усилением и изменение общего уровня:
clear,addFrom,applyGain.
Связи
Связи списком
Ссылается на
- Звук в пространстве: панорама, задержка, реверберация и мид-сайд
- Математика для аудио
- Осцилляторы синтезатора: формы, расстройка и саб-осциллятор
- Принцип работы лимитера
- Устройство WAV-файла: RIFF, чанки, fmt и data
- Целочисленный PCM: байты, знак и перевод во float
- Dry/wet и bypass: исходный и обработанный сигнал в плагине
Ссылаются сюда
- Белый и розовый шум: спектр и генерация
- Война громкости: от компакт-диска до нормализации
- Звук в пространстве: панорама, задержка, реверберация и мид-сайд
- Как устроен звук: первый обзор
- Математика для аудио
- Осцилляторы синтезатора: формы, расстройка и саб-осциллятор
- Первое знакомство с DAW: дорожки, MIDI и звук
- Принцип работы лимитера
- Уровень в цифровой студии: индикатор OVER, опорные уровни и K-система
- Dry/wet и bypass: исходный и обработанный сигнал в плагине