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

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

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

Ответ 1

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

Итак, если ваша частота дискретизации Fs равна 44,1 кГц, а ваш размер FFT, N равен 1024, то выходные выходы FFT находятся по адресу:

  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.

Ответ 2

Взгляните на мой ответ здесь.

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

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

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

Ответ 3

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

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: размер вектора FFT

Ответ 4

Коэффициенты выходного сигнала FFT (для комплексного ввода размера N) составляют от 0 до N - 1, сгруппированные как частота [LOW, MID, HI, HI, MID, LOW].

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

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

0,

 1,
 N-1,

 2,
 N-2

 ...

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

 [N/2]

Есть [N/2] +1 группы частот от индекса я = 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

Ваша конечная частота kFT FFT равна 2 * pi * k/N.