Как получить частоты каждого значения в БПФ?
У меня есть БПФ результат. Они хранятся в двух 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