Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как определить точную частоту звукового сигнала, какой алгоритм лучше использовать ? 
:(
    Опции темы
Kpeved
Дата 26.2.2012, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 !!   Может быть я его неправильно понял ?
 Но вопрос все таки в следующем - каким образом можно получить частоту играемой ноты максимально точно ? Буду очень благодарен   smile   
PM MAIL   Вверх
Pavia
Дата 26.2.2012, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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. И уже оттуда отсчитывать корреляцию.
PM MAIL   Вверх
Kpeved
Дата 26.2.2012, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 26.2.2012

Репутация: нет
Всего: нет



Pavia, Но разве точность частоты не одинаковая на протяжении всего ЧР ?-  currFreq= sampleFreq * i / N
где 
sampleFreq- ЧД
i - номер в массиве , нужный нам 
N- размер окна . 

Получается что чем больше окно и меньше ЧД- тем больше точность 

Например для точности в 1Гц на значение нам получается нужно брать окно в 8к значений (для чд в 8кГц) . Что займет целую секунду .
Ведь золотое правило преобр фурье звучит так - проигрывая по времени мы выигрываем по частоте , и наоборот . 

Я же не понимаю - как можно за 100-150 мс быстро считать и рассчитать фурье и вывести это с точностью в 0.1 Гц !
Недавно даже на ютюбе видел мужикак который сделал политюнер - и показывал спектр который почти мгновенно реагировал на любой звук.

Да , низкие частоты фурье давит , АКФ же наоборот расчитывает очень точно .  Наверно в фурье придется умножать на какой нибудь угосающий коэффициент чтобы их выровнять .

Оконные функции я использовал - выбрал блэкмена за самую яркую амплитуду.
Также пробовал HPS - но работает очень медленно и результаты не из лучших .

Цитата

Для низких частот точность можно повысить если искать отфильтровать высокии частоты и искать переходы через 0. И уже оттуда отсчитывать корреляцию. 

Да я думаю для НЧ поможет . Но проблема в АКФ была в высоких частотах - они очень неточные  . Нужна большая ЧД .
PM MAIL   Вверх
Pavia
Дата 26.2.2012, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 6.12.2008

Репутация: 11
Всего: 12



Kpeved
Видимо под точностью мы разные термины понимаем.

Вот это посмотрите то или не то?
http://www.numerix-dsp.com/zoomfft.html 
Во вот тут лучше описано. На русском еще не видел, не искал.
http://arc.id.au/ZoomFFT.html
PM MAIL   Вверх
Kpeved
Дата 27.2.2012, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 26.2.2012

Репутация: нет
Всего: нет



Ну скорее всего подойдет, если оно работает ). Можно взять спектр 40- 1000Гц и расширить его , либо находить частоту , а потом расширять .

 Ещё где то нашёл , что можно записать только часть сигнала  а все остальное заполнить нулями .  Но даже не знаю , будет ли необходимая точность если я например запишу 1024 значения с чд 8к , а фурье возьму по 64К значений.  Zoom FFT в принципе будет побыстрее и поточнее , но и в понимании сложнее )
PM MAIL   Вверх
vedun
Дата 27.2.2012, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 23.12.2010

Репутация: 2
Всего: 2



Цитата(Kpeved @ 26.2.2012,  14:43)
...Я видел тюнеры которые за доли секунды настраивали с точностью в 0.1 Гц !!...
 Года 4 назад копал вопрос оценки частоты на ограниченом интервале. С тех пор осталась подборка статей, возможно они вам помогут. Могу сказать что за несколько милисекунд расчитать частоту до 0.1 Гц вполне реалистично при ваших частотах дискретизации. Для повышения точности обычно результат ДПФ интерполируют, но какой это даёт прирост по точности не помню уже, там в статьях есть графики для разных методов интерполяции. Ещё помнится для реального сигнала оценка получается смещённой в зависимости от того где находится измеряемая частота по отношению к частоте дискретизации, это тоже где то в статьях есть. Там же приведены способы борьбы с этим явлением. Использование оконных функций если мне память не изменяет тоже даёт смещение по частоте.

Цитата(Kpeved @ 26.2.2012,  14:43)

Скачал пару оупен соурсов , покапался , ничего не понял кроме того , что они все таки используют FFT !! 
 В какойто книге по стаистической радиотехнике видел вывод формул максимально правдоподобной оценки параметров синусоиды на фоне гаусового шума. Эти формулы в итоге включали в себя преобразование фурье от входных отсчётов сигнала. Возможно поэтому везеде фурье и применяют.
PM ICQ Skype Jabber   Вверх
Kpeved
Дата 29.2.2012, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 26.2.2012

Репутация: нет
Всего: нет



vedun, спасибо за книжки , но мне бы примеры реализации . Неохота в этой математике копаться .

Кстати разобрал один тюнер - использует фурье но только для определения автокореляции . Мне это в принципе не подходит , так как хочется сделать поли тюнер - сразу для всех струн . 
PM MAIL   Вверх
vedun
Дата 29.2.2012, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 23.12.2010

Репутация: 2
Всего: 2



Цитата(Kpeved @ 29.2.2012,  00:41)
 Кстати разобрал один тюнер - использует фурье но только для определения автокореляции...

А не подскажите как вы с помощю автокорреляции определяли частоту? Вы считали автокореляцию записного сигнала гитары? Эх, мне уже самому интересно стало, надо будет попробовать написать фурье "считтатель частоты". Жалко со временем напряжёнка. Я правильно понял что вам надо мерять частоту в диапазоне 20..2000 Гц ? Да и гитара ведь не даёт читстый тон, там в спектре наверно есть высшие гармоники, или их влиянием можно пренебречь ?
PM ICQ Skype Jabber   Вверх
Kpeved
Дата 29.2.2012, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 26.2.2012

Репутация: нет
Всего: нет



vedun, сама по себе формула очень простая . Вот тут она есть . Мы умножаем друг на друга 2 числа с изменяемым смещением и их суммируем . И выходит что если смещение соотв периоду и в этой точке мы имеем макс значение , то значит это он и есть .Вообще на выходе получается очень резкий график и различить визуально нужный период не составляет труда . Потом ЧД  делим на индекс с макс значением (смещение, период) и получаем частоту . 
Это кстати довольно тяжелый алгоритм - х^2 , против х*logx у фурье , поэтому и используют фурье как ф-ю автокорреляции -не знаю точно как - вроде берут прямое и инверсное преобразование и нормализуют между ними.

Работает так : считывается звук с микрофона ,  преобразуется с акв, ищется период и переводится в частоту . 
Из недостатков этого метода то что даже при макс чд в 44100  шаг частоты на 300 -400 гц составляет 8 гц , на 86 Гц (нижняя струна )  0.2 Гц .
Касательно гармоник - как таковые в графике акв отсутствуют .Есть только пики с удвоенным , утроенным , н-ым периодом . Ноту это определить никак не помешает , частоту в редких случаях . Да , и как говорит википедия полифонические звуки он не поддерживает , поэтому мне остается только фурье, если конечно нету других способов . 
PM MAIL   Вверх
vedun
Дата 29.2.2012, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 23.12.2010

Репутация: 2
Всего: 2



Kpeved напишите чётко требования по точночти и диапазону, я может на выходных или раньше когда будет время попробую сделать. Мне надо:
  •  Диапазон в котором мы измеряем частоту. 20..22000 Гц ?
  •  Можно ли разбить весь диапазон на поддиапазоны и переключать их вручную ?
  •  Точность с которой надо померять частоту. +- сколько герц ?
  •  Было бы неплохо посмотреть на исходный сигнал. К сожалению гитары и микрофона под рукой нет smile

PM ICQ Skype Jabber   Вверх
ksili
Дата 29.2.2012, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 2
Всего: 17



Если нужно проверить наличие одной конкретной частоты, то ДПФ - да, не очень подходит. Я слышал, что для этого подходит алгоритм Гёрцеля (Goertzel).


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
vedun
Дата 29.2.2012, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 23.12.2010

Репутация: 2
Всего: 2



Цитата(ksili @ 29.2.2012,  19:42)
Если нужно проверить наличие одной конкретной частоты, то ДПФ - да, не очень подходит. Я слышал, что для этого подходит алгоритм Гёрцеля (Goertzel).

Алгоритм Герцеля - это расчёт одного спектрального отсчёта ДПФ. Фактически это полосовой фильтр на конкретную частоту. Его можно использовать как индикатор наличия/отсутствия сигнала на заданой частоте. Но автору как я понял надо именно измерить эту частоту в довольно широком диапазоне.
PM ICQ Skype Jabber   Вверх
Kpeved
Дата 29.2.2012, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 самой высокой струны )
user posted image
п.с . Пайнт немного подпортил спектрограмму , но все равно видно .)
PM MAIL   Вверх
vedun
Дата 1.3.2012, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 23.12.2010

Репутация: 2
Всего: 2



Попробовал поиграться в матлабе с квадратичной интерполяцией ДПФ, предварительно результат такой:
Для диапазона 50 Гц ... 2750 Гц и точности +- 0.1 Гц достаточно 4096 точек + дециматор понижающий тактовую частоту в 8 раз. Либо, если это возможно захватывать данные с тактовой частотой около 5...6 кГц (не знаю возможно ли это сделать). Если делать дециматор, на точность это не повлияет а только увеличит вычислительную нагрузку. Завтра распишу подробнее как получить этот результат, а то уже позно, и пора спать smile
PM ICQ Skype Jabber   Вверх
Pavia
Дата 1.3.2012, 05:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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 раз, если надо больше бери больше нулей.
После делаешь БПФ. 
Дальше  в виду того что это инструмен ишешь самую большую гармонику. Только не на всем диапазоне частот вч частоты 

Обычная передескритезация. Только фильтровать не нужно так как это лишняя операция.

А.Б.Сергиенко_Цифровая обработка сигналов
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0821 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.