Ответ 1
Если вам нужно только проверить одну частоту, вы можете просто вычислить соответствующую точку DFT. Алгоритм DFT - O (N ^ 2), но алгоритм FFT повторно использует промежуточные результаты для достижения O (NlogN) для вычисления DFT. Однако, если вы хотите только один образец частоты, вы можете просто рассчитать один выходной образец DFT и достичь производительности O (N).
Это можно сделать, посмотрев уравнение для DFT на странице wikipedia (я даже не пытаюсь ввести его здесь) и просто вычислить Xk для одного k, соответствующего интересующей частоте. k - это просто индексирование на выходе DFT.
Отображение k (индексы выхода DFT) на реальные частоты (Гц) зависит от двух вещей:
- Частота дискретизации (например, 44100 Гц для CD Audio)
- Размер FFT
Реальные частоты отображаются на k следующим образом:
F = k*Fs/N for k = 0 ... N/2-1 ((N-1)/2 for odd N)
или
k = F*N/Fs for F = 0Hz ... Fs/2-Fs/N
где F
- частота в Гц, N
- размер FFT, а Fs
- частота дискретизации (Гц). Некоторые примечания:
- k - целое число, поэтому не все частоты будут отображаться в целое число k. Найдите ближайший k
- Если вам требуется большее разрешение по частоте, увеличьте N.
- Сигналы, отобранные на Fs, могут точно представлять частоты до, но не включая Fs/2 (коэффициент Найквиста). Вот почему я показал, что отображение от k до Hz подходит только для половины выходных выборок. Я не буду вдаваться во вторую половину (это будет зеркальное отображение первой половины для реального входного сигнала).
- Выход DFT/FFT является сложным. Вы, скорее всего, захотите принять значение этого.
- Если вам нужно вычислить даже несколько выходов DFT, может быть лучше просто использовать доступную функцию FFT и получить все выходные образцы, а не вычислять только выходные образцы, которые вам нужны, используя DFT. Причина в том, что большинство алгоритмов FFT сильно оптимизированы, поэтому, хотя теоретически вы можете делать меньше работы, это может занять больше времени, чем FFT. Вам, вероятно, просто нужно будет сравнить это, чтобы увидеть, какой подход лучше.
Я оставил немало других деталей для простоты, которые не должны иметь значения для вашего приложения.