Визуализируя звук

Грэг Дункан

Сегодняшний проект Филипа Брайка (или HoshiKata) слегка необычен и по отношению к тому, что мы обычно рассматриваем здесь и сам по себе. Мне кажется, он забавный, лаконичный и поучительный…

Визуализируя звук

clip_image002

Введение

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

Для этого надо решить несколько простых проблем:

  • Проигрывание звуков DirectX -> исходные значения
  • Запись DirectX -> исходные значения
  • Значения -> FFT
  • График FFT
  • Способ увидеть, как FFT изменяется во времени.

Следующая часть содержит значительное количество подробностей, информации и математики (которая травмирует мой мозг в субботу…clip_image004).

Основы

Демистифицирование звука и частотной обработки

При обработке звука, обычно данные сжимаются, но можно считать, что они превращаются в набор сэмплов во времени

y(t) = F(t)

Частота – это вибрации взад и вперед, происходящие в определенном темпе, поэтому:

  • Когда начинается частота?
  • Когда она заканчивается?

Ответ в том, что частота происходит в течение некоторого времени, поэтому у нее есть время действия или «поддержка».

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

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

clip_image006

Далее: 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,...

clip_image008

Наконец он переходит к коду;

Использование кода

В коде сделано несколько интересных вещей:

  • Захват звука DirectX, проигрывание, FFT, и некоторые графические штуки для дальнейшего использования.
  • Некоторая автономность и возможность использования в будущих продуктах,
  • Код прост (или, по крайней мере, задумывался таковым) для чтения и понимания.

FFT

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

API, которые я предоставляю для FFT и обратной процедуры самые обычные:

Комплексные -> (I)FFT -> Комплексные, Вещественные -> (I)FFT -> Комплексные, Вещественные -> (I)FFT -> Модули

Вот снимок решения:

clip_image010

Как видно, проект разделен на многократно используемые фрагменты, начиная от основной части SoundSource, где проводится вся обработка звука (вообразите, я знаю это) до двух элементов управления, используемых для визуализации.

Практическое значение для большинства из нас? Понятия не имею, но бросающиеся в глаза, мерцающие экраны вроде этого выглядят завораживающе. Что касается меня, то мне кажется, это можно использовать для создания чего-то замечательного, не правда ли? Если и нет, то это забавно. Плюс код, который интересен сам по себе…