![]() |
|
![]() ![]() ![]() |
|
Kpeved |
|
|||
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 26.2.2012 Репутация: нет Всего: нет |
В общем задача следующая - необходимо реализовать гитарный тюнер - мы играем ноту и нам с определённой точностью выводится её частота , мы крутим колки гитары в нужную сторону и таким образом настраиваем .
Итак , изначально я решил что лучше всего для этого подойдет алгоритм 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 !! Может быть я его неправильно понял ? Но вопрос все таки в следующем - каким образом можно получить частоту играемой ноты максимально точно ? Буду очень благодарен ![]() |
|||
|
||||
Pavia |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
Есть высокие частоты, есть низкие. Вот низкие частоты 20Гц и ниже ухо не воспринимает ввиду того есть определённые сложности с его определением и восприятием. А да не только ухо но и нелюбой микрофон способен воспринимать низкие частоты. Что касается точности то она зависит от метода определения для FFT можете использовать следующую формулу 1/(N/(fd/f))=fd/(f*N)
N- число принятых байт fd- частота дискретизации f - нужная частота. Да для 1Гц точность не велика, но уже для f=20Гц она уже 1/20=0.05 А так еще совет применять оконные функции они помогут решить проблемы. Для низких частот точность можно повысить если искать отфильтровать высокии частоты и искать переходы через 0. И уже оттуда отсчитывать корреляцию. |
|||
|
||||
Kpeved |
|
|||
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 26.2.2012 Репутация: нет Всего: нет |
Pavia, Но разве точность частоты не одинаковая на протяжении всего ЧР ?- currFreq= sampleFreq * i / N
где sampleFreq- ЧД i - номер в массиве , нужный нам N- размер окна . Получается что чем больше окно и меньше ЧД- тем больше точность Например для точности в 1Гц на значение нам получается нужно брать окно в 8к значений (для чд в 8кГц) . Что займет целую секунду . Ведь золотое правило преобр фурье звучит так - проигрывая по времени мы выигрываем по частоте , и наоборот . Я же не понимаю - как можно за 100-150 мс быстро считать и рассчитать фурье и вывести это с точностью в 0.1 Гц ! Недавно даже на ютюбе видел мужикак который сделал политюнер - и показывал спектр который почти мгновенно реагировал на любой звук. Да , низкие частоты фурье давит , АКФ же наоборот расчитывает очень точно . Наверно в фурье придется умножать на какой нибудь угосающий коэффициент чтобы их выровнять . Оконные функции я использовал - выбрал блэкмена за самую яркую амплитуду. Также пробовал HPS - но работает очень медленно и результаты не из лучших .
Да я думаю для НЧ поможет . Но проблема в АКФ была в высоких частотах - они очень неточные . Нужна большая ЧД . |
|||
|
||||
Pavia |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
Kpeved,
Видимо под точностью мы разные термины понимаем. Вот это посмотрите то или не то? http://www.numerix-dsp.com/zoomfft.html Во вот тут лучше описано. На русском еще не видел, не искал. http://arc.id.au/ZoomFFT.html |
|||
|
||||
Kpeved |
|
|||
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 26.2.2012 Репутация: нет Всего: нет |
Ну скорее всего подойдет, если оно работает ). Можно взять спектр 40- 1000Гц и расширить его , либо находить частоту , а потом расширять .
Ещё где то нашёл , что можно записать только часть сигнала а все остальное заполнить нулями . Но даже не знаю , будет ли необходимая точность если я например запишу 1024 значения с чд 8к , а фурье возьму по 64К значений. Zoom FFT в принципе будет побыстрее и поточнее , но и в понимании сложнее ) |
|||
|
||||
vedun |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 23.12.2010 Репутация: 2 Всего: 2 |
|
||||
|
|||||
Kpeved |
|
|||
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 26.2.2012 Репутация: нет Всего: нет |
vedun, спасибо за книжки , но мне бы примеры реализации . Неохота в этой математике копаться .
Кстати разобрал один тюнер - использует фурье но только для определения автокореляции . Мне это в принципе не подходит , так как хочется сделать поли тюнер - сразу для всех струн . |
|||
|
||||
vedun |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 23.12.2010 Репутация: 2 Всего: 2 |
А не подскажите как вы с помощю автокорреляции определяли частоту? Вы считали автокореляцию записного сигнала гитары? Эх, мне уже самому интересно стало, надо будет попробовать написать фурье "считтатель частоты". Жалко со временем напряжёнка. Я правильно понял что вам надо мерять частоту в диапазоне 20..2000 Гц ? Да и гитара ведь не даёт читстый тон, там в спектре наверно есть высшие гармоники, или их влиянием можно пренебречь ? |
|||
|
||||
Kpeved |
|
|||
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 26.2.2012 Репутация: нет Всего: нет |
vedun, сама по себе формула очень простая . Вот тут она есть . Мы умножаем друг на друга 2 числа с изменяемым смещением и их суммируем . И выходит что если смещение соотв периоду и в этой точке мы имеем макс значение , то значит это он и есть .Вообще на выходе получается очень резкий график и различить визуально нужный период не составляет труда . Потом ЧД делим на индекс с макс значением (смещение, период) и получаем частоту .
Это кстати довольно тяжелый алгоритм - х^2 , против х*logx у фурье , поэтому и используют фурье как ф-ю автокорреляции -не знаю точно как - вроде берут прямое и инверсное преобразование и нормализуют между ними. Работает так : считывается звук с микрофона , преобразуется с акв, ищется период и переводится в частоту . Из недостатков этого метода то что даже при макс чд в 44100 шаг частоты на 300 -400 гц составляет 8 гц , на 86 Гц (нижняя струна ) 0.2 Гц . Касательно гармоник - как таковые в графике акв отсутствуют .Есть только пики с удвоенным , утроенным , н-ым периодом . Ноту это определить никак не помешает , частоту в редких случаях . Да , и как говорит википедия полифонические звуки он не поддерживает , поэтому мне остается только фурье, если конечно нету других способов . |
|||
|
||||
vedun |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 23.12.2010 Репутация: 2 Всего: 2 |
Kpeved напишите чётко требования по точночти и диапазону, я может на выходных или раньше когда будет время попробую сделать. Мне надо:
|
|||
|
||||
ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 2 Всего: 17 |
Если нужно проверить наличие одной конкретной частоты, то ДПФ - да, не очень подходит. Я слышал, что для этого подходит алгоритм Гёрцеля (Goertzel).
-------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
vedun |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 23.12.2010 Репутация: 2 Всего: 2 |
Алгоритм Герцеля - это расчёт одного спектрального отсчёта ДПФ. Фактически это полосовой фильтр на конкретную частоту. Его можно использовать как индикатор наличия/отсутствия сигнала на заданой частоте. Но автору как я понял надо именно измерить эту частоту в довольно широком диапазоне. |
|||
|
||||
Kpeved |
|
|||
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 26.2.2012 Репутация: нет Всего: нет |
vedun, 1. Диапазон 70 - 400 Гц - для стандартного строя - это минимум . Но если вдруг например я захочу проверить мензуру (буду играть на 12м или на 24м ладу) или решу на тон - 2 выше перестроить , то этого мало . В идеале - до 1700 -2000 Гц
2. Понятия не имею как это можно сделать . Да и зачем . Разве только для увеличения точности - тогда буду рад услышать какой нибудь интересный алгоритм ). 3. Точность в идеале +-0.1 Гц . Ну ещё можно допустить в среднем +-0.3 . На высоких частотах +-1Гц , ткак и расстояние между нотами там больше . 4. Спектрограмма исходного сигнала ниже . Микрофон - дешёвый Genius - прищепка .Инструмент - дешёвая китайская электро гитара - НЕ подключенная (вообще - худший случай для настройки . если тюнер может её в таком состоянии настроить , то значит настроит все что угодно )) ЧД - 44100 , PCM 16bit . Позже выложу файлы с самой записью . Играю по очереди с самой нижней по верхнюю струны + в конце на самой высокой струне 24й лад (х4 самой высокой струны ) ![]() п.с . Пайнт немного подпортил спектрограмму , но все равно видно .) |
|||
|
||||
vedun |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 23.12.2010 Репутация: 2 Всего: 2 |
Попробовал поиграться в матлабе с квадратичной интерполяцией ДПФ, предварительно результат такой:
Для диапазона 50 Гц ... 2750 Гц и точности +- 0.1 Гц достаточно 4096 точек + дециматор понижающий тактовую частоту в 8 раз. Либо, если это возможно захватывать данные с тактовой частотой около 5...6 кГц (не знаю возможно ли это сделать). Если делать дециматор, на точность это не повлияет а только увеличит вычислительную нагрузку. Завтра распишу подробнее как получить этот результат, а то уже позно, и пора спать ![]() |
|||
|
||||
Pavia |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
vedun,
Берем записанные данные, массив А кратные 2^n. Создаешь массив новой длины B A[0],0, 0, 0, 0,0....,0,A[1],0,0,0,0,..,0,A[2],.... Для ваших требований подойдет по 15 нулей. Точность повыситься в 16 раз, если надо больше бери больше нулей. После делаешь БПФ. Дальше в виду того что это инструмен ишешь самую большую гармонику. Только не на всем диапазоне частот вч частоты Обычная передескритезация. Только фильтровать не нужно так как это лишняя операция. А.Б.Сергиенко_Цифровая обработка сигналов |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |