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

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

в настоящее время я читаю 1024 байта 16-битного двухканального аудиопотока с частотой дискретизации 44,100 Гц и усредняю амплитуду 2 каналов вместе. Итак, теперь у меня есть массив из 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 ответов


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

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

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

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

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

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


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

что касается деления на бары, это не следует делать, как предлагает 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

учитывая 44100hz и 1024 выборки (43hz между каждой точкой данных), мы должны усреднять значения с 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 бара, как вы хотите.