Анализируйте звук с помощью быстрого преобразования Фурье

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

Вопрос

Я пытаюсь создать графический анализатор спектра на Python.

В настоящее время я читаю 1024 байта 16-битного двухканального аудиопотока с частотой дискретизации 44 100 Гц и усредняю ​​амплитуду двух каналов вместе.Итак, теперь у меня есть массив из 256 подписанных короткометражек.Теперь я хочу предварительно сформировать БПФ для этого массива, используя такой модуль, как numpy, и использовать результат для создания графического анализатора спектра, который для начала будет иметь значение всего 32 такта.

Я прочитал статьи в Википедии о быстром преобразовании Фурье и дискретном преобразовании Фурье, но мне до сих пор неясно, что представляет собой полученный массив.Вот как выглядит массив после того, как я предварительно сформировал БПФ в своем массиве, используя numpy:

   [ -3.37260500e+05 +0.00000000e+00j   7.11787022e+05 +1.70667403e+04j
   4.10040193e+05 +3.28653370e+05j   9.90933073e+04 +1.60555003e+05j
   2.28787050e+05 +3.24141951e+05j   2.09781047e+04 +2.31063376e+05j
  -2.15941453e+05 +1.63773851e+05j  -7.07833051e+04 +1.52467334e+05j
  -1.37440802e+05 +6.28107674e+04j  -7.07536614e+03 +5.55634993e+03j
  -4.31009964e+04 -1.74891657e+05j   1.39384348e+05 +1.95956947e+04j
   1.73613033e+05 +1.16883207e+05j   1.15610357e+05 -2.62619884e+04j
  -2.05469722e+05 +1.71343186e+05j  -1.56779748e+04 +1.51258101e+05j
  -2.08639913e+05 +6.07372799e+04j  -2.90623668e+05 -2.79550838e+05j
  -1.68112214e+05 +4.47877871e+04j  -1.21289916e+03 +1.18397979e+05j
  -1.55779104e+05 +5.06852464e+04j   1.95309737e+05 +1.93876325e+04j
  -2.80400414e+05 +6.90079265e+04j   1.25892113e+04 -1.39293422e+05j
   3.10709174e+04 -1.35248953e+05j   1.31003438e+05 +1.90799303e+05j...

Мне интересно, что именно представляют собой эти числа и как мне преобразовать эти числа в процент от высоты для каждого из 32 столбцов.Кроме того, следует ли мне усреднять два канала вместе?

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

Решение

Массив, который вы показываете, представляет собой коэффициенты преобразования Фурье аудиосигнала.Эти коэффициенты можно использовать для получения частотного содержания звука.БПФ определено для комплексных входных функций, поэтому получаемые вами коэффициенты будут мнимыми числами, даже если все ваши входные данные являются действительными значениями.Чтобы получить количество мощности на каждой частоте, вам необходимо вычислить величину коэффициента БПФ для каждой частоты.Это нет просто действительную составляющую коэффициента, нужно вычислить квадратный корень из суммы квадратов его действительной и мнимой составляющих.То есть, если ваш коэффициент равен a + b*j, то его величина равна sqrt(a^2 + b^2).

После того, как вы рассчитали величину каждого коэффициента БПФ, вам необходимо выяснить, какой звуковой частоте принадлежит каждый коэффициент БПФ.N-точечное БПФ даст вам частотный состав вашего сигнала на N равноотстоящих частотах, начиная с 0.Потому что у вас частота дискретизации 44100 выборок/сек.и количество точек в вашем БПФ равно 256, ваш разнос частот составляет 44100/256 = 172 Гц (приблизительно)

Первым коэффициентом в вашем массиве будет коэффициент частоты 0.По сути, это средний уровень мощности для всех частот.Остальные ваши коэффициенты будут рассчитываться от 0 с частотой, кратной 172 Гц, пока вы не дойдете до 128.С помощью БПФ вы можете измерять частоты только до половины точек выборки.Прочтите эти ссылки на Частота Найквиста и Теорема выборки Найквиста-Шеннона если вы жаждете наказаний и вам нужно знать, почему, но основной результат состоит в том, что ваши более низкие частоты будут воспроизведены или с псевдонимом в сегментах более высоких частот.Таким образом, частоты будут начинаться с 0, увеличиваться на 172 Гц для каждого коэффициента до коэффициента N/2, затем уменьшаться на 172 Гц до коэффициента N - 1.

Этой информации должно быть достаточно, чтобы начать.Если вам нужно гораздо более доступное введение в БПФ, чем в Википедии, вы можете попробовать Понимание цифровой обработки сигналов:2-е изд..Это было очень полезно для меня.

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

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

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

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

Что касается деления на бары, то это не следует делать, как предлагают Анти, путем деления данных поровну в зависимости от количества баров.Наиболее полезным было бы разделить данные на октавные части, при этом каждая октава будет в два раза чаще предыдущей.(т.е.100 Гц — это на одну октаву выше 50 Гц, что на одну октаву выше 25 Гц).

В зависимости от того, сколько тактов вы хотите, вы делите весь диапазон на диапазоны по 1/X октавы.Основываясь на заданной центральной частоте A на полосе, вы получаете верхний и нижний пределы полосы из:

upper limit = A * 2 ^ ( 1 / 2X )
lower limit = A / 2 ^ ( 1 / 2X )

Чтобы вычислить следующую соседнюю центральную частоту, вы используете аналогичный расчет:

next lower =  A / 2 ^ ( 1 / X )
next higher = A * 2 ^ ( 1 / X )

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

Например:Мы хотим разделить диапазон на 1/3 октавы и начинаем с центральной частоты 1 кГц.

Upper limit = 1000 * 2 ^ ( 1 / ( 2 * 3 ) ) = 1122.5
Lower limit = 1000 / 2 ^ ( 1 / ( 2 * 3 ) ) =  890.9

Учитывая 44100 Гц и 1024 выборки (43 Гц между каждой точкой данных), мы должны усреднить значения от 21 до 26.(890,9/43 = 20,72 ~ 21 и 1122,5/43 = 26,10 ~ 26)

(Такты в 1/3 октавы дадут вам около 30 тактов в диапазоне от ~40 Гц до ~20 кГц).Как вы уже поняли, по мере того, как мы поднимаемся выше, мы будем усреднять более широкий диапазон чисел.Нижние столбцы обычно включают только 1 или небольшое количество точек данных.В то время как более высокие планки могут быть средними из сотен пунктов.Причина в том, что 86 Гц — это на октаву выше 43 Гц…а 10086 Гц звучит почти так же, как 10043 Гц.

у вас есть образец, длина которого во времени составляет 256/44100 = 0,00580499 секунды.Это означает, что ваше разрешение по частоте составляет 1/0,00580499 = 172 Гц.256 значений, которые вы получаете из Python, соответствуют частотам, в основном, от 86 Гц до 255*172+86 Гц = 43946 Гц.Числа, которые вы получаете, являются комплексными числами (отсюда и буква «j» в конце каждого второго числа).

ОТРЕДАКТИРОВАНО:ИСПРАВЛЕНА НЕВЕРНАЯ ИНФОРМАЦИЯ

Вам нужно преобразовать комплексные числа в амплитуду, вычислив sqrt(i2 + й2) где i и j — действительная и мнимая части, соответственно.

Если вы хотите иметь 32 такта, то, насколько я понимаю, вам следует взять среднее значение четырех последовательных амплитуд, получив 256/4 = 32 такта, как вы хотите.

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