Pull to refresh
54
-3

Пользователь

Send message

Спасибо, верно подметили!

Не совсем корректно выразил мысль: скажем, у нас есть выборка из 1024 отсчётов, передискретизируем её с частотой в два раза выше, чтобы получить уже 2048 отсчётов. При этом размер выборки и спектральное разрешение удвоится, но временная длительность выборки останется прежней.

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

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

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

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

Но для моих задач точности хватало, поэтому такими экспериментами не занимался. Проект же развивается на энтузиазме, мне просто интересно разбираться в этой теме, поэтому делюсь результатами в открытом доступе :)

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

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

Да, в открытом доступе есть реализации гитарных тюнеров на основе автокорреляции, но и они не лишены недостатков.

В статье представлен рабочий код, так что от «конкурентов» и альтернатив ожидается того же ;)

Добавлен раздел «песочница» со ссылкой на онлайн-компилятор, где можно самому пощупать алгоритм и поиграть с входными данными сигнала.

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

На всякий случай уточню, изначальная задача для приложения Solfeggio имеет наиболее общий характер: максимально точное распознавание частоты всех нот в аудиосигнале при коротких временных размерах окон (чтобы разобрать порядок звучания в реальном времени).

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

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

Код содержит все ключевые формулы.

:)

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

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

В заключительной части статьи добавлен раздел ПЕСОЧНИЦА, который содержит ссылку на реализацию алгоритма ФАИ в онлайн-компиляторе, где можно можно поиграть с ним на различных сгенерированных сигналах

Ничего автор не добывает.

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

На сильно зашумленных сигналах он, конечно, чудес не сотворит, но с реальными (музыка, речь) справляется достойно.

Но... Чем вам C# не угодил? Это современнный (не побоюсь этого слова, передовой) язык программирования широкого предназначения. Синтаксически близок к Java, во многих аспектах опережает её, также есть немало общих черт с C++.

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

:)

Для распознавания нот банк узкополосных фильтров с выделением огибающей через преобразование Гильберта будет точнее.

Большой вопрос к вычислительной сложножности данного подхода... А точность можно существенно повысить и для БПФ, опять же за счёт повышения требований к вычислительным ресурсам.

«распознавание нот» и «тюнер для музыкальных инструментов» — это совершенно разные задачи

Тюнер - это точное распознование одной наиболее значимой ноты в сигнале, то есть частный случай более общей задачи по точному распознованию множества нот.

Ну а поскольку восстановление исходного сигнала в задачи автора не входило, то это у него и не получится.

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

Да, это неоднозначное восстановление с потерями, но и преимущество для определённых задач.

Лучший и худший - понятия довольно относительные, которые зависят от критериев оценки.

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

Возможно, существуют ещё более совершенные подходы для решения подобного рода задач, но мне они не известны.

Алгоритм представлен в статье. С разрежёнными гармониками в идеальных и реальных сигналах он справляется очень даже неплохо.

Дело ваше. Там всего-то небольшой метод и три ключевых формулы.

Для меня программирование - это часть математики, вычисления, которые можно выполнять на компьютере.

Спасибо за интерес к статье!

Не знаю, в какой области работают sinc и periodic-sinc функции, но алгоритмы передискретизации точно работают во временной (применяются к исходной выборке), речь же идёт про алгоритм интерполяции в частотной области (применяется к спектру после БПФ).

Спасибо за отклик и интерес к статье!

Даже на низких частотах ФАИ обеспечивает точность сравнимую с автокорреляционными музыкальными тюнерами при эквивалентных длинах выборки (сам проверял). Возможно, какая-то разница будет наблюдаться на сверхнизких частотах, но это требует дальнейшей проверки и исследования.

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

У меня прикладной взгляд в данном вопросе - этот алгоритм с высокой точностью работает на реальных сигналах, даже если кто-то говорит, что это невозможно ;)

Всем скептикам рекомендую скачать приложение и воочию протестировать ФАИ на реальных сигналах.

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

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

Преимущество ФАИ в том, что алгоритм позволяет весьма точно «угадать» характеристики сразу нескольких достаточно отдалённых гармоник сигнала при малом объёме дополнительных вычислений.

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

Information

Rating
Does not participate
Registered
Activity