ГЕОМЕТРИЯ ЗВУКА
Удивительно, но существуют строгие математические методы, которые в буквальном смысле позволяют услышать визуальные геометрические формы и наоборот узреть красоту музыкальных гармоний…
Исследования в этой области были вдохновлены математическими видео от канала »3Blue1Brown»:
Оказывается, с помощью преобразования Фурье можно кодировать векторные визуальные изображения высокой сложности, раскладывая их на гармонические составляющие на базе комплексных чисел-векторов, что наглядно продемонстрировано в вышеупомянутых видео, а сам алгоритм кодирования более подробно рассмотрен в роликах каналов «Mathologer» и «The Coding Train»:
Больше примеров с другими изображениями можно найти по запросу «epicycle drawing Fourier transform».
Но также с помощью преобразования Фурье легко выделять гармонические составляющие из сигналов различной природы, например, акустических… Тут же возникают интригующие вопросы: что если применить представленный подход, но уже для исследования сигналов?
Как будет выглядеть звучание гитарной струны, других музыкальных инструментов, голоса, прочих звуков?
И наоборот
Чтобы детальнее раскрыть и исследовать эти таинственные вопросы, было решено на базе приложения для музыкального спектрального анализа SOLFEGGIO реализовать соответствующие модули визуализации…
На текущий момент доступны две ветви программы: десктопная для Windows [Microsoft Store, One Drive] и мобильная для Android [Google Play]. Функционально версии во многом схожи, но десктопная обычно чуть шустрее и удобнее для экспериментов, а также содержит дополнительный мощный модуль визуализации «Лента 3D», который отсутствует в мобильной.
Рисунок 3: визуализация идеального гармонического сигнала в мобильной версии (цветок)
Рисунок 4: визуализация акустического сигнала с микрофона в мобильной версии (цветок + спираль)
Чтобы всерьёз узреть звуки, создать объёмные геометрические формы голосом и даже полетать в них, рекомендуется скачать приложение, освоить базовые навыки и поработать непосредственно с ним. Программа бесплатная для учебного и некоммерческого использования. В случае коммерческого применения необходимо совершить пожертвование произвольного размера (по совести).
Также нужно упомянуть, что приложение, исходные коды, результаты исследований и другие сопутствующие материалы предназначены для использования в мирных целях (детальнее смотреть соглашение).
КАК ПОЛЬЗОВАТЬСЯ ПРОГРАММОЙ?
Итак, теперь приступим к нашим исследованиям. Чтобы интуитивно понять, как же работают различные способы визуализаций, сначала рассмотрим единичный синусоидальный сигнал. Для этого:
перейдём в раздел «Сигнал» и выберем профиль «Генератор»
откроем раздел «Генератор» и выберем профиль «Камертон»
Рисунок 5: синусоидальный тон
После выполнения этих шагов в динамиках должен зазвучать чистый синусоидальный тон заданной частоты (по умолчанию 440 Гц). На цветочной визуализации появится окружность, а на спиральной — архимедова спираль. Если поиграть с частотой тона, то будет меняться число витков спирали, значение амплитуды тона будет влиять на её радиус.
Теперь если на 3D-визуализации слегка улететь в строну, то можно обнаружить ленту-пружинку, вертикальная проекция которой на горизонтальную плоскость образует исходную синусоиду.
Рисунок 6: синусоидальный тон 3D
Тут нужно отметить запись на канале «Physics Videos by Eugene Khutoryansky», в которой рассмотрен этот же способ трёхмерной визуализации:
Если же к одиночному синусоидальному тону начать добавлять дополнительные синусоиды различной частоты и амплитуды, то на цветочной и спиральной визуализациях паттерны начнут существенно видоизменяться. Важно отметить: хотя лента-пружинка начнёт закручиваться причудливыми кружевными завитками (в зависимости от соотношений частот и амплитуд), но в трёхмерном представлении её проекция на горизонтальную плоскость по-прежнему будет соответствовать исходному временному кадру.
Рисунок 7: кружево 3D
Если смотреть на пружинки ровно с торца, то ортонормальная проекция будет представлять собой круговую цветочную геометрию (именно такой способ используется для рисования в видео канала »3Blue1Brown»), в то время как перспективная проекция будет образовывать спиральные формы.
Многообразие форм чрезвычайно велико (цветки, мандалы, барашки и многие другие), но что характерно: чистые гармонические музыкальные созвучия обычно образуют легко читаемые узоры… Также по этим узорам возможно различать тембральный окрас различных музыкальных инструментов и голосов, звучащих на одной ноте.
Рисунок 8: формы
Интересно, что узоры могут иметь как статический, так и динамический характер, например: вращаться, пульсировать, завораживающе переливаться и перетекать.
КАК ЭТО РАБОТАЕТ?
В первом приближении алгоритм примерно следующий:
выделяется короткий кусочек аудиосигнала длительностью порядка 100 мс (временной кадр);
происходит поиск чистых синусоидальных тонов (частот) звучащих в сигнале, вычисляется их амплитуда и фазовый сдвиг с помощью преобразования Фурье;
после чего на основе этой информации происхдит постороение и отрисовка геометрии.
Но при детальном рассмотрении всё становится чуть сложнее: вычислительный дискретный алгоритм быстрого преобразования Фурье (БПФ) имеет некоторые особенности, которые затрудняют высокоточный анализ сигналов. Для устранения этих затруднений дополнительно применяется алгоритм фазо-амплитудной интерполяции (ФАИ), который более развёрнуто рассмотрен в статье ЗАГАДКИ БЫСТРОГО ПРЕОБРАЗОВАНИЯ ФУРЬЕ.
В основе финальных геометрических построений лежит следующий алгоритм на языке программирования C#:
public class GeometryPresenter
{
public static IEnumerable Draw(
IList peaks, int sampleSize, double sampleRate,
double approximation = 1d, double spiralStep = 0d, double phaseAngle = 0d
)
{
if (peaks.Count.Is(0))
yield break;
var spiralScale = 1d;
var pointsCount = (int)(sampleSize / approximation);
var convertToPhase = approximation * Pi.Double / sampleRate;
for (var i = 0; i < pointsCount; i++, spiralScale -= spiralStep)
{
var a = 0d;
var b = 0d;
for (var j = 0; j < peaks.Count; j++)
{
var peak = peaks[j];
// var w = Pi.Double * peak.Frequency;
// var t = approximation * i / sampleRate;
var wt = peak.Frequency * i * convertToPhase; // w * t
var phase = peak.Phase + wt + phaseAngle;
var magnitude = peak.Magnitude * spiralScale;
a += magnitude * Math.Cos(phase);
b += magnitude * Math.Sin(phase);
}
yield return new(a, b);
}
}
}
Исходный код алгоритма трёхмерной визуализации доступен по ссылке.
ДЛЯ РАЗМЫШЛЕНИЙ
Хотя зачастую временные кадры сигналов представлены двумерно, преобразование Фурье позволяет развернуть их в трёхмерном пространстве и показать с недоступных ранее ракурсов, что даёт возможность рассмотреть скрытые причудливые геометрические паттерны-узоры и сопоставить им точный акустический эквивалент.
Это напоминает голографические снимки и стереоскопические картинки, когда плоские изображения при верном рассмотрении магическим образом обретают объём.
Также у фотоголограмм и временных кадров сигналов есть другое схожее свойсво: за счёт того, что каждый кусочек голограммы отчасти хранит информацию о всей сцене, при её разбиении (до некоторго предела) всё ещё можно в каждом отдельном кусочке рассмотреть исходную сцену, но уже с меньшего числа ракурсов. Словно при частичном завешивании окна в комнате по-прежнему остаётся видна картинка на улице, хотя чтобы её рассмотреть нужно подойти к окну ближе или немного сдвинуться в сторону. Подобным образом, при уменьшении размеров временного кадра сигнала, сохраняется возможность распознать всё с меньшей точность исходную «сцену» из гармоник.
ЗЕРКАЛА СТАТЬИ
EN: gitlab, habr
RU: gitlab, habr
ДОПОЛНИТЕЛЬНЫЕ МАТЕРИАЛЫ