2015-05-10 4 views
0

Я использую алгоритм автокорреляции для определения высоты тона на монофонических звуках (напевая, свист), и я получаю результаты, достаточно хорошие для того, что я пытаюсь сделать. Но если я насвистывать мелодию с примечаниями GF # D # и войти результат я получаю эту последовательность:Pitch detection - count notes

2x F #
3x G
14x F #
54x G
14x G #
2x D
52x F #
6x G
14x F #
3x G
2x G
28x D #
2x D
33x D #
4x D
16x D #
2x Е
2x D
2x D #

Мы можем видеть, что правильные ноты распознаются, и это те, у которых больше повторений, как я могу узнать, когда это настоящая заметка или просто переход? Есть ли какой-либо фильтр, который я могу применить к этому массиву и получить только реальные заметки G F # и D #?

Я использую этот код javascript: https://github.com/cwilso/pitchdetect, чтобы выполнить определение высоты тона, и мне интересно, есть ли какой-либо алгоритм пост-обработки, который я могу применить к своим результатам для фильтрации заметок или если мне нужно увеличить окно на автокорреляционный алгоритм.

В этой теме обработки сигналов (https://dsp.stackexchange.com/questions/16753/how-to-get-the-melody-from-a-signal) принятый ответ упоминает что-то вроде простой обработки сообщений, применяя фильтр режима в моей последовательности результатов шагов. Каким будет этот фильтр режима?

+1

Похоже, вам нужно оттачивать свои навыки свиста. – TonyK

+0

На каких языках вы программируете? Можете ли вы дать нам образец кода, который демонстрирует проблему? Пожалуйста, добавьте эти данные к своему вопросу – Dijkgraaf

+0

@TonyK. Похоже, что даже идеальные синусоидальные волны имеют эти вариации тона. –

ответ

0

Фильтр режима - это то место, где вы видите, какие заметки встречаются больше всего и отбрасывают остальное. например если вы должны были сделать простой фильтр режима и отбросить что-либо со значением менее 20, тогда вы получите 54x G, 52x F #, 28x D #, 33x D #

Однако вам нужно будет рассчитать значение режима, которое будет использоваться будет зависеть от темпа нот.