Я хочу создать инструмент, который распознает несколько музыкальных нот (я знаю, что это заново изобретает колесо). Поэтому я играл на средних C, D и E на пианино, и он мог классифицировать эти ноты. Вот как я должен подходить к этому:
- Запишите образец моей игры на ноте
- Преобразовать сигнал в частотную область с помощью быстрого преобразования Фурье
- Найдите наиболее частую частоту (в основном, argmax данных в частотной области)
- Предположим, что частота исходит из проигрываемой ноты, и используйте ее для классификации ноты
Я еще ничего не пробовал, потому что не хочу идти по неверному пути. Так, теоретически, это будет работать?
signal-processing
fourier
michaelsnowden
источник
источник
Ответы:
Идея хороша, но вы обнаружите, что она не так проста на практике.
Тональность не просто доминирующий тон, поэтому есть проблема номер 1.
Частоты FFT не могут одновременно исполнять все (или даже несколько) тонов музыкальной гаммы.
Я бы посоветовал поиграть с аудиопрограммой (например, Audacity), которая включает в себя анализатор FFT и генератор тона, чтобы понять, что он может (и не может) делать, прежде чем пытаться реализовать определенную задачу с использованием FFT.
Если вам нужно обнаружить только несколько специфических тонов, вы можете обнаружить, что алгоритм Гертцеля будет проще и быстрее.
Обнаружение основного тона является сложным, и в этой области все еще ведутся исследования. Обнаружение тона довольно простое, но может не дать вам того, что вы хотите.
источник
Я бы сказал, что использование мультимодального окна наблюдения сигнала будет лучше. Что-то вроде вейвлет-разложения вашего аудиосигнала, что позволит вам определить несколько обертонов внутри ноты. Да, на самом деле Wavelets, я бы сказал, это путь.
Это очень обобщенный анализ того, что такое вейвлеты, но думайте о них как о окне с множественным разрешением, которое передает ваш сигнал как STFT. Таким образом, вы можете определить различные синусоиды, которые происходят в разных временных точках вашего сигнала. это также важно, поскольку играемая вами нота не является стационарным сигналом, она воспроизводится, а затем затухает со временем. Я не музыкант, однако я верю, что доминирующий тон меняется на протяжении всего затухания ноты.
Конечно, после вейвлет-разложения вам нужно будет реализовать алгоритмы, которые идентифицируют ноты и периферийные тона.
Я думаю, что вейвлеты действительно решают проблемы, о которых люди говорили в отношении определения высоты тона.
если вы хотите узнать, как работают вейвлеты, это замечательный технический документ, выпущенный HP об этом :) http://www.hpl.hp.com/hpjournal/94dec/dec94a6.pdf и Введение в вейвлеты
для реализации MATLAB имеет инструмент вейвлета, и я уверен, что есть множество других пакетов, доступных для таких платформ, как R и т. д.
источник
Я предполагаю, что вы думаете о нотах, сыгранных в середине диапазона фортепиано (скажем, между 200 и 500 Гц), но даже в этом диапазоне у одной ноты будет много обертонов, которые не являются точными кратными основной частоты, а также значительное количество широкополосного шума в начале каждой ноты и, возможно, также в конце.
Для громких нот в нижней части диапазона нот вы обнаружите, что очень малая звуковая энергия (менее 1%) фактически находится в основной высоте ноты.
Другая проблема заключается в том, что наивная интерпретация БПФ предполагает, что сигнал, который вы пытаетесь обнаружить, имеет постоянную амплитуду. Это не относится к нотам фортепиано, где амплитуда фактически следует за несколькими наложенными экспоненциальными затуханиями - начальная часть затухания имеет относительно короткую постоянную времени, но более поздняя часть имеет более длинную постоянную времени.
Возможно, вам лучше изучить методы кратковременного преобразования Фурье, например, преобразование Габора или методы на основе вейвлетов.
Обратите внимание, что, поскольку основная высота последовательных нот увеличивается примерно на 6% для каждой ноты, вам не обязательно нужна очень высокая точность при определении частот гармоник в аудио. Правильная идентификация музыкальных нот - не совсем та же проблема, что и определение того, точно ли ноты соответствуют музыкальной шкале, где частоты, возможно, должны измеряться с точностью до 0,1%.
источник
Да, это то, что представляет собой БПФ! Чтобы дать вам частотный спектр данных, которые вы вводите. Сложная часть - это детали реализации, как вы уже упоминали.
В зависимости от того, что вы хотите сделать, точно меняется ответ.
Если вы просто хотите проанализировать свою собственную музыку, уже есть программное обеспечение для этого. Вы можете посмотреть на эквалайзеры, которые показывают ответ (в основном, FFT), или получить «музыкальный эквалайзер», который также показывает высоту тона. Вы можете получить аудио в миди VST, которые преобразуют то, что вы играете, в правильные ноты миди. Если у вас клавиатура midi, просто пропустите VST и запишите midi напрямую.
Если вы хотите научить себя БПФ и тому, как оно относится к музыке, то лучше взять что-то вроде Matlab, где вы можете вычислить БПФ любых данных. Он имеет возможность записи, а также воспроизведения наряду с чтением файлов WAV и тому подобное. Этим потом будет действительно легко пользоваться. Вы можете составить график аудио и выполнить все виды анализа довольно быстро, если вы знаете синтаксис.
Если вы хотите создать устройство, чтобы сделать такую вещь, то это довольно сложно. Вам понадобится uC / dsp / fpga / etc для расчетов. Большинство популярных устройств уже поставляются с FFT-кодом, поэтому вам не придется кодировать его самостоятельно (также сложно).
Вам нужно будет построить схему и все такое. Это не сложно, но в зависимости от вашего опыта / знаний это может занять довольно много времени и имеет крутой кривой обучения. Это также зависит от качества конечного продукта.
Математически идеальная музыкальная нота состоит из геометрической серии «фундаментальных».
Предположим, что F0 является основной частотой, тогда большинство музыкальных нот будут аппроксимированы как F (t) + F0 * sum (a_k e ^ (2 ^ k F0 * pi i t)) = F0 + a_1 * F1 + a_2 * F2 +. ...
A_k - это сила этих высоких частот, F_k и F_k просто кратны F0. Если a_k = 0 для всех k, то мы имеем чистую синусоиду. Шаг этого легко обнаружить. Просто найдите максимум БПФ, и эта частота является основой тона = музыкальной ноты.
Когда вы берете БПФ, вы в конечном итоге с данными, и просто делать математику. Это в основном исчисление.
Все это относительно просто.
Некоторые проблемы, с которыми вам придется иметь дело. Обратите внимание, что не все из них «решены».
Задержка - если вы собираетесь делать какие-либо вещи в реальном времени, это может стать проблемой.
Несколько нот - Сложно определить группу нот из-за всех дополнительных гармоник. Если играть A = 440 Гц и A '= 880 Гц, большинство гармоник будут перекрываться. Вы можете легко получить A = 440 Гц, но получить A '= 880 Гц сложнее. Когда вы думаете о аккордах, быстрых пробегах и т. Д., Тогда может быть очень трудно точно получить всю информацию (примечания). Хотя все, как правило, возможно математически, сами данные имеют ошибки и аберрации, а в некоторых случаях уравнения недостаточно определены.
Шум - Шум в сигнале может дать ложные результаты. Если возникает музыкальный шум, это может испортить ваши результаты. Тогда потребуются лучшие алгоритмы = время + деньги + знания.
источник