Список вопросов
Как зайти в Даркнет?!
25th January, 01:11
4
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
892
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4380
0
Помогите пожалуйста решить задачи
24th November, 23:53
6084
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4395
0
Метода Крамера С++
23rd October, 11:55
4308
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2598
0
Алгоритмы для обработки и анализа звука
Просмотров: 379
 
Ответов: 4
Хочется написать свой программный тюнер для гитары (на подобии AP Guitar Tuner), но к сожалению я в этой теме совершенно не ориентируюсь. Примерно себе представляю, что для этого нужно, но как подступиться к проблеме не знаю. Посоветуйте ресурсы или литературу на соответствующую тематику. Спасибо.
musicdsp.org и евонный форум, и e-mail рассылка.
На русском — любая книжка по цифровой обработке сигналов даст нормальную базу.
По вашей ситуации алгоритм такой:
микрофон(звук)=>АЦП(цифровой массив)=>оконное FFT(массив комплексных чисел)=>массив амплитуд(массив действительных чисел)=>относительная частота максимума=>частота максимума=>нота
Для вашей ситуации нужно знать api снятия звука с микрофона. Api будет выдавать порции звука кусками, допустим, по 1024 float'а. (При частоте дискретизации 44100 это будет 44100/1024 = 43 миллисекунды).
К этому куску нужно применить оконное быстрое преобразование Фурье (FFT), поищите где-нибудь нормальную статью, в котором оно объясняется (пригодится книжка по цифровой обработке сигналов). В интернете есть куча библиотечных функций.
Чтобы знать, что преобразование вообще делает, советую поставить Adobe^W Audition^W бесплатный аудиоредактор со спектроанализатором и посмотреть, что делается со звуком разных нот, на что влияет размер окна и т. п. Мозг сам по себе тоже работает со спектром, а не с самим сигналом, поэтому интуитивно все понимается на ура.
У FFT, чем больше данных, тем большее спектральное разрешение. Для нужного разрешения, может быть нужно FFT'ить 8192 байта, или около того. FFT выдаст массив из 8192 комплексных чисел, модуль каждого из этих чисел даст амплитуду спектра. При этом значения 4096-8191 будут зеркальной копией 0-4095, такова особенность алгоритма. У комплексных чисел можно получить амплитуду, фаза в данном случае не нужна, а амплитуда — sqrt(re^2+im^2). Ну а дальше поиском максимума в массиве.
Максимум будет относительной частотой (массив-то 0-4095, а частоты 0-44100/2). Чтобы перевести абсолютную в относительную, нужно по пропорции умножить на 44100/8192. Т.е. на частоту дискретизации деленную на размер окна FFT. И теперь перевести частоту в ноту. Там экспоненциальная зависимость (частота следующей ноты выше частоты предыдущей в корень двенадцатой степени из двух), с помощью таблички вида (A4 440; A#4 465.96] найти ближайшую не сложно.
Рекомендую прекрасный пример на Codeproject, рабочий тюнер, написанный на C#. Для быстрого преобразования Фурье как правило используют библиотеку FFTW
Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться