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

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

Ответ 1

Массив, который вы показываете, является коэффициентами преобразования Фурье аудиосигнала. Эти коэффициенты могут быть использованы для получения частотного содержимого аудио. БПФ определено для входных функций со сложными значениями, поэтому коэффициенты, которые вы получаете, будут мнимыми числами, даже если ваши входные данные являются реальными значениями. Чтобы получить величину мощности на каждой частоте, вам необходимо рассчитать величину коэффициента БПФ для каждой частоты. Это не просто реальная составляющая коэффициента, вам нужно вычислить квадратный корень из суммы квадратов его действительной и мнимой составляющих. То есть, если ваш коэффициент равен 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-е изд. , Это было очень полезно для меня.

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

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

Ответ 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

Учитывая 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.

Ответ 3

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

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

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

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

Ответ 4

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

https://radhey04ec.blogspot.com

Он включает в себя основную концепцию преобразования Фурье тригонометрии уравнения Эйлера

только 56 страниц, и вы найдете все ответы