Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Сегодняшний проект Филипа Брайка (или 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, где проводится вся обработка звука (вообразите, я знаю это) до двух элементов управления, используемых для визуализации.
Практическое значение для большинства из нас? Понятия не имею, но бросающиеся в глаза, мерцающие экраны вроде этого выглядят завораживающе. Что касается меня, то мне кажется, это можно использовать для создания чего-то замечательного, не правда ли? Если и нет, то это забавно. Плюс код, который интересен сам по себе…