В этой статье речь пойдет про гитарный тюнер, написанный на языке C#. Кратко рассмотрим структуру программы и основной алгоритм. Исходник можно скачать, нажав кнопку внизу страницы.
Компьютер может захватывать живой звук/музыку с помощью микрофона, подключенного к звуковой плате. Современные звуковые платы могут записывать цифровые сигналы. Цифровой сигнал — это набор дискретных звуковых значений, которые равномерно расположены в звуковом интервале. Цифровой сигнал не предоставляет никакой информации о частотах, которые присутствуют в звуке. Чтобы определить их, данные должны быть проанализированы.
Оконное преобразование Фурье (ОПФ) дает изображение фазы и амплитуды сигнала. Результаты ОПФ могут быть использованы для создания спектрограммы сигналов: квадратичного частотно-временного распределения. Мы будем использовать Быстрое преобразование Фурье (БПФ), чтобы сгенерировать спектрограммы сигналов на короткие периоды времени. После того, как спектрограммы рассчитывается, фундаментальная частота может быть определена путем нахождения индекса максимального значения величины в квадрате. Алгоритм находит несколько таких мест-«кандидатов», с величиной: максимальное значение в квадрате, в дальнейшем анализирует их, чтобы убедиться в правильности найденной частоты из данных сигналов.
Одной из характеристик музыкальной ноты является высота звука. Традиционно музыкальный алфавит частот делится на октавы, а затем на полутона. В октаве 12 именованных полей: C, C#, D, D#, E, F, F#, G, G#, A, A#, и B(H). Октавы также имеют названия: большая, малая, первая, вторая и т.д. Стандартная высота звука (A в первой октаве или A4) имеет частоту 440 Гц. Частоты двух соседних нот отличаются в 21/12 раза, а частоты нот с тем же именем в двух соседних октавах различаются в 2 раза.
Ноты и их частоты (Гц):
Жирным шрифтом выделены частоты нот, извлекаемых на открытых струнах шестиструнной гитары.
Решение содержит три проекта: главное приложение (GuitarTuner), библиотеку звукового анализа (SoundAnalysis), и библиотеку захвата звука (SoundCapture). Основой решения задачи является алгоритм БПФ (см. метод расчета в классе SoundAnalysis.FftAlgorithm):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
// реверсирование ComplexNumber[] data = new ComplexNumber[length]; for (int i = 0; i < x.Length; i++) { int j = ReverseBits(i, bitsInLength); data[j] = new ComplexNumber(x[i]); } // БПФ for (int i = 0; i < bitsInLength; i++) { int m = 1 << i; int n = m * 2; double alpha = -(2 * Math.PI / n); for (int k = 0; k < m; k++) { // e^(-2*pi/N*k) ComplexNumber oddPartMultiplier = new ComplexNumber(0, alpha * k).PoweredE(); for (int j = k; j < length; j += n) { ComplexNumber evenPart = data[j]; ComplexNumber oddPart = oddPartMultiplier * data[j + m]; data[j] = evenPart + oddPart; data[j + m] = evenPart - oddPart; } } } // вычисление спектрограммы double[] spectrogram = new double[length]; for (int i = 0; i < spectrogram.Length; i++) { spectrogram[i] = data[i].AbsPower2(); } |
Данные для программы поступают со звуковой карты. Абстрактные класс SoundCapture.SoundCaptureBase это служебный класс — адаптер для DirectSound и CaptureBuffer классов, которые позволяют выполнить буферизацию и настройку параметров аудио формата. Приложение требует наличия компонентов Microsoft DirectX 9 для захвата звука с микрофона.
Про быстрое преобразование Фурье можно почитать здесь, а про оконное преобразование Фурье здесь.
Интерфейс программы представлен на рисунках ниже. Главное окно:
После нажатия кнопки «Старт», выбираем устройство захвата:
Программа в действии:
Скачать исходник
Поделиться в соц. сетях:
Добрий день.
Может кто помочь с даной програмой.????
При запуске самого тюнера вилетает ошибка, точнее при нажатии кнопки старт..
пишет : :не удалось загрузить файл или зборку «soundCapture. Version=1.0.0.0. Culture. Public Key Token=null» либо одну из их зависимостей. не удаетса найти указаний файл:
у меня VS 2013 (update 4)
Здравствуйте. При нажатии кнопки старт появляется окно выбора устройства, захватывающего звук (микрофона). У вас вылетает ошибка, значит программа не может получить список устройств. Возможно имеются проблемы со звуковым драйвером.
да, дело в этом,
тогда как можна решить ету проблему? подскажите , пожалуйста
может обновить драйвер??
Да, попробуйте обновить. Или можете его переустановить: сначала удалите звуковое устройство из «диспетчера устройств», а затем установите драйвер.
проблему с директХ решил решение( скачал )
но появилась другая:
BadImageFormatException не обработанно
Необработанное исключение типа «System.BadImageFormatException» в FftGuitarTuner.exe
Дополнительные сведения: не является приложением Win32. (Исключение из HRESULT: 0x800700C1)
проблему с директХ решил (скачал mDX Runtime .NET 4.0 x64 установил оттуда добавил сборку Microsoft.DirectX.DirectSound)