[Python] Анализ аудио с использованием быстрого преобразования Фурье


Answers

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

Что касается разделения на бары, это не должно быть сделано, как полагают antti, деля данные в равной степени на основе количества баров. Наиболее полезным было бы разделить данные на октавные части, причем каждая октава удваивает частоту предыдущего. (т.е. 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 или небольшое количество точек данных. В то время как более высокие бары могут составлять в среднем сотни точек. Причина в том, что 86hz - октава выше 43hz ... в то время как 10086hz звучит почти так же, как 10043hz.

Question

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

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

Я прочитал статьи в Википедии о преобразовании быстрого преобразования Фурье и дискретном преобразовании Фурье, но я все еще не понимаю, что представляет собой результирующий массив. Вот как выглядит массив после того, как я заработал fft на моем массиве с помощью 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 баров. Кроме того, должен ли я усреднять два канала вместе?




Links