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


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

3 99

3 ответа:

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

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

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

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

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

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

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

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

В зависимости от того, сколько баров вы хотите, вы делите весь диапазон на 1/х октавных диапазонов. Основываясь на заданной центральной частоте 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.

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

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

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

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