Определение высоты тона c использованием нейронных сетей

Я пытаюсь использовать ANN для обнаружения тона музыкальных нот. Сеть представляет собой простой двухслойный MLP, входы которого в основном являются DFT (усредненными и логарифмически распределенными), а 12 выходов соответствуют 12 нотам определенной октавы.

сеть обучается с несколькими образцами этих 12 нот, играемых каким-либо инструментом (по одной ноте за раз), и несколькими образцами "тишины".

результаты на самом деле хорошие. Сеть может обнаружить те ноты, которые играют разные инструменты, точно, это относительно Амуна к шуму, и даже не теряет здравомыслия полностью, когда играет песня.

цель, однако, состоит в том, чтобы иметь возможность обнаруживать полифонический звук. Так что, когда две или более ноты играют вместе, два соответствующих нейрона будут срабатывать. Удивительно то, что сеть фактически уже делает это в некоторой степени (обучаясь только монофоническим образцам), однако менее последовательно и менее точнее, чем для монофонических нот. Мой вопрос: как я могу повысить его способность распознавать polyphnic звук?

проблема в том, что я действительно не понимаю, почему это действительно работает. Различные заметки (или их DFT) - это в основном разные точки в пространстве, для которых обучается сеть. Поэтому я вижу, почему он распознает похожие звуки (близлежащие точки), но не то, как он" завершает " вывод для комбинации нот (которые образуют отдаленную точку от каждого из тренировок образцы.) Таким же образом и сеть, которая обучается (0,0) (0,1) (1,0) = (0), не ожидается, что "заключим", что (1,1) = (1).

грубая сила aprroach к этому-тренировать сеть с как можно большим количеством полифонических образцов. Однако, поскольку сеть представляется как-то смутно уловить мысль из образцов одноголосный, наверное, больше fundemential здесь.

какие-нибудь советы? (извините за длину, кстати :).

4 ответов


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

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

кстати, почему вы используете нейросети для этого в первую очередь? Кажется, что просто глядя на DFT и, скажем, принимая максимальную частоту, вы получите лучшие результаты легче.


Ансси Klapuri является уважаемым исследователем аудио, который опубликовал метод для выполнения обнаружения тона на полифонических записей с использованием нейронных сетей.

возможно, вы захотите сравнить метод Клапури с вашим. Это полностью описано в его магистерской диссертации,методы обработки сигналов для автоматической транскрипции музыки. Вы можете найти его много работ в интернете, или купить его книгу, которая объясняет его алгоритм и результаты тестирования. Его хозяина тезис связан ниже.

https://www.cs.tut.fi/sgn/arg/klap/phd/klap_phd.pdf

обнаружение тона на полифонических записях-очень сложная тема и содержит много противоречий-будьте готовы сделать много чтения. Ссылка ниже содержит другой подход к обнаружению тона на полифонических записей, которые я разработал для бесплатного приложения под названием Игрок PitchScope. Мой исходный код C++ доступен на GitHub.com, и ссылается в ссылке ниже. Бесплатная исполняемая версия Игрок PitchScope также доступен в интернете и работает в Windows.

обнаружение тангажа в реальном времени


я экспериментировал с развитием CTRNN (непрерывной рекуррентной нейронной сети) по обнаружению разницы между 2 синусоидальными волнами. У меня был умеренный успех, но никогда не было времени следить за банком этих нейронов (т. е. в полосах, похожих на улитку).


один из возможных подходов было бы использовать Генетического Программирования (GP), чтобы генерировать короткие фрагменты кода, который обнаруживает шаг. Таким образом, Вы сможете создать правило для работы обнаружения высоты тона, которое, надеюсь, будет читаемым человеком.