Как использовать numpy с portaudio для извлечения низких и средних частот

StackOverflow https://stackoverflow.com/questions/1794010

Вопрос

Как в этом примере Как извлечь информацию о частоте из входного аудиопотока (используя PortAudio)? Мне любопытно узнать о portaudio и numpy...

Я не уверен на 100% насчет fft, как я могу передать numpy фрагмент и получить обратно три значения от -1.0 до 1.0 для низких, средних и высоких частот?

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

Это было полезно?

Решение

На самом деле, вы бы не стали использовать преобразование Фурье для этого.

Разделение любого аудиосигнала на низкие, средние и высокие частоты обычно выполняется с помощью фильтров.A Фильтр это устройство обработки сигналов, которое ослабляет определенные частотные диапазоны.Фильтры могут быть сконструированы цифровым или электрическим способом.Например, они используются в системах кроссовера звука в громкоговорителях.

Чтобы получить низкочастотную басовую партию, вы бы использовали фильтр нижних частот.Фильтры нижних частот отфильтровывают высокие частоты.Их также называют фильтрами с высоким срезом.
Чтобы получить среднечастотную среднюю часть, вы бы использовали полосовой фильтр.Полосовые фильтры отфильтровывают как низкие, так и высокие частоты.Их также называют "колоколообразными фильтрами".
Чтобы получить высокочастотную часть высоких частот, вы бы использовали фильтр высоких частот.Фильтры высоких частот отфильтровывают любые низкие частоты.Их также называют фильтрами с низким уровнем шума.

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

Каждый фильтр будет иметь пороговую частоту.Пороговая частота - это специальная частота, с которой фильтр должен начать фильтрацию.В зависимости от порядка фильтрации сигнал будет ослаблен на 6 дБ/окт (1-й порядок), 12 дБ/окт (2-й порядок), 18 дБ/окт (3-й порядок) и т.д.Для вашего приложения, вероятно, подойдет дизайн 2-го порядка.
Обратите внимание, что фильтры в целом некоторым образом искажают ваш сигнал, и чем выше порядок, тем более слышимым он может стать.Кстати, это чистая физика и справедливо для всей обработки сигналов, включая преобразования Фурье.

Использование этих трех фильтров эквивалентно (может быть) выполнению преобразования Фурье только с тремя спектральными точками.

Другие советы

В Преобразование Фурье, упомянутый в выбранном ответе на вопрос SO, на который вы указываете, дает вам "спектр" - большой набор значений, дающих интенсивность звука в каждом из различных диапазонов / срезов частот (выраженных, например, в Герцах).

Как перевести (скажем) тысячу интенсивностей (скажем, по одной на каждый 10-герцевый участок спектра) всего в три числа, по вашему желанию, конечно, является довольно эвристической проблемой - например, вы могли бы просто решить, какие диапазоны частот соответствуют "низким" и "высоким" частотам, а все, что находится между ними, является "средним", и вычислить средние интенсивности в каждом.Как бы то ни было, я считаю, что общее соглашение для "низких частот" - до 250 Гц, для "высоких частот" - 6 кГц и выше (промежуточное значение - "средние частоты"), cfr, например эта страница -- но это довольно произвольное соглашение, так что "выбирай свой яд"!-)

Как только у вас будет относительный уровни вы захотите нормализовать их относительно друг друга и соответствующим образом масштабировать, чтобы они лежали в желаемом диапазоне (предположительно, в логарифмической шкале, потому что именно так работает человеческий слух;-).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top