Я пишу небольшую программу, которая должна обнаруживать уровень звука и записывать ее, если уровень выше установленного в настройках, я сделал запись звука через portaudio, сжимаю через libvorbis, но одна часть программы имеет незавершенные и я застрял на нем, мне нужно определить уровень звука исходных данных pcm, у меня плохое представление о том, что такое данные pcm, и не знает алгоритм анализа/обработки звука, есть ли у нас существующая библиотека c/C++, которая может это сделать? или существует какой-то простой алгоритм, который может быть реализован в c/C++?определить уровень звука в необработанных данных pcm
ответ
Посмотрите на библиотеки Speex и WebRTC ... у них обоих есть детекторы голосовой активности. Если вы ищете меру уровня звука, вам нужно будет выбрать индикатор линейного или логарифмического уровня. Общий формат для PCM - диапазон от 32768 до 32767 (16-разрядный короткий) ... одна простая вещь, которую вы можете сделать, это просто суммировать абсолютные значения выборок за период и делить на количество выборок, чтобы получить среднее значение уровня за этот период.
Это зависит от того, как вы определяете «уровень звука», который может быть таким же простым, как обнаружение пика, и более сложным, как следующие отраслевые стандарты/рекомендации по достижению уровней громкости.
Данные PCM обычно представляют собой поток подписанных значений: 0x00..0xFF в случае 8-битного PCM, -0x8000 .. + 0x7FFF для 16-битного PCM или -1.0 .. + 1.0 в случае значений с плавающей запятой ,
Проще всего обнаружить простой пик, ища максимальное абсолютное значение для данного временного интервала. Затем вы можете применить log10
для преобразования в децибелы.
В настоящее время я реализовал поиск максимального значения (ов) в течение периода времени, но это плохо работает почти непригодным – sss123next
Я подписал 16 бит 48 кГц, поскольку я понимаю, что мне нужно суммировать 48000 образцов и сравнить их с уровнем? определить уровень за одну секунду? – sss123next
уверен, вы можете выбрать любой период времени, который вы хотите ... одна секунда в порядке. не забудьте суммировать> абсолютные <значения ... – mark
я постараюсь ответить – sss123next