Визуализируя звук
Сегодняшний проект Филипа Брайка (или HoshiKata) слегка необычен и по отношению к тому, что мы обычно рассматриваем здесь и сам по себе. Мне кажется, он забавный, лаконичный и поучительный…
Введение
Я всегда хотел сделать базисную обработку звука и увидеть звук, увидеть, что речь выглядит как набор частот, или посмотреть на музыку.
Для этого надо решить несколько простых проблем:
- Проигрывание звуков DirectX -> исходные значения
- Запись DirectX -> исходные значения
- Значения -> FFT
- График FFT
- Способ увидеть, как FFT изменяется во времени.
Следующая часть содержит значительное количество подробностей, информации и математики (которая травмирует мой мозг в субботу…).
Основы
Демистифицирование звука и частотной обработки
При обработке звука, обычно данные сжимаются, но можно считать, что они превращаются в набор сэмплов во времени
y(t) = F(t)
Частота – это вибрации взад и вперед, происходящие в определенном темпе, поэтому:
- Когда начинается частота?
- Когда она заканчивается?
Ответ в том, что частота происходит в течение некоторого времени, поэтому у нее есть время действия или «поддержка».
Чтобы ее измерить, вы сравниваете ее с известной частотой, так что время, в течение которого происходит сравнение важно. Если временной интервал слишком короток, только несколько оцифрованных сэмплов запишутся, и только несколько возможных частот могут быть измерены. Если он слишком велик, то теряется представление о том, когда частота или музыкальная нота начинается и заканчивается.
Чтобы дать более точное описание, я добавлю немного математики: предположим, мы слышим аккорд (три ноты). Тогда мы можем записать генерирующую функцию в виде трех синусоид:
Далее: DirectX и визулизация FFT;
Буферизация
Существует множество статей, описывающих, как DirectX проигрывает записи или воспринимает микрофон. Код дает подходящий пример, как это делается. Интересно, как в этом примере используются потоки. Данные выбираются из файла, затем буфер ставится в список на обработку. Затем поток выбирает данные из массивов и производит столько быстрых преобразований Фурье, сколько нужно.
Например, данные произошедшего события породили 44 000 сэмплов, а затем 22 000 сэмплов. Это приведет к двум буферам, помещенным в очередь обработки (44К, а затем 22К). Размер окна FFT 1024. Рабочий поток затем может асинхронно обрабатывать пачки данных, а затем выдавать результаты (событие) на просмотр.
Перекрывающиеся FFT
FFT преобразует временное представление данных в частотное, поэтому если ритм начался вблизи края одного или другого набора данных, момент начала вызовет звон. Чтобы избежать этого и создать лучшее восприятие «места», определите, когда началась и закончилась данная частота, и разбейте набор данных на перекрывающиеся регионы, которые можно затем подвергнуть преобразованию Фурье. Если есть 22К точек данных, а размер окна FFT составляет 1024, то перекрывая вперед, первое FFT начитается с 0, следующее с 1024/4, затем с 1024/2, 1024*3/4, 1024, 1024 + 1024/4,...
Наконец он переходит к коду;
Использование кода
В коде сделано несколько интересных вещей:
- Захват звука DirectX, проигрывание, FFT, и некоторые графические штуки для дальнейшего использования.
- Некоторая автономность и возможность использования в будущих продуктах,
- Код прост (или, по крайней мере, задумывался таковым) для чтения и понимания.
FFT
Существует много интересных вещей, которые можно сделать в приложении с помощью FFT. Входные и выходные данные могут быть вещественными, комплексными, модулями, чередоваться или быть обособленными, целыми, с плавающей точкой, двойной точности или какой-то комбинацией. Буферы могут повторно использоваться для вывода или быть раздельными.
API, которые я предоставляю для FFT и обратной процедуры самые обычные:
Комплексные -> (I)FFT -> Комплексные, Вещественные -> (I)FFT -> Комплексные, Вещественные -> (I)FFT -> Модули
Вот снимок решения:
Как видно, проект разделен на многократно используемые фрагменты, начиная от основной части SoundSource, где проводится вся обработка звука (вообразите, я знаю это) до двух элементов управления, используемых для визуализации.
Практическое значение для большинства из нас? Понятия не имею, но бросающиеся в глаза, мерцающие экраны вроде этого выглядят завораживающе. Что касается меня, то мне кажется, это можно использовать для создания чего-то замечательного, не правда ли? Если и нет, то это забавно. Плюс код, который интересен сам по себе…