Белый и розовый шум: спектр и генерация

Чем отличаются белый и розовый шум и как сделать воспроизводимый шумовой источник на C++/JUCE?

Опубликовано 13 мин чтения

В треках:Программист, этап 5

Синусоида повторяет одну форму через каждый период (period)период (period) — Время одного полного повторения периодического колебания. Обозначается T, измеряется в секундах и связано с частотой как T = 1/f.. Шум меняется так, что у обычного фрагмента нет одного повторяющегося цикла. В синтезаторе такой источник может дать шипение, дыхание или основу ударного звука: генератор создаёт отсчёты (sample)отсчёт (sample) — Значение сигнала в один момент дискретизации, одно число. В звукозаписи его также называют сэмплом., а усиление, фильтр и огибающая (envelope)огибающая (envelope) — Плавная кривая, которая следует за размахом волны и показывает, как уровень сигнала меняется во времени. определяют результат.

Белый (white noise)белый шум (white noise) — Шум с постоянной спектральной плотностью мощности в рассматриваемой полосе. Полосы одинаковой ширины в герцах содержат одинаковую ожидаемую мощность. и розовый шум (pink noise)розовый шум (pink noise) — Шум, PSD которого приблизительно обратно пропорциональна частоте в рабочей полосе: спад около 3 дБ на октаву и примерно одинаковая мощность октав. различаются распределением мощности по частотам (frequency)частота (frequency) — Число полных колебаний за секунду. Обозначается f и измеряется в герцах; 1 Гц означает одно колебание в секунду.. Это статистическое свойство: конкретный фрагмент всегда немного отклоняется от ожидаемых значений.

Непериодический сигнал и псевдослучайные числа

У шумового сигнала (noise signal)шумовой сигнал (noise signal) — Сигнал со случайными или псевдослучайными изменениями; обычный фрагмент не имеет одной повторяющейся периодической формы. нет определённой периодической формы. Физический источник, например тепловые флуктуации в электрической цепи, получает случайные изменения из самого процесса. Программа обычно использует генератор псевдослучайных чисел (pseudorandom number generator, PRNG)генератор псевдослучайных чисел (pseudorandom number generator, PRNG) — Детерминированный алгоритм, который по текущему состоянию выдаёт следующее число и обновляет состояние. Одинаковое начало и порядок вызовов воспроизводят последовательность.: вычисляет следующее число по алгоритму и текущему состоянию.

Детерминированность удобна: можно повторить звук, сравнить две реализации или воспроизвести ошибку. Но последовательность не является физически случайной. У PRNG с конечным числом состояний состояние со временем повторяется, а вместе с ним повторяется последовательность. Поэтому «непериодический шум» здесь — модель и описание слышимого фрагмента, а не обещание бесконечно неповторяющихся чисел (Smith, Digital Noise Generation).

Для генерации нужно хранить собственный объект PRNG. Новый объект с прежним seed перед каждым отсчётом или аудиоблоком будет снова начинать последовательность; часы не превращают такой перезапуск в хороший шумовой источник.

Seed: как повторить результат

Начальное состояние (seed)начальное состояние генератора (seed) — Значение, задающее начало псевдослучайной последовательности. Воспроизводимость требует той же реализации и того же порядка вызовов., или seed, задаёт начало последовательности. Два генератора одной реализации с одинаковым seed дают одинаковые числа, если их вызывать одинаковое число раз и в одинаковом порядке. Один дополнительный вызов сдвигает дальнейший поток.

В JUCE для этого есть конструктор juce::Random (seed) и setSeed (seed). Конструктор без аргумента выбирает seed из меняющихся системных свойств; это всё ещё PRNG. Для примеров и проверок возьмём собственный juce::Random с явно заданным seed, а не общий getSystemRandom() (документация Random).

У getSeed() возвращается текущее состояние PRNG, а не обязательно значение, переданное при создании. Для воспроизведения с начала сохраните исходный seed отдельно. Для продолжения с середины розового шума одного состояния PRNG мало: понадобятся также сохранённые значения и счётчик его алгоритма.

Воспроизводимость относится к зафиксированной реализации. Изменение алгоритма, числа рядов розового генератора или арифметики может изменить результат даже при прежнем seed. Примеры ниже проверены с JUCE 9.0.3, C++20 и обычной арифметикой без fast-math.

Равномерные отсчёты и белый генератор

При равномерном распределении (uniform distribution)равномерное распределение (uniform distribution) — Распределение, в котором интервалы значений одинаковой ширины имеют одинаковую вероятность. Не определяет временные связи между отсчётами. интервалы значений одинаковой ширины имеют одинаковую вероятность (probability)вероятность (probability) — Число от 0 до 1, описывающее возможность события в заданной модели. Не обещает точную долю события в короткой серии опытов.. Например, у идеального распределения от −1 до +1 попадание в −0,8…−0,6 так же вероятно, как в 0,2…0,4. Это описание значений отдельных отсчётов; оно ещё ничего не говорит об их порядке во времени.

juce::Random::nextFloat() возвращает число uu от 0 включительно до 1 не включительно. Преобразование x=2u−1x=2u-1 сдвигает его в диапазон [−1,1)[-1,1). Номинальная аудиошкала остаётся ±1, но код не обещает получить +1. Числа float образуют конечный набор: непрерывное равномерное распределение служит моделью, а не буквальным перечнем машинных значений. В JUCE 9.0.3 верхний результат дополнительно ограничен ниже 1 (исходник Random).

Самостоятельный класс требует модуля juce::juce_core:

C++
// Один объект сохраняет состояние PRNG между отсчётами.
#include <juce_core/juce_core.h>

class WhiteNoise
{
public:
    explicit WhiteNoise (juce::int64 seed) noexcept : random (seed) {}

    void reset (juce::int64 seed) noexcept { random.setSeed (seed); }

    float nextSample() noexcept
    {
        return 2.0f * random.nextFloat() - 1.0f;
    }

private:
    juce::Random random;
};

Вызов WhiteNoise noise (2026); создаёт источник. Каждый noise.nextSample() выдаёт следующее значение. noise.reset (2026) повторяет последовательность с начала. Частота дискретизации (sample rate)частота дискретизации (sample rate) — Число отсчётов в каждом канале за одну секунду, то же число кадров аудиоданных в секунду. Измеряется в герцах: 44 100 Гц означает 44 100 отсчётов на канал в секунду. задаётся тем, как часто потребитель вызывает генератор; у белого источника нет частоты основного тона.

Что означает «белый» спектр

Белый шумбелый шум (white noise) — Шум с постоянной спектральной плотностью мощности в рассматриваемой полосе. Полосы одинаковой ширины в герцах содержат одинаковую ожидаемую мощность. имеет приблизительно постоянную спектральную плотность мощности (power spectral density, PSD)спектральная плотность мощности (power spectral density, PSD) — Распределение мощности сигнала на единицу частоты. Для безразмерных отсчётов измеряется в 1/Гц; мощность полосы соответствует площади под графиком PSD., PSD. Эта величина описывает мощность на единицу частоты. Для безразмерных отсчётов единица PSD — 1/Гц1/\text{Гц}; «мощностью сигнала» называем средний квадрат, а не электрические ватты.

У белого шума полосы 100–600 Гц и 10 000–10 500 Гц одинаково широки — 500 Гц — и в среднем содержат одинаковую мощность. За одинаковое время это означает одинаковую энергию. В цифровой модели рассматриваем полосу до половины частоты дискретизациичастота дискретизации (sample rate) — Число отсчётов в каждом канале за одну секунду, то же число кадров аудиоданных в секунду. Измеряется в герцах: 44 100 Гц означает 44 100 отсчётов на канал в секунду.; акустический выход дополнительно зависит от ЦАП (digital-to-analog converter, DAC)ЦАП (digital-to-analog converter, DAC) — Цифро-аналоговый преобразователь: устройство, которое получает цифровые отсчёты и формирует соответствующий им аналоговый электрический сигнал. и тракта (Whittle, характеристики шума).

Для такого спектра (spectrum)спектр (spectrum) — Представление сигнала через его частотные составляющие: их частоты, амплитуды и фазы. Ограничение спектра задаёт, какие частоты допускаются в сигнале. нужны подходящие связи между отсчётами: в идеальной белой модели с нулевым средним значения в разные моменты некоррелированы, то есть не имеют линейной статистической связи. Это более слабое условие, чем статистическая независимость (statistical independence)статистическая независимость (statistical independence) — Знание значения одной случайной величины не меняет вероятностей значений другой. Это более сильное условие, чем отсутствие линейной корреляции.. Равномерные числа хорошего PRNG приближают эту модель. Само равномерное распределение белизну не гарантирует: если каждое случайное число повторять тысячу раз подряд, гистограмма (histogram)гистограмма (histogram) — График числа наблюдений в интервалах значений. Показывает распределение значений, но не сохраняет их порядок во времени. может остаться примерно равномерной, но появятся медленные ступени и изменится спектр. Белый шум также может иметь другое распределение амплитуд (amplitude)амплитуда (amplitude) — Наибольший модуль отклонения колеблющейся величины от равновесного значения. Для синусоиды обозначается A; единицы совпадают с единицами сигнала., например нормальное.

Гистограммагистограмма (histogram) — График числа наблюдений в интервалах значений. Показывает распределение значений, но не сохраняет их порядок во времени. показывает, сколько отсчётов попало в каждый интервал значений. В отличие от неё, спектр учитывает порядок отсчётов (Julius O. Smith, White Noise).

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

Цветной шум и розовый наклон

У цветного шума (colored noise)цветной шум (colored noise) — Шум, спектральная плотность мощности которого зависит от частоты. Цвет описывает спектральный баланс, а не распределение амплитуд отдельных отсчётов. PSD зависит от частоты. Для розового шумарозовый шум (pink noise) — Шум, PSD которого приблизительно обратно пропорциональна частоте в рабочей полосе: спад около 3 дБ на октаву и примерно одинаковая мощность октав. она приблизительно обратно пропорциональна частоте в рабочей полосе:

S(f)∝1f.S(f) \propto \frac{1}{f}.
S(f)S(f)
спектральная плотность мощности, 1/Гц1/\text{Гц};
ff
положительная частота, Гц;
∝\propto
«пропорционально»: при фиксированной константе зависимость имеет форму C/fC/f.

При удвоении частоты PSD уменьшается вдвое. Её спектральный наклон (spectral slope)спектральный наклон (spectral slope) — Изменение выбранной спектральной величины при изменении частоты; часто выражается в децибелах на октаву. Для PSD и мощности целой полосы наклоны могут различаться. в децибелах (decibel)децибел (decibel) — Логарифмическая единица отношения двух величин: для амплитуд L = 20 lg(A/A₀), для мощностей — 10 lg(P/P₀). Смысл числа задаёт опорная величина. равен 10lg⁡(1/2)≈−3,0110\lg(1/2)\approx-3{,}01 дБ на октаву (octave)октава (octave) — Музыкальный интервал между нотами одного названия в соседних регистрах. Соответствует отношению частот 2:1.. Множитель 10 используется потому, что сравниваем мощности; логарифмическая шкала (logarithmic scale)логарифмическая шкала (logarithmic scale) — Шкала, на которой равные расстояния соответствуют одинаковым отношениям положительных величин. Например, 100, 1000 и 10 000 Гц расположены на равных расстояниях. разобрана в математической справке.

При этом мощность целой октавы остаётся примерно одинаковой. Полоса 1 000–2 000 Гц вдвое шире в герцах, чем 500–1 000 Гц, а PSD на соответствующих частотах вдвое меньше. Эти изменения компенсируются. У белого шума PSD не уменьшается, поэтому каждая следующая октава вдвое мощнее предыдущей — примерно на 3 дБ. Способ суммирования (summation)суммирование (summation) — Сложение значений выражения при переборе указанных индексов. Например, сумма x[n] от n = 0 до N−1 включает ровно N отсчётов. мощности полос объяснён в разделе о плотности.

Идеальную зависимость 1/f1/f нельзя продолжить до нулевой частоты при конечной общей мощности: по мере добавления всё более низких октав мощность продолжает расти. Практический генератор приближает розовый шум в ограниченной полосе; около её границ спектр отклоняется от идеала (Whittle, ограничения и анализ).

Сравнить спектр и звучание

На рис. 1 оба фрагмента отдельно приведены к RMS (RMS level)среднеквадратичный уровень (RMS level) — Корень из среднего квадрата значений сигнала на выбранном интервале. Имеет те же единицы, что и сигнал; у синусоиды за целое число периодов равен амплитуде, делённой на √2. 0,12. Это позволяет сравнивать спектральный баланс при одинаковом среднем квадрате. Их пики и средние значения остаются разными; одинаковый RMS также не гарантирует одинаковую ощущаемую громкость (loudness)громкость (loudness) — Ощущение того, насколько сильным кажется звук. Зависит от звукового давления, частотного состава и условий восприятия..

Визуализация 1Белый и розовый шум: спектр и звучание
Белый и розовый шум: время, PSD и октавы Seed 2026. Сплошная линия — белый шум; пунктир и штриховка — розовый. Белая PSD примерно горизонтальна; розовая убывает. Мощность октав белого шума растёт, розового — примерно одинакова. Измерения конечного фрагмента колеблются. Отсчёты во времени −0,500,5 02,65 мс PSD, дБ относительно 1/Гц −80−65−50−35−20 1255002к8к16к Частота, Гц Мощность октавы, дБ к общей −30−20−1001252505001к2к4к8к Нижняя граница октавы, Гц
  • Белый: сплошная линия
  • Розовый: пунктир и штриховка

Seed 2026. Оба фрагмента: 4 с, 48 кГц, RMS 0,12 (−18,42 dBFS без поправки AES17). Среднее: белый −0,0002, розовый 0,0242. Пик: белый 0,207, розовый 0,540.

PSD усреднена по сегментам с окном Hann: 8 192 отсчёта, перекрытие 50 %. Для линии усредняется мощность на герц в полосах по 1/12 октавы; столбики показывают мощность целой октавы. Среднее фрагмента не удаляется.

Мощность октав числами
Октавные полосы: дБ относительно среднего квадрата всего фрагмента
Полоса, ГцБелый, дБРозовый, дБ
125–250−22,98−12,45
250–500−19,66−12,36
500–1000−16,75−12,22
1000–2000−13,81−12,39
2000–4000−10,86−12,50
4000–8000−7,79−12,83
8000–16000−4,76−13,04
Параметры шумового фрагмента

Прослушивание: 4 секунды выбранного шума. Позиция и громкость меняют только звук плеера, графики выше от них не зависят. Равный RMS не означает равную воспринимаемую громкость. Начните с умеренной громкости устройства.

Плеер шумового фрагмента
0:00,0 / 0:04,0
30 %

Звук доступен при включённом JavaScript.

Показано начальное состояние. Управление и прослушивание доступны при включённом JavaScript.

Рис. 1. Белый и розовый шум при seed 2026 и одинаковом RMS. Сверху первые 128 отсчётов, ниже усреднённая PSD и мощность октав от 125–250 до 8 000–16 000 Гц. Мощность октавы показана относительно среднего квадрата всего фрагмента. Розовый спектр — приближение Voss–McCartney с 16 рядами.

Сначала посмотрите на PSD: белая линия примерно горизонтальна, розовая убывает. Затем на столбики октав: у белого шума они растут, у розового близки друг к другу, с отклонениями алгоритма и конечного измерения. Смена seed меняет фрагмент и измеренные значения, сохраняя общий характер спектра.

Эксперимент использует тот же PRNG JUCE 9.0.3 и тот же алгоритм розового шума, что в листингах, перенесённые в браузер. Звук берётся из рассчитанных отсчётов при 48 кГц; Web Audio при необходимости преобразует частоту под устройство. Для оценки PSD используется усреднение Welch с окном Hann. Плавные края прослушивания по 20 мс и пользовательская громкость не входят в измерения графика (SciPy, Welch).

Розовый генератор Voss–McCartney

Алгоритм Voss–McCartney (Voss–McCartney algorithm)алгоритм Voss–McCartney (Voss–McCartney algorithm) — Приближённая генерация розового шума суммированием случайных значений с разными интервалами обновления; состояние рядов сохраняется между отсчётами. складывает случайные значения, обновляющиеся через разные интервалы. Быстрые ряды дают быстрые изменения, медленные сохраняют значение дольше. Версия McCartney распределяет обновления так, чтобы за обычный шаг менять один сохранённый ряд. Ещё одно независимое псевдослучайное значение добавляется на каждом шаге и улучшает верхнюю часть спектра; она всё равно остаётся неровной (объяснение McCartney).

Для выбора ряда увеличиваем целочисленный счётчик и считаем нули справа в его двоичной записи. У 1 их нет — ряд 0; у 10 один — ряд 1; у 100 два — ряд 2. В C++20 это делает std::countr_zero из <bit>.

Таблица 1. Первые восемь шагов обновления; остальные значения сохраняются
ШагСчётчик в двоичной записиОбновлённый ряд
110
2101
3110
41002
51010
61101
71110
810003

Следующий класс добавить после WhiteNoise. Выбраны 16 рядов, счётчик ограничен 16 битами. При его возврате в ноль сохранённые ряды не обновляем; новый белый компонент всё равно выдаём. Сумму обновляем разностью нового и прежнего значения, не пересчитывая все ряды каждый раз.

C++
// Voss–McCartney: 16 сохранённых рядов и один белый компонент.
#include <array>
#include <bit>
#include <cstdint>

class PinkNoise
{
public:
    explicit PinkNoise (juce::int64 seed) noexcept : white (seed)
    {
        reset (seed);
    }

    void reset (juce::int64 seed) noexcept
    {
        white.reset (seed);
        counter = 0;
        sum = 0.0;
        for (auto& row : rows)
        {
            row = white.nextSample();
            sum += row;
        }
    }

    float nextSample() noexcept
    {
        counter = (counter + 1u) & 0xffffu;
        if (counter != 0u)
        {
            const auto index = std::countr_zero (counter);
            const double next = white.nextSample();
            sum += next - rows[index];
            rows[index] = next;
        }
        return static_cast<float> ((sum + white.nextSample()) / 17.0);
    }

private:
    WhiteNoise white;
    std::array<double, 16> rows {};
    std::uint32_t counter = 0;
    double sum = 0.0;
};

Состояние включает PRNG внутри white, rows, counter и sum. reset восстанавливает всё состояние, в том числе заранее заполняет ряды случайными значениями. Если сбросить только PRNG, сохранив старые ряды, начало последовательности не повторится. Здесь используется один PRNG, выдающий следующие значения для всех рядов и дополнительного компонента; независимость этих значений — приближение модели.

Деление на 17 нормирует сумму 17 ограниченных компонентов: в идеальной арифметике модуль результата не превышает 1. Сумма хранится в double, чтобы уменьшить накопление ошибок; нормирование по границе не является нормированием по RMS.

Самый медленный ряд обновляется раз в 216=65 5362^{16}=65\,536 отсчётов: при 48 кГц это около 1,37 с. Конечное число рядов ограничивает низкочастотное приближение; сверху сказываются удержание значений и белый компонент. Этот код подходит для учебного шумового источника синтезатора. Для измерительного сигнала с заданным допуском PSD нужны отдельные требования к полосе и точности и проверка по ним.

Среднее, DC offset, peak и RMS

Среднее значение (sample mean)среднее значение фрагмента (sample mean) — Сумма значений отсчётов конечного фрагмента, делённая на их число. Может отличаться от математического ожидания порождающего процесса. фрагмента — сумма отсчётов, делённая на их количество. Постоянное смещение сигнала относительно нуля называют постоянной составляющей (DC offset)постоянная составляющая (DC offset) — Постоянное смещение сигнала относительно нуля. Ненулевое среднее короткого фрагмента шума само по себе не доказывает такое смещение генератора., или DC offset. Например, сырые значения nextFloat() сосредоточены около 0,5; преобразование 2u−12u-1 центрирует их около нуля.

У идеального симметричного распределения ожидаемое среднее равно нулю. Но конечный фрагмент обычно имеет небольшое ненулевое среднее. Это само по себе не доказывает постоянное смещение генератора. У розового шума медленные составляющие могут надолго отклонять короткий фрагмент в одну сторону. Разница между ожиданием и измерением разобрана в математической справке.

Не стоит вычитать среднее отдельно из каждого аудиоблока: при смене блока получится новое смещение, а низкие частоты сигнала изменятся. Для конечной записи можно осмысленно удалить среднее всей записи. Для потока, которому действительно требуется подавление DC, используют фильтр с сохраняемым состоянием и выбранной нижней границей; это отдельная обработка.

Пик (peak level)пиковый уровень (peak level) — Уровень наибольшего модуля отсчёта в выбранном фрагменте. В dBFS показывает запас до номинальной полной шкалы; межотсчётные пики здесь не учитываются. — наибольший модуль отсчёта; RMSсреднеквадратичный уровень (RMS level) — Корень из среднего квадрата значений сигнала на выбранном интервале. Имеет те же единицы, что и сигнал; у синусоиды за целое число периодов равен амплитуде, делённой на √2. — корень из среднего квадрата. У идеального равномерного шума в [−A,A][-A,A] ожидаемое среднее равно 0, а средний квадрат равен A2/3A^2/3, поэтому для длинной реализации RMS приближается к A/3A/\sqrt{3}. При A=1A=1 это около 0,577, или −4,77 dBFS (decibels relative to full scale)dBFS (decibels relative to full scale) — Уровень цифрового сигнала в децибелах относительно полной шкалы. Для пиковых значений 0 dBFS соответствует её границе; формат с плавающей точкой допускает значения выше неё. Соглашение об опоре RMS указывают отдельно. в принятом на сайте соглашении без поправки AES17. Конкретные измерения и PRNG дают приближение (Smith, равномерный шум).

У розового генератора распределение выходных значений уже другое: складываются несколько компонентов. Его RMS нельзя вычислять как RMS одного равномерного источника с теми же пределами. Для проверки полезно измерять все три величины на фрагменте, явно задав его длину:

C++
// Измерения непустого массива конечных отсчётов; все накопления в double.
#include <algorithm>
#include <cassert>
#include <cmath>

struct NoiseMetrics { double mean, peak, rms; };

NoiseMetrics measureNoise (const float* samples, int count) noexcept
{
    assert (samples != nullptr && count > 0);
    double sum = 0.0, squares = 0.0, peak = 0.0;
    for (int n = 0; n < count; ++n)
    {
        const double x = samples[n];
        sum += x;
        squares += x * x;
        peak = std::max (peak, std::abs (x));
    }
    return { sum / count, peak, std::sqrt (squares / count) };
}

Запас уровня (headroom)запас уровня (headroom) — Расстояние от текущего или ожидаемого пикового уровня до предела выбранного участка аудиотракта. Обычно выражается в децибелах. оценивают по ожидаемым пикам до конкретной границы тракта. Если ограниченный генератор ослабить до ±0,2, до ±1 останется около 14 дБ. Низкий RMS сам по себе не гарантирует запас. После фильтра, огибающей с усилением или сложения с другими голосами пики нужно оценить заново; правила суммирования есть в микшировании.

Шумовой источник в аудиоблоке JUCE

Генератор хранится в состоянии источника между вызовами process. Пример ниже создаёт моноисточник, копирует один шумовой отсчёт во все каналы каждого кадра и перезаписывает содержимое переданного буфера. Это сохраняет одинаковый сигнал слева и справа. Для независимого стереошума понадобятся отдельные состояния каналов с различной инициализацией; одинаковый seed одной реализации повторит одинаковый поток.

Добавьте класс после двух генераторов. Нужен модуль juce::juce_audio_basics, который подключает и juce_core.

C++
// Выделенный выходной буфер источника; один nextSample на кадр.
#include <juce_audio_basics/juce_audio_basics.h>

enum class NoiseColour { white, pink };

class NoiseSource
{
public:
    void reset (juce::int64 seed) noexcept
    {
        white.reset (seed);
        pink.reset (seed);
    }

    void setColour (NoiseColour value) noexcept { colour = value; }

    void process (juce::AudioBuffer<float>& output) noexcept
    {
        const int channels = output.getNumChannels();
        if (channels == 0)
            return;
        for (int n = 0; n < output.getNumSamples(); ++n)
        {
            const float sample = 0.2f * (colour == NoiseColour::white
                                       ? white.nextSample()
                                       : pink.nextSample());
            for (int channel = 0; channel < channels; ++channel)
                output.setSample (channel, n, sample);
        }
    }

private:
    WhiteNoise white { 2026 };
    PinkNoise pink { 2026 };
    NoiseColour colour = NoiseColour::white;
};

При подготовке источника вызовите reset (2026) и задайте цвет; каждый следующий блок просто передавайте в process. Размер блока может меняться, включая нулевую длину. Генератор выдаёт последовательность на кадр, поэтому обработка 512 кадров сразу и обработка тех же кадров частями дают одинаковый поток. Это тот же принцип сохранения состояния, что у фазового аккумулятора LFO.

В классе оба цвета имеют своё состояние; при переключении ранее использованный цвет продолжает с места остановки. Вызовы смены цвета и сброса должны выполняться согласованно с аудиопотоком (audio thread)аудиопоток (audio thread) — Поток с повышенным приоритетом, который вызывает обработку звука для каждого блока. Каждый вызов должен закончиться до срока блока, поэтому в нём не выделяют память, не берут блокировки и не обращаются к диску., а не параллельно с process. Сам цикл не выделяет память, не читает часы и не берёт блокировки. Выделение буфера и выбор начального seed происходят при подготовке.

Здесь шум остаётся источником: следующая стадия синтезатора может умножить его на огибающую и добавить к другим источникам с собственным усилением. Постоянный коэффициент 0,2 здесь ограничивает пик; в эксперименте выше используется другое действие — нормирование уже готовых фрагментов до равного RMS для сравнения.

Шум синтезатора и TPDF dither

Слышимый шум — часть звука инструмента. Дизеринг (dithering)дизеринг (dithering) — Добавление специально выбранного слабого случайного шума перед квантованием, чтобы ослабить зависимость ошибки квантования от сигнала. Не восстанавливает потерянную точность и меняет отдельные коды. добавляет специально выбранный слабый шум непосредственно перед окончательным квантованием: например, при записи обработанного float в 16-битный PCM (pulse-code modulation, PCM)импульсно-кодовая модуляция (pulse-code modulation, PCM) — Представление сигнала последовательностью квантованных отсчётов, взятых через равные промежутки времени. В WAV код формата 1 означает PCM с целыми отсчётами.. Его масштаб задаётся шагом квантования (quantization step)шаг квантования (quantization step) — Разность между соседними уровнями равномерного квантования. Для диапазона шириной R, разделённого на 2ᴮ равных интервалов, шаг Δ = R/2ᴮ., а не желаемой громкостью инструмента.

У обычного TPDF-дизеринга (triangular probability density function dither, TPDF dither)TPDF-дизеринг (triangular probability density function dither, TPDF dither) — Шум с треугольным распределением амплитуд, добавляемый перед квантованием. В обычной схеме его размах равен двум шагам квантования. распределение амплитуд треугольное. Его можно получить суммой двух независимых равномерных шумов, каждый от −Δ/2-\Delta/2 до +Δ/2+\Delta/2, где Δ\Delta — шаг квантования в выбранной шкале. Итоговый диапазон примерно [−Δ,+Δ][-\Delta,+\Delta], то есть два шага от минимума до максимума. Для 16-битного PCM при масштабе 32768 шаг Δ=1/32768≈0,0000305\Delta=1/32768\approx0{,}0000305.

Для идеального равномерного квантования (uniform quantization)равномерное квантование (uniform quantization) — Квантование с одинаковым расстоянием между соседними представимыми уровнями. Это расстояние называется шагом квантования. без перегрузки и при выполнении условий независимости dither такой шум делает среднее и средний квадрат полной ошибки независимыми от входного значения. Несубтрактивный означает, что добавленный шум после квантования (quantization)квантование (quantization) — Замена значения отсчёта одним из конечного набора представимых уровней. Разность между выбранным уровнем и исходным значением называется ошибкой квантования. не вычитают. Это не означает полной статистической независимости ошибки и сигнала и не возвращает потерянную точность (Wannamaker и соавторы, раздел о практических распределениях).

Розовый шум и белый шум синтезатора не становятся подходящим TPDF-dither только от уменьшения громкости: важны распределение, временные свойства, масштаб и место добавления. Слышимый шум в миксе также не заменяет специально выбранный dither перед кодером. Само округление (rounding)округление (rounding) — Замена числа ближайшим допустимым значением, например ближайшим целым для round. Выбор при равном расстоянии до двух значений определяется отдельным соглашением. и назначение дизеринга разобраны в целочисленном PCM.

Самопроверка

У какого шума полосы 500–1 000 и 1 000–2 000 Гц содержат одинаковую ожидаемую мощность?

У розового, в пределах полосы, где работает приближение 1/f1/f. У белого вторая полоса вдвое шире в герцах и содержит примерно вдвое большую мощность.

Равномерная гистограмма подтверждает, что шум белый?

Нет. Она описывает распределение значений, но не их порядок и связи во времени. Повторение каждого значения по тысяче раз может сохранить гистограмму и изменить спектр.

Почему reset с прежним seed перед каждым блоком меняет звучание?

Каждый блок повторяет начало последовательности. Вместо продолжающегося потока получается повтор короткого фрагмента. Для розового генератора сброс также заново заполняет сохранённые ряды.

Для продолжения розового шума с середины достаточно сохранить getSeed()?

Нет. Нужны текущее состояние PRNG, все сохранённые ряды, счётчик и сумма. Исходный seed позволяет повторить начало, если заново выполнить полный reset.

Источники

Связи

Связи списком

Ссылается на

Открыть в общем графе

Поиск

Ищем по названиям, тексту статей и английским терминам. Например: «частота дискретизации», «Nyquist», «аналоговый сигнал».