Как получить частоты каждого значения в БПФ? - PullRequest
140 голосов
/ 06 декабря 2010

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

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

Ответы [ 5 ]

321 голосов
/ 07 декабря 2010

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

Так что если ваша частота дискретизации, Fs, скажем, 44,1 кГц, и ваш размер FFT, 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.

54 голосов
/ 06 декабря 2010

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

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

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

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

17 голосов
/ 20 августа 2012

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

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: размер вектора БПФ
11 голосов
/ 30 августа 2011

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

Я бы посчитал, чтоэлемент в 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
5 голосов
/ 06 декабря 2010

Ваша частота k th FFT равна 2 * pi * k / N.

...