Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Как определить точную частоту звукового сигнала


Автор: Kpeved 26.2.2012, 02:27
Даже не знаю , относится ли это к системному программированию но .. В общем задача следующая - необходимо реализовать гитарный тюнер - мы играем ноту и нам с определённой точностью выводится её частота , мы крутим колки гитары в нужную сторону и таким образом настраиваем . 
Итак , изначально я решил что лучше всего для этого подойдет  алгоритм FFT (быстрое преобразование Фурье  - перевод из временной в частотную область ). У микрофона (АЦП) можно было выбрать несколько частот дискретизации - 44100 , 8000 , вроде ещё 11К .  Соответственно на выходе преобразования мы можем  получить макс допустимую частоту в 44100/2 , 8000/2 Гц и т.д  Для настройки гитары в принципе было бы достаточно предела в 2000Гц , так что была выбрана част дискр в 8000 . 
Но возникает проблема - для того чтобы получить более- менее точную частоту - нам надо взять как можно больше значений . - если мы берём например 8000 то за 1 гц отвечает одно значение , если 16К - то по 0.5 Гц , если 4 - то по 2Гц .  Но с частотой по 8000 значений в секунду нам понадобится 0.5- 2 секунды чтобы только считать значения + ещё FFT рассчитать !  Я видел тюнеры которые за доли секунды настраивали с точностью в 0.1 Гц !!
Начал копать в сторону выделения одной основной частоты - нашел  АКФ . Умножает значения друг на друга с увеличивающимся смещением , и выходит что макс знач дают нам макс амплитуду. Сказано - сделано . Результат меня просто поразил - работает в реальном времени .периоды нот стали видны очень отчетливо .  Здесь получается что наша частота- это ЧД/ на наш период . - след-но чем больше ЧД тем более точным оказывается результат , но на высоких нотах его все ещё не достаточно - с макс ЧД в 44100 получается что шаг на 85-75 Гц составляет 0.1- 0.2 Гц , но на 300-400 он уже в 2-4 Гц . 
Скачал пару оупен соурсов , покапался , ничего не понял кроме того , что они все таки используют FFT !!   Может быть я его неправильно понял ?
 Но вопрос все таки в следующем - каким образом можно получить частоту играемой ноты максимально точно ? Буду очень благодарен  smile 

Автор: xvr 27.2.2012, 12:49
Цитата(Kpeved @  26.2.2012,  02:27 Найти цитируемый пост)
Даже не знаю , относится ли это к системному программированию

Явно нет, да и к програмированию вообще не относится. Скорее к алгоритмам ...

Автор: maxim1000 27.2.2012, 14:10
т.к. такая тема в "Алгоритмах" уже есть, предлагаю постить туда: http://forum.vingrad.ru/forum/topic-347704/unread-1/anchor-entry2463824/0.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)