Могу ли я использовать БПФ для распознавания музыкальных нот на фортепиано?


13

Я хочу создать инструмент, который распознает несколько музыкальных нот (я знаю, что это заново изобретает колесо). Поэтому я играл на средних C, D и E на пианино, и он мог классифицировать эти ноты. Вот как я должен подходить к этому:

  1. Запишите образец моей игры на ноте
  2. Преобразовать сигнал в частотную область с помощью быстрого преобразования Фурье
  3. Найдите наиболее частую частоту (в основном, argmax данных в частотной области)
  4. Предположим, что частота исходит из проигрываемой ноты, и используйте ее для классификации ноты

Я еще ничего не пробовал, потому что не хочу идти по неверному пути. Так, теоретически, это будет работать?


Было бы неплохо, если бы вы могли быть более конкретным в названии. Я попытался рассказать немного о распознавании высоты звука на фортепиано, но мой (не родной) английский сегодня явно подводит меня.
труба

1
@pipe хорошо, я изменил это
michaelsnowden

1
Ваш «образец» воспроизведения ноты уже должен быть амплитудой и временем. По сути, пункт 2 является избыточным. Для относительно простой реализации вышеприведенных шагов должно быть просто отлично.
user2943160

@ user2943160 Я добавил это, чтобы быть явным. Звук может быть сохранен во многих форматах, и обычно требуется некоторое искажение, чтобы получить хорошую амплитуду с течением времени.
michaelsnowden

@michaelsnowden: Вы используете термин «амплитуда» неправильно: амплитуда синусоидальной функции является . Это максимум сигнала (напряжение, смещение, ...), и он постоянный (или медленно изменяется по отношению к частоте). То, что вы имеете в виду, это просто сигнал . В противном случае я бы под «амплитудой во времени» думал, что вы подразумеваете огибающую сигнала, но, насколько я понимаю, вы этого не делаете. Y(T)знак равноAгрех(ωT)AY(T)
Творог

Ответы:


23

Идея хороша, но вы обнаружите, что она не так проста на практике.

Тональность не просто доминирующий тон, поэтому есть проблема номер 1.

Частоты FFT не могут одновременно исполнять все (или даже несколько) тонов музыкальной гаммы.

Я бы посоветовал поиграть с аудиопрограммой (например, Audacity), которая включает в себя анализатор FFT и генератор тона, чтобы понять, что он может (и не может) делать, прежде чем пытаться реализовать определенную задачу с использованием FFT.

Если вам нужно обнаружить только несколько специфических тонов, вы можете обнаружить, что алгоритм Гертцеля будет проще и быстрее.

Обнаружение основного тона является сложным, и в этой области все еще ведутся исследования. Обнаружение тона довольно простое, но может не дать вам того, что вы хотите.


Если мы начнем с предположения о том, что образцы относятся к конкретному инструменту, проблема может быть немного проще, верно?
mkeith

Это выглядит действительно хорошо. Один из последующих вопросов: можно ли использовать алгоритм Гертцеля для обнаружения двух нот, которые воспроизводятся одновременно?
michaelsnowden

Может использоваться для обнаружения одновременных тонов. Достаточно ли этого для обнаружения одновременных заметок - это другой вопрос, над которым я все еще работаю. У меня есть детектор гитарных нот на основе Goertzel, который я искал в течение многих лет.
JRE

2
@mkeith: вроде. Вы можете проверить ноты и посмотреть, подходит ли обнаружение преобладающего тона для конкретного инструмента (и, может быть, только интересующих нот). Насколько я знаю, общего решения для обнаружения всех нот со всех инструментов не существует.
JRE

3

Я бы сказал, что использование мультимодального окна наблюдения сигнала будет лучше. Что-то вроде вейвлет-разложения вашего аудиосигнала, что позволит вам определить несколько обертонов внутри ноты. Да, на самом деле Wavelets, я бы сказал, это путь.

Это очень обобщенный анализ того, что такое вейвлеты, но думайте о них как о окне с множественным разрешением, которое передает ваш сигнал как STFT. Таким образом, вы можете определить различные синусоиды, которые происходят в разных временных точках вашего сигнала. это также важно, поскольку играемая вами нота не является стационарным сигналом, она воспроизводится, а затем затухает со временем. Я не музыкант, однако я верю, что доминирующий тон меняется на протяжении всего затухания ноты.

Конечно, после вейвлет-разложения вам нужно будет реализовать алгоритмы, которые идентифицируют ноты и периферийные тона.

Я думаю, что вейвлеты действительно решают проблемы, о которых люди говорили в отношении определения высоты тона.

если вы хотите узнать, как работают вейвлеты, это замечательный технический документ, выпущенный HP об этом :) http://www.hpl.hp.com/hpjournal/94dec/dec94a6.pdf и Введение в вейвлеты

для реализации MATLAB имеет инструмент вейвлета, и я уверен, что есть множество других пакетов, доступных для таких платформ, как R и т. д.


1

Я предполагаю, что вы думаете о нотах, сыгранных в середине диапазона фортепиано (скажем, между 200 и 500 Гц), но даже в этом диапазоне у одной ноты будет много обертонов, которые не являются точными кратными основной частоты, а также значительное количество широкополосного шума в начале каждой ноты и, возможно, также в конце.

Для громких нот в нижней части диапазона нот вы обнаружите, что очень малая звуковая энергия (менее 1%) фактически находится в основной высоте ноты.

Другая проблема заключается в том, что наивная интерпретация БПФ предполагает, что сигнал, который вы пытаетесь обнаружить, имеет постоянную амплитуду. Это не относится к нотам фортепиано, где амплитуда фактически следует за несколькими наложенными экспоненциальными затуханиями - начальная часть затухания имеет относительно короткую постоянную времени, но более поздняя часть имеет более длинную постоянную времени.

Возможно, вам лучше изучить методы кратковременного преобразования Фурье, например, преобразование Габора или методы на основе вейвлетов.

Обратите внимание, что, поскольку основная высота последовательных нот увеличивается примерно на 6% для каждой ноты, вам не обязательно нужна очень высокая точность при определении частот гармоник в аудио. Правильная идентификация музыкальных нот - не совсем та же проблема, что и определение того, точно ли ноты соответствуют музыкальной шкале, где частоты, возможно, должны измеряться с точностью до 0,1%.


0

Да, это то, что представляет собой БПФ! Чтобы дать вам частотный спектр данных, которые вы вводите. Сложная часть - это детали реализации, как вы уже упоминали.

В зависимости от того, что вы хотите сделать, точно меняется ответ.

Если вы просто хотите проанализировать свою собственную музыку, уже есть программное обеспечение для этого. Вы можете посмотреть на эквалайзеры, которые показывают ответ (в основном, 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, то мы имеем чистую синусоиду. Шаг этого легко обнаружить. Просто найдите максимум БПФ, и эта частота является основой тона = музыкальной ноты.

Когда вы берете БПФ, вы в конечном итоге с данными, и просто делать математику. Это в основном исчисление.

Все это относительно просто.

Некоторые проблемы, с которыми вам придется иметь дело. Обратите внимание, что не все из них «решены».

  1. Задержка - если вы собираетесь делать какие-либо вещи в реальном времени, это может стать проблемой.

  2. Несколько нот - Сложно определить группу нот из-за всех дополнительных гармоник. Если играть A = 440 Гц и A '= 880 Гц, большинство гармоник будут перекрываться. Вы можете легко получить A = 440 Гц, но получить A '= 880 Гц сложнее. Когда вы думаете о аккордах, быстрых пробегах и т. Д., Тогда может быть очень трудно точно получить всю информацию (примечания). Хотя все, как правило, возможно математически, сами данные имеют ошибки и аберрации, а в некоторых случаях уравнения недостаточно определены.

  3. Шум - Шум в сигнале может дать ложные результаты. Если возникает музыкальный шум, это может испортить ваши результаты. Тогда потребуются лучшие алгоритмы = время + деньги + знания.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.