Определение величины определенной частоты на iPhone

Мне интересно, какой самый простой/лучший способ определить величину данной частоты в звуке.

Я понимаю, что функция FFT вернет значения всех частот в сигнале. Мне интересно, есть ли какой-либо ярлык, который я мог бы использовать, если меня беспокоит только определенная частота.

Я буду использовать микрофон iPhone для записи звука. Я предполагаю, что я буду использовать Службы очереди аудио для записи, так как мне не нужно записывать аудио в файл. Я использую SDK 4.0, поэтому я могу использовать любую из функций, определенных в структуре Accelerate (например, функции FFT), если это необходимо.

Update: Я уточнил вопрос, чтобы быть более понятным в соответствии с предложением Конрада.

Ответ 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. Вам, вероятно, просто нужно будет сравнить это, чтобы увидеть, какой подход лучше.

Я оставил немало других деталей для простоты, которые не должны иметь значения для вашего приложения.