Pattr

О белом шуме

Какое-то время назад вдохновленные музыкой Г. Лазара эксперименты с аддитивным синтезом помогли осознать довольно тривиальную вещь, о которой я раньше не задумывался: белый шум имеет не равномерную АЧХ, но случайную в каждый момент времени. Т.к. частотные компоненты имеют идентичные плотности вероятности магнитуд и фаз, то после сглаживания мы получим “ровную” АЧХ.

Довольно тривиальное наблюдение, но мне скорее интересно связь с восприятием звука, учитывая, что белый шум часто используется как источник “всех гармоник” в звуковом дизайне. Попробуем разложить белый шум на части.

При прослушивании патчей советую убавить громкость, т.к. это эксперименты, и возможны громкие клики, глитчи и перегрузы.

1

Для начала попробуем услышать случайность. Сделаем это применением спектральной маски к шумовой грануле. Маска изначально пустая, т.е. убирает все спектральные компоненты; затем, по одной, мы будем случайным образом выбирать, какую компоненту пропускать. Последовательность обработки примерно следующая: преобразование Фурье ⇾ применение маски ⇾ обратное преобразование Фурье. Патч получился следующий (патч использует библиотеку FTM, подробнее см. в конце):

Постепенно добавляя спектральные компоненты, где-то на количестве двух-четырех, прислушавшись, можно начать замечать случайность громкости в разных частях спектра. Если продолжить их добавлять, то в какой-то момент внимание потеряет способность слышать отдельные частоты, и все они сольются в один звук1.

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

2

Теперь попробуем создать шум обратным преобразованием Фурье. Здесь есть одна тонкость. Если мы просто зададим одинаковые магнитуды и нулевые фазы всем компонентам, то на выходе мы получим импульс.

Поэтому мы будем рандомизировать фазы двумя способами: по одной, как мы делали в предыдущем примере, и сразу все — и послушаем, что получится. Патч следующий:

В данном патче создается массив из магнитуд и фаз. Магнитуды имеют значение «1». Фазы задаются кнопками. Количество компонент разложения задается переменной $size2. Из магнитуд и фаз делаем обратное преобразование Фурье и сохраняем результат в буфер wavetable3. Получившаяся волноформа проигрывается комбинацией count~ и index~, т.е. как есть, без интерполяции и ресемплирования.

Теперь можно послушать, как будет меняться равномерный спектр при случайном изменении фаз. Кроме этого, послушаем, как меняется звук при изменении количества компонент — стоит помнить, что быстрое преобразование Фурье (FFT) предполагает, что число компонент должно быть степенью двойки.

При изменении фазы каждой следующей компоненты, на слух кажется, что в звук добавляется гармоника. Я не знаю, как это объяснить, надо почитать матчасть. Полагаю, это связано с эффектом, когда гармоники складываются в единичный импульс при обратном преобразовании.

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

Но это еще не все. Кроме генерации данных с помощью функций FTM позволяет редактировать4. И под конец ночи я полез рисовать руками в фазовом массиве:

Если заменить $size на $real_size в указанных местах, дать $size значение (8192 * 16) и отредактировать ФЧХ, чтобы она имела резкие перепады, то получится вполне себе синтетическая перкуссия. Заменой переменной мы эффективно отрезаем половину волны, генерируемой ОПФ. Перкуссионный характер, возможно, связан с тем, что фаза соседних компонент существенно отличается, создавая биения. Но здесь мне также нехватает матчасти, чтобы объяснить. Вполне вероятно, что объяснение будет то же, что и для импульса.

3

Используемый нами Фурье-анализ имеет особенность: все компоненты, сколько бы их ни было, равнораспределены по частотному диапазону — т.е. расстояние между соседними компонентами одинаково для всего спектра. Это позволяет генерировать конечные волноформы с помощью ОПФ.

Но мы можем генерировать любое количество гармоник осцилляторами. И в последней версии макса это довольно легко сделать с помощью многоканальных проводов. Патч:

Здесь генерируется 1024 параллельных сигнала со значениями, равнораспределенными на диапазоне [0, 1]. Затем мы возводим каждое число в четвертую степень и умножаем на 20000. Затем суммируем все и делим на количество сигналов оператором avg. Таким образом мы неравномерно распределили 1024 осцилляторов по спектру. Замените 20000 на 10000, чтобы сжать весь спектр до диапазона 10000 Гц. Или промодулируйте ;)

Звук отличается существенно, на мой взгляд. Но это далеко от белого шума.

Заключение

Кроме анализа белого шума и сравнивая разных методов синтеза, данная статья, на мой взгляд, является отличным вступлением в аддитивный синтез в Максе.

О FTM и запуске патчей из статьи

Библиотека FTM предоставляет инструментарий, очень похожий на Matlab: операции с матрицами, векторами и т.д. Исторически, она уходит корнями в начало 90-х к одной из ранних реализаций Макса под названием Max/FTS, созданной в IRCAM.

В последнее время FTM плохо поддерживается разработчиками: им потребовалось лет пять, чтобы собрать 64-битную версию. Ссылок на скачивание на их сайте нет — только в архиве почтовой рассылке. Поэтому я загрузил их на сайт для хранения:

Данные патчи были сделаны в Max 8, но только третий использует функционал, доступный только в этой версии. Если у вас нет лицензии, то можете скачать демо-версию, которая позволяет открывать и редактировать любые патчи с одним ограничением: патчи нельзя сохранять. Это официальный способ воспроизведения патчей на компьютерах, где не нужна лицензия.

Сноски

  1. Я думал записать аудио-файлы, демонстрирующие описанное, но мне кажется, что в данном случае более эффективно будет запустить патч и самому добавлять компоненты в маску, слушая, как меняется звук.
  2. Преобразование Фурье дает спектр сигнала и его отражение. Поэтому количество эффективных компонент — половина плюс один, что рассчитывается при в переменной $real_size. Соответственно, фазовый массив имеет данную длину, а делающий обратное преобразование объект (gbr.ifft) имеет аттрибут @mode real.
  3. Название буфера такое потому, что результатом ОПФ, теоретически должен быть полный цикл из всех компонент заданного спектра. Этот эффект используется в wavetable-синтезаторах при импорте аудиофайлов с произвольной длиной.
  4. Если кликнуть дважды на FTM объекте с таблицей, — во втором патче он выглядит как [fmat | phases], — то откроется редактор, просмотрщик данных.
06 Feb 2020  OSCII