LizardKing
14.8.2006, 9:11
Всем привет, а девелоперам особенно! :-)
Поясните, плиз, как устроен софтовый тюнер (ну, наверное, и тюнер вообще). Как я понимаю, тюнер должен отображать ноту, которую я дернул на гитаре, анализируя кусочек звукового потока и вычленять оттуда значение наиболее часто встречающейся амплитуды. Количество повторов примерно равных амлитуд и будет "герцность" искомой ноты, т.е. если какая-та амлитуда встретилась примерно 440 раз в секундном фрагменте, то, значицца, мы дернули ноту "Ля" и т.д. Но в этом случае нужно записывать СЕКУНДУ звука, что для тюнера неприемлимо. Если пропорционально уменьшить время записи фрагмента, увеличиться "оперативность" тюнера, но также возрастет и ошибка (причем латентность все равно будет нехилая).
Народ! Мож, я, конечно, чушь пишу, но не будьте так строги - объясните убогому, чего в Датском королевстве наперекосяк?
P.S. При анализе пользовался FFT, т.е. в математике уж не совсем ламер, хотя... ;-)
ВСЕМ ЗАРАНЕЕ ОГРОМНОЕ ЛИЗАРДКИНГОВСКОЕ СПАСИБО!
зачем
ты можешь насчитать 220 колебаний в 0.5 сек
110 колебаний в 0.25 сек
и т.д.
поступающий сигнал сразу и непрерывно раскладывается в ряды. наверное кстати поэтому иногда вначале они показывают ноту на октаву выше реальной. какой отрезок времени при этом берется даже не знаю, но по опыту задержки показаний тюнера ~ 0.2..0.5 сек. этого достаточно для анализа (не менее 110 циклов попадает)
и зачем кстати тюнеру такая оперативность менее 0.5 сек. все равно струну нужно строить не по первым мгновениям звучания, а когда натяжение спадет
LizardKing
14.8.2006, 10:47
110 колебаний в 0.25 сек - это же все-таки не факт, что в 1 сек будет 440! Наверное...
Но сам принцип-то верный или как?
принцип верный
думаю здесь можно почитать об этом больше
http://forum.sources.ru/index.php?showtopic=9061
LizardKing
14.8.2006, 13:42
Спасибо! Щаз гляну.
Schneider
14.8.2006, 13:47
При поступлении звука нужно раскладывать в ряд Фурье и смотреть частоту самой низкой гармоники. Это и даст ноту (насколько я помню физику волн).
В общем, я никогда такими вещами не занимался, но в голове сейчас появилась идея типа того: звук поступает дискретно (с частотой к примеру 44100 раз в секунду). Соответственно эти числа (амплитуда колебаний интенсивности звуковой волны, я так понимаю) запихиваем в некий массив по порядку, и отдельным потоком по таймеру делаем FFT (оно же БПФ :)), анализируем его, выявляем искомую гармонику и отображаем его.
Я мог наврать в понятиях и в математике :) Но на алгоритме это не должно сильно сказаться, так что надеюсь будет работать. Главное с потоками грамотно оптимизировать все.
Кстати, а звук каким макаром считывается? Это ведь тоже влияет, и причем существенно, на латентность.
LizardKing
14.8.2006, 14:22
Шнайдер - я так и делал, алгоритм рабочий, но чета фигня какая-та получалась. Лан, попробую еще, мож просто руки с мозгами из одного места растут :-\
Звук рекордил WinAPI'шными функциями. Через Direct не пробовал пока.
Ок, всем спасибо :-) буду пробовать еще!
Schneider
14.8.2006, 14:32
Попробуй через Direct Sound. Там все просто по идее (я с ним правда не работал, но DX вообще штука несложная), но эффективно и универсально.
Я так понимаю, основная проблема - это скорость?
LizardKing
14.8.2006, 14:39
Именно. Большой фрагмент - большая точность, но низкая скорость обновления (срабатывания) и наоборот. Вот. Нуна компромисс искать.
Попробую. Вообще как-то начал копать Директ и нашел там много интересных вещей (типа панорамирования, возможности запуска нескольких независимых источников и т.д.). А вообще директ предназначен в первую очередь для воспроизведения звука, а не для записи.
LizardKing
14.8.2006, 14:40
P.S. Коли уж оффтоп так разросся, добавлю СУБоффтоп - сегондя заказал в МузДетали уж очень приглянувшуюся мне акустику Skylark :-) чуть ли не самая дешевая, но что-то зацепила она меня :-) вот так люди влюбляются... наверное :-)
Sam (OverHead)
14.8.2006, 14:46
Schneider:
Кстати, а звук каким макаром считывается? Это ведь тоже влияет, и причем существенно, на латентность.
Ну, если взять за истину то что для более-менее достоверного определения частоты, нужно как минимум 0.25 сек, то думаю пофигу каким макром считывается :) Думаю, любая, самая захудалая карта даже через Windows Wave Mapper способна нормально без косяков выдавать 250 миллисекундные буфферы.
Schneider
14.8.2006, 15:25
OverHead:
Ну, если взять за истину то что для более-менее достоверного определения частоты, нужно как минимум 0.25 сек, то думаю пофигу каким макром считывается :) Думаю, любая, самая захудалая карта даже через Windows Wave Mapper способна нормально без косяков выдавать 250 миллисекундные буфферы.
Из этого по-твоему следует, что задержка тюнера меньше 250 миллисекунд не получится, так что ли? :)
Здесь нужно имхо уменьшать сильно размер буффера для уменьшения латентности (т.е. времени на "разгон"), и вот тут уже будет важно, через что считывать звук, т.к. увеличивается число обращений к устройству. В принципе пользователю в течении первой секунды необязательно видеть совсем в копеечку правильную и адекватную ноту, ему важно видеть хотя бы что-нибудь, главное чтобы результат показывался оперативно и без тормозов.
А уж тут могут быть проблемы всякого рода.
Sam (OverHead)
14.8.2006, 15:59
Тоже правда.
Я тут был, читал... Понял только цифры: 440, 220, 110 и 44100 =))
Мож я чего не понимаю но мне кажется что не факт что нота ля должна определяться именно по 440 Гц. Там же ещё гармоники идут. Тебе надо как в спектроанализаторе наверное самую "громкую" гармонику выделять - это и будет твоя нота.
ваще зайди на www.sourceforge.net может там есть исходники тюнера. очень не исключено!
LizardKing
15.8.2006, 14:44
janson
+1
Димка
Угу, гляну. Времени вот пока нет, это я для себя с тюнером решил разобраться, на работе совсем другая конопля :-}}
LizardKing (Уфа):
"на работе совсем другая конопля :-}}"
А-а-а-а... вот почему такая тема появилась!!! =))
Да, там тюнеров дофига...
http://sourceforge.net/search/?type_of_search=soft&words=tuner
LizardKing
16.8.2006, 5:53
janson
Дык :-) завод химпромный :-) у нас тут зайцы по территории бегают непуганые... одного заколбасили, так он в темноте светился :-)
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.