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