Определение величины определенной частоты на iPhone - PullRequest
6 голосов
/ 27 мая 2010

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

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

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

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

1 Ответ

13 голосов
/ 30 мая 2010

Если вам нужно проверить только одну частоту, вы можете просто вычислить соответствующую точку DFT . Алгоритм DFT - это O (N ^ 2), но алгоритм FFT использует промежуточные результаты для достижения O (NlogN) для вычисления DFT. Однако, если вам нужна только одна частотная выборка, вы можете просто рассчитать одну выходную выборку ДПФ и достичь производительности O (N).

Это можно сделать, посмотрев уравнение для ДПФ на странице википедии (я даже не буду пытаться набрать его здесь) и просто вычислить Xk для одного k, соответствующего Частота интереса. k - это просто индексирование на выходе ДПФ.

Отображение k (индексы выхода DFT) в реальные частоты (Гц) зависит от двух вещей:

  • Частота дискретизации (например, 44100 Гц для CD Audio)
  • Размер БПФ

Реальные частоты отображаются на 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 - размер БПФ, а Fs - частота дискретизации (Гц). Некоторые вещи, на которые стоит обратить внимание:

  • k является целым числом, поэтому не все частоты будут отображаться в целое число k. Найдите ближайший к
  • Если вам нужно большее разрешение по частоте, увеличьте N.
  • Сигналы, отобранные в Fs, способны точно представлять частоты вплоть до, но не включая Fs / 2 ( частота Найквиста ). Вот почему я показал, что отображение от k до Гц подходит только для половины выходных выборок. Я не буду вдаваться в то, что представляет вторая половина (на самом деле это будет зеркальное отображение первой половины для реального входного сигнала)
  • Вывод DFT / FFT сложный. Скорее всего, вы хотите принять величину этого.
  • Если вам нужно вычислить даже несколько выходных сигналов DFT, может быть лучше просто использовать доступную функцию FFT и получить все выходные выборки, а не вычислять только те выходные сигналы, которые вам нужны, с использованием DFT. Причина в том, что большинство алгоритмов FFT сильно оптимизированы, поэтому, даже если теоретически вы выполняете меньше работы, это может занять больше времени, чем FFT. Вы, вероятно, просто должны сравнить это, чтобы увидеть, какой подход лучше.

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

...