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


148

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

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


Я делаю это в C # .net. Вы можете помочь мне?
Ранго

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

Спасибо! Я хочу получить пиковые частоты каждого кадра (длина кадра зависит от длины окна и длины сдвига)
Rango

Ответы:


351

Первый двоичный элемент в БПФ - это постоянный ток (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ячейками). Последняя полезная ячейка (для практического применения) имеет значение at N / 2 - 1, которое соответствует 22006,9 Гц в приведенном выше примере. Контейнер at N / 2представляет энергию на частоте Найквиста, т.е. Fs / 2(= 22050 Гц в этом примере), но это, как правило, не имеет никакого практического применения, поскольку фильтры сглаживания обычно ослабляют любые сигналы при и выше Fs / 2.


8
Обратите внимание - ответ немного неправильный - 512-й сегмент содержит уровень 22050, предел Найквиста. Бункеры от 0 до N / 2 включительно содержат полезные значения.
Дэвид ван Бринк

4
Спасибо за редактирование и уточнение ... Думаю, именно здесь я обнаружил отсутствие практичности. Я: Но мастер, FFT работает до Найквиста! Вы: Padawan, вы действительно должны отфильтровать это.
Дэвид ван Бринк

5
Я хотел бы пометить ответы. Этот ответ даже лучше, чем оригинальный вопрос!
Skylion

14
@PaulR - Я хотел бы поблагодарить вас за этот замечательный ответ, который служил мне на протяжении многих лет. Я хотел бы посетить этот ответ до того, как у меня будет учетная запись StackOverflow, и я действительно забыл поблагодарить вас после регистрации. Я недавно посмотрел на материал FFT, и я вспомнил ваш ответ и только что посетил его сейчас. Как только я попал сюда, я вспомнил, чтобы поблагодарить вас ... так что спасибо! Всякий раз, когда я спорю с кем-то о толковании каждой точки на горизонтальной оси БПФ, я просто указываю на эту ссылку.
Rayryeng

6
@rayryeng: большое спасибо - я думаю, что это самое хорошее признание, которое я когда-либо получал за ~ 5 лет ответов на вопросы здесь, на SO!
Пол Р

55

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

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

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

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


Реальная и мнимая часть - это результат БПФ, который использовался для? Пожалуйста, объясните мне. Спасибо
Ранго

5
этот ответ заслуживает большей любви.
яркая звезда

1
Может ли быть так, что величина комплексных выходов должна быть удвоена каждый? (если я ограничу свою интерпретацию нижней половиной)
Вольф

18

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

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: Размер вектора БПФ

7
Люди не могут точно знать, что вы представляете samplesили nFFT. Поэтому, пожалуйста, сделайте это более объяснительным.
Мостар

14
В принятом ответе говорится, что так и должно быть i * samples / nFFT. Почему лишнее 2есть? Я что-то упускаю?
Яти Сагаде

13

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

Я считаю, что элемент в 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

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


6
Я думаю, что это будет в радианах
Барнаби
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.