Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Алгоритмы > Как определить точную частоту звукового сигнала |
Автор: 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 !! Может быть я его неправильно понял ? Но вопрос все таки в следующем - каким образом можно получить частоту играемой ноты максимально точно ? Буду очень благодарен ![]() |
Автор: xvr 27.2.2012, 12:49 |
Явно нет, да и к програмированию вообще не относится. Скорее к алгоритмам ... |
Автор: maxim1000 27.2.2012, 14:10 |
т.к. такая тема в "Алгоритмах" уже есть, предлагаю постить туда: http://forum.vingrad.ru/forum/topic-347704/unread-1/anchor-entry2463824/0.html |