Обнаружение частоты на iPhone - PullRequest
1 голос
/ 01 декабря 2011

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

Форумы предполагают, что я использую Apple FFT и ускоряю Framework, чтобы сделать это, но это кажется слишком сложным. Я был бы очень признателен, если бы кто-нибудь, кто запрограммировал тюнер или что-то подобное, мог направить меня в правильном направлении!

Спасибо!

Ответы [ 4 ]

4 голосов
/ 01 декабря 2011

На dsp.stackexchange есть пост, связанный с . Это предполагает, что автокорреляция будет работать лучше, чем БПФ, при нахождении фундаментального сигнала, если фундаментальный сигнал имеет меньшую амплитуду, чем гармоники. Автокорреляция немного сложнее, чем БПФ. Ускоренные рамки снова придут к вам на помощь. Однако обычно это не так.

Я не знаю ни одного готового решения, которое сделает всю работу за вас. В Руководстве по программированию vDSP есть конкретные проработанные примеры для реальных БПФ , к которым вы, возможно, захотите взглянуть, к этому нужно привыкнуть, но оно того стоит. Боюсь, БПФ - самый логичный первый шаг в извлечении пиковой частоты. Большинство источников также полагают, что применение оконной функции к сигналу во временной области перед запуском FFT является критическим (или вы получите высокочастотные артефакты из-за неоднородностей на конечностях).

Также, возможно, вы захотите проверить этот связанный пост SO .

2 голосов
/ 01 декабря 2011

Пиковая частота часто отличается от частоты основного тона, которую хотелось бы оценить (музыкальному) тюнеру. Посмотрите оценку высоты тона.

1 голос
/ 02 декабря 2011

Из предыдущего опыта:

  1. БПФ не всегда так точен, как вы думаете, и требует больших вычислительных затрат
  2. Автокорреляция дает довольно хорошие результаты
  3. Если у вас сильный фундаментальный уровень, пересечение нуля может быть очень точным и очень эффективным в вычислительном отношении (просто посчитайте, сколько раз сигнал пересекает ноль за период времени, f = (2 x периода времени в секундах) / (количество пересечений нуля) \

Надеюсь, это поможет.

0 голосов
/ 07 декабря 2011

Спасибо за все ответы! Я пропустил часть в своем коде, чтобы заставить слушателя SC работать на устройстве, но теперь пытаюсь изменить его для собственного AVAudioRecorder от Apple, так как он должен быть намного быстрее Проблема заключалась в том, что инфраструктура cocos2d блокировала запись звуков, пока вы не вызвали метод, который позволил это. Теперь это работает как шарм! :) Еще раз спасибо!

...