Как получить частоты каждого значения в БПФ?

У меня есть БПФ результат. Они хранятся в двух double массивы: массив действительной части и массив мнимой части. Как определить частоты, которые соответствуют каждому элементу в этих массивах?

Другими словами, я хотел бы создать массив, в котором будут храниться частоты для каждого действительного и мнимого компонента моего БПФ.

5 ответов

Первый бин в БПФ - DC (0 Гц), второй - Fs / N, где Fs частота дискретизации и N это размер БПФ. Следующая корзина 2 * Fs / N, Чтобы выразить это в общих чертах, n-й контейнер n * Fs / N,

Так что, если ваша частота дискретизации, Fs скажем, 44,1 кГц и ваш размер БПФ, N 1024, то выходные лотки БПФ:

  0:   0 * 44100 / 1024 =     0.0 Hz
  1:   1 * 44100 / 1024 =    43.1 Hz
  2:   2 * 44100 / 1024 =    86.1 Hz
  3:   3 * 44100 / 1024 =   129.2 Hz
  4: ...
  5: ...
     ...
511: 511 * 44100 / 1024 = 22006.9 Hz

Обратите внимание, что для реального входного сигнала (мнимые части все ноль) вторая половина БПФ (от N / 2 + 1 в N - 1) не содержат полезной дополнительной информации (они имеют комплексно-сопряженную симметрию с первым N / 2 - 1 бункера). Последняя полезная корзина (для практического применения) находится в N / 2 - 1, что соответствует 22006,9 Гц в приведенном выше примере. Мусорное ведро в N / 2 представляет энергию на частоте Найквиста, т.е. Fs / 2 (= 22050 Гц в этом примере), но это, как правило, не имеет никакого практического применения, поскольку фильтры сглаживания обычно ослабляют любые сигналы при и выше Fs / 2,

Посмотрите на мой ответ здесь.

Ответ на комментарий:

БПФ фактически вычисляет взаимную корреляцию входного сигнала с функциями синуса и косинуса (базисные функции) в диапазоне частот, расположенных на равных расстояниях. Для данного выхода FFT существует соответствующая частота (F), как указано в ответе, который я разместил. Действительная часть выходной выборки - это взаимная корреляция входного сигнала с cos(2*pi*F*t) и мнимая часть является взаимной корреляцией входного сигнала с sin(2*pi*F*t), Причина, по которой входной сигнал коррелирует с sin а также cos Функция предназначена для учета разности фаз между входным сигналом и базисными функциями.

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

Я использовал следующее:

public static double Index2Freq(int i, double samples, int nFFT) {
  return (double) i * (samples / nFFT / 2.);
}

public static int Freq2Index(double freq, double samples, int nFFT) {
  return (int) (freq / (samples / nFFT / 2.0));
}

Входы:

  • i: Корзина для доступа
  • samples: Частота дискретизации в герцах (т. Е. 8000 Гц, 44100 Гц и т. Д.)
  • nFFT: Размер вектора БПФ

Выходные коэффициенты БПФ (для комплексного ввода размера N) имеют значения от 0 до N - 1, сгруппированные по частоте [НИЗКАЯ, СРЕДНЯЯ,HI,HI, СРЕДНЯЯ, НИЗКАЯ].

Я считаю, что элемент в k имеет ту же частоту, что и элемент в Nk, поскольку для реальных данных FFT [Nk] = комплексное сопряжение FFT[k].

Порядок сканирования от низкой до высокой частоты

0,

 1,
 N-1,

 2,
 N-2

 ...

 [N/2] - 1,
 N - ([N/2] - 1) = [N/2]+1,

 [N/2]

Имеется [N/2]+1 групп частот от индекса i = 0 до [N/2], каждая из которых имеет frequency = i * SamplingFrequency / N

Таким образом, частота в бункере FFT [k] равна:

if k <= [N/2] then k * SamplingFrequency / N
if k >= [N/2] then (N-k) * SamplingFrequency / N

Частота вашего k-го FFT-результата равна 2*pi*k/N.

Другие вопросы по тегам