Анализ аудио с использованием быстрого преобразования Фурье - PullRequest
104 голосов
/ 03 марта 2009

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

Ответы [ 3 ]

201 голосов
/ 03 марта 2009

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

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

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

26 голосов
/ 05 мая 2012

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

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

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

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 Гц.

10 голосов
/ 03 марта 2009

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

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

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

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

...