2015-04-15 4 views
1

Я разрабатываю приложение IOS для определения частоты, и я использую алгоритм YIN, который очень точен: ведьма Audacity, я создал прямоугольные волны разных частоты - и мой алгоритм имеет точность около 0,1% - например, генерируя тон 82,4 Гц (строка E), я действительно получаю 82,4 Гц и ничего больше.YIN-Frequency-Detection и обертоны (гитарные струны)

Во всяком случае, когда я наматываю гитарную струну, я часто получаю обертоны, которые иногда могут быть сильнее (с большей амплитудой), чем основной тон (F0). Следовательно, мой дисплей начинает «танцевать» и переключается - иногда даже случается, что (когда тон умирает) мой алгоритм останавливается на частоте обертона (например, A вместо E) - так что пользователь должен снова ввести строку в чтобы увидеть, присутствует ли его желаемый тон (частота).

Я знаю, что это явление не имеет ничего общего с моим алгоритмом, потому что это всего лишь «аппаратная» проблема (я имею в виду гитару, которая просто производит обертоны).

Я тщетно пытался сгладить результаты (определения частоты) или «привязать» к фиксированной частоте, как только критическая частота (например, 82,4 Гц для строки E +/-) была обнаружено. Во всяком случае, часто возникает тот факт, что мой алгоритм также попадает в ошибочную частоту.

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

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

  1. предобработка сигнала (может быть, окно Хеннинга, низкочастотные или полосовая фильтрация) и/или
  2. Постобработки сигнала (некоторое сглаживание частоты).

Есть ли у кого-то идеи, как преодолеть «изменчивые» результаты?

ответ

1

Я использовал автокорреляцию для своего бесплатного хроматического приложения iTransposer и включил окно Ханнинга, чтобы это могло вам помочь. Сначала я не искал точности, потому что я хотел отображать записку на ноге, а не метр. Однако мой друг проверял его на 0,1 Гц с генератором сигналов на его работе и имел проблемы более 383 Гц с простыми сигналами, такими как синусоидальные волны. Я пробовал его с помощью различных латунных инструментов, инструментов для гитары и гаража, кажется, настройка. В принципе я реализовал эту http://www.ucl.ac.uk/~ucjt465/tutorials/praatpitch.html с помощью VDSP и обновил образец проекта, поставляемый Kevin P Murphy https://github.com/kevmdev/PitchDetectorExample

+0

Спасибо, psybersonic - Я опробовал свои предложения и есть небольшие улучшения, касающиеся стабильности частоты. Работа «Pitch in Praat» очень помогла мне, чтобы лучше понять, что такое определение тона или речи. Спасибо огромное! –

+0

Рад помочь Ульриху. Цифровое аудио не просто. Если вы используете какой-либо код Кевина Мерфи, в аудиоконтроллере есть утечка памяти. Нужно добавить бесплатно (THIS-> bufferList.mBuffers [0] .mData); в конце обратного вызова записи. (если моя память верна). – psybersonic

 Смежные вопросы

  • Нет связанных вопросов^_^