Частотный анализ / нормализация FMOD

Я использую библиотеку FMOD для применения FFT к аудиопотоку, предоставляя мне постоянно обновляемое фиксированное количество частотных интервалов. Каждый элемент представляет равный частотный диапазон со значением от 0 до 1, чтобы представить интенсивность этого диапазона из обработанного аудио. Документация FMOD гласит, что эти значения могут быть представлены в децибелах, где val - это значение от 0 до 1:

Decibels = 10.0f * (float)log10(val) * 2.0f

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

Однако эта указанная граница работает эффективно только тогда, когда громкость системного / музыкального проигрывателя максимальна. Когда я уменьшаю громкость, чувствительность стробоскопа уменьшается и становится либо очень неточной, либо полностью прекращает мигать. Я предполагаю, что мне нужно каким-то образом нормализовать данные, чтобы анализ выполнялся независимо от объема, хотя путем масштабирования данных 1/value of largest bin наибольшее значение всегда максимально. Это постоянно превышает указанную границу, в результате чего стробоскоп мигает бесконечно. Я не могу думать, как еще это может быть достигнуто и было в психическом блоке в течение нескольких дней - любая помощь или точка в правильном направлении была бы очень признательна!

1 ответ

Решение

Нормализуйте по более длинной шкале. Вам понадобится что-то вроде подписчика конвертов с длительным временем выпуска.

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

Но в основном в псевдо-C++ и при работе с входящим звуком (сигнал во временной области до FFT):

auto instant_level = std::abs(signal);
peak_level *= 0.99f;
peak_level = peak_level > instant_level ? peak_level : instant_level;

Теперь пик_уровня медленно затухает со временем. И вы можете использовать это для расчета коэффициента усиления для нормализации вашего входящего звука. Отрегулируйте 0,99f, как требуется для разумного времени затухания и для правильной частоты дискретизации.

Есть также сайт обмена стеками обработки сигналов, где вы получите более быстрые ответы на подобные вопросы (хотя иногда с почти непонятной частью алгебры:))

Другие вопросы по тегам