Преобразование действительного и мнимого выходного БПФ в частоту и амплитуду - PullRequest
2 голосов
/ 26 февраля 2012

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

Мне уже удалось реализовать БПФ, но его токовый выход - это просто действительная и мнимая части для каждого окна, и я хочу знать, как я могу преобразовать это в пары частот и амплитуд? 1003 *

Я кое-что читал о БПФ и вижу, как их можно превратить в соотношение величины и фазы, но мне нужен формат, который мог бы прочитать кто-то, не имеющий знания в области сложной математики!

Спасибо


Спасибо за эти быстрые ответы!

Вывод из БПФ, который я получаю в данный момент, представляет собой непрерывный поток вещественных и мнимых пар. Я не уверен, стоит ли разбивать их на пакеты того же размера, что и мои входные пакеты (64 значения), и рассматривать их как массив или работать с ними по отдельности.

Частота дискретизации, у меня нет проблем с. Поскольку я сам настраивал FFT, я знаю, что он работает на глобальных тактовых частотах 50 МГц. Что касается индекса массива (если выходной массив, конечно, ...), я понятия не имею.

Если мы говорим, что вывод представляет собой серию одномерных массивов из 64 комплексных значений:

1) Как мне найти индекс массива [i]?

2) Будет ли каждый массив возвращать одну частоту или их количество?

Большое вам спасибо за вашу помощь! Я был бы потерян без этого.

Ответы [ 2 ]

4 голосов
/ 26 февраля 2012

Что ж, плохая новость в том, что нет необходимости понимать сложные числа.Хорошая новость в том, что то, что они называются комплексными числами, не означает, что они, знаете ли, сложны. Итак, сначала зайдите на страницу википедии, и для аудио-приложения я быскажем, прочитайте раздел 3.2, возможно, пропустив раздел о квадратных корнях: http://en.wikipedia.org/wiki/Complex_number

То, что вам говорят, это то, что если у вас есть комплексное число, a + bi , выможно изобразить, что он живет в плоскости x, y в местоположении (a, b).Чтобы получить величину и фазу, все, что вам нужно сделать, это найти две величины:

  • Расстояние от начала координат плоскости, которое является звездной величиной и
  • Угол от оси x, который является фазой .

Величина достаточно проста: это просто sqrt (a ^ 2 + b ^ 2).Этап выглядит сложным, но это не так.Это:

  • арктан (б / а) в квадрантах I и IV
  • арктан (б / а) + пи в квадранте II
  • арктан (б / а)) - пи в квадранте III
  • пи / 2 на положительной оси y
  • -pi / 2 на отрицательной оси y
  • не определено в начале координат

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

3 голосов
/ 27 февраля 2012

Результат FFT даст вам массив комплексных значений.Двойная величина (квадратный корень суммы квадратов комплексных компонентов) каждого элемента массива является амплитудой.Или сделайте логарифмическую величину, если вы хотите шкалу в дБ.Индекс массива даст вам центр частотного бина с этой амплитудой.Вам нужно знать частоту дискретизации и длину, чтобы получить частоту каждого элемента массива или бина.

f[i] = i * sampleRate / fftLength

для первой половины массива (другая половина - просто дублирующаяся информация в виде комплексных конъюгатовдля реального аудиовхода).

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

...