Как это нет пианино? В каждой квартире оно обязано быть :) В крайнем случае можно поставить пианино на смартфон. А если серьёзно, то практичней было бы открывать её после настукивания нужной мелодии.
Автор молодец, крайне интересный подход к такой стандартной задаче.
Можно было бы сделать крышку из нескольких разных сортов дерева, чтобы при стуке они издавали звук разной частоты. Правда со временем дерево начало бы сохнуть, что повлияло бы на звучание. Впрочем, можно было бы добавить функцию калибровки, а заодно и функцию «хард-ресета» с уничтожением содержимого шкатулки… Но это уже комбайн какой-то получается :)
А еще можно поставить шариковый тилт сенсор, он реагирует на легкие вибрации и можно отлично распознавать стук (проверял лично). Ну и конечно для этого важно чтобы он располагался правильно в пространстве. Итого получается что шкатулку нужно правильно расположить в пространстве и легонько настучать по ней через заданные промежутки.
Есть пару вопросов. Можно ли напеть мелодию и думали ли вы, что все шкатулки, которые надежно закрыты, должны быть сделаны так, что бы не открывались, если дернуть крышку.
Просто сейчас выглядит как-то слабенько (шкатулка и замочек)
Можно попробовать развить алгоритм, чтобы он ориентировался не на конкретные частоты, а на мелодию, спетую в любой тональности. То есть прослушал мелодию -> выделил ноты -> проанализировал ступени — если совпало с каким-то допуском: типа I-III-V (не зависимо от тональности) то открывает.
Это очень интересная идея. Если бы процессор был помощнее, то я бы сделал преобразование Фурье, и мог бы работать с любой тональностью. Надо покопать мат. часть, выяснить, можно ли это сделать без преобразования.
Можно. Автокорреляцию считать. Даже мега потянет реалтайм, я так делал гитарный тюнер, который определял ноты от 80 Гц до 2КГц, кажется. С точностью до 0.1 интервала между соседними нотами (для 80 гц, МИ, следующая нота ФА 84.7, интервал — 4.7 герца!).
В качестве «пасхального яйца» при обнаружении мелодии частушек, тюнер выдавал сообщение.
Определял все, и свист, и пение.
Да, АКФ.
ЧД подстраивалась автоматически, т.к. диапазон был весьма широкий (до 2КГц).
Семплов столько, сколько нужно чтобы уместился хотя бы один период. Если есть время — можно и несколько, чтобы точнее определять.
На меге88, но это было, скажем так, по молодости)
Сейчас я настоятельно бы рекомендовал не страдать фигней, а взять контроллер серии STM32F1xx, которые по цене есть дешевле любой меги, но являются полноценными 32-битными армами, с аппаратными 32-битными же умножителями, аппаратным делителем и частотами до 72 МГц.
На нем со свистом пойдет и Фурье, и АКФ и любая другая обработка сигнала.
Если делать «голосовое управление», то оно влезет и в атмелину так как распознаётся отпечатки голосовой команды, а если нужно «распознавание речи», из звука в текст, то тут с алгоритм уже всё изобретен до нас, но требования у него значительно выше (fft+память).
Нет, не проверял, нет надобности, ведь главное понять как оно работает, этот алго используют со времён появления голосового управления в мобильных телефонах (именно его использовали в старых сименсах). А на атмелинах я бы такое не собирал, ведь есть же нормальные DSP для этого, вот например готовое решение от microchip (правда оно платное и его надо ещё обучить русскому).
Ну и сравните то, что предлагает Microchip, и то, что предлагают эти студенты)
Speaker-independent recognition of isolated words
No speaker training is required
Hidden-Markov Model based recognition system
Это, мягко говоря, более интересный алгоритм, чем банк фильтров и прямое сравнение с «фингерпринтом». О том и речь, что на атмеле такое реализовывать, на самом деле, неправильное решение. Результат все равно будет кривой. Взяв тот же STM32F1xx можно уже полноценно реализовать голосовое управление не хуже чем у микрочипа.
Зато если использовать «фингерпринт», то велика вероятность того, что если кто нибудь другой скажет «сизам откройся!», то шкатулка — не откроется, вот ещё один метод защиты её содержимого.
Ага, а также велика вероятность что откроется от звука выхлопа автомобиля, падающей книжки или еще чего-нибудь, по счастливой случайности совпавшего по спектру (учитывая 8 банков и промежуток времени, за который они копят результат — более чем вероятно).
Или не откроется если даже владелец скажет «сезам откройся», потому что он будет говорить слишком быстро или слишком медленно.
Чтобы из этого алгоритма сделать более-менее надежный, нужно его очень неслабо допилить, вообще говоря.
В мобилках с этим борятся «затуплением» чувствительности микрофона, чтобы не принимать посторонние звуки, да и запуск голосового управления обычно инициируется нажатием кнопки на гарнитуре. Я не говорю что нужно скопипастить алго, допиливать в любом случае прийдётся, но как простой вариант для «попробовать» — вполне сойдёт. А бороться с изменениями скорости говора можно увеличив кол-во банков и уменьшив время выборки (при этом делать адаптивный поиск ± 2...3 выборки от ожидаемого значения и ввести коэффициент скорости).
Банки, ИМХО, нужно вообще убрать — это аналог Фурье с очень мелким разрешением. Фурье на 64 точки мега спокойно тянет.
Когда я делал такую штуку, то выполнял дискретное преобразование Хартли на 128 точек, получал 64 значащие точки частоты, из них делал выходные 10, усреднением (усредняя не поровну, а в зависимости от частоты) и таких 10-точечных строк копил еще штук 8, кажется. Итого одна матрица-спектрограмма покрывала около 0.5 с, кажется. Это все было писано на асме и крутилось на меге88, в реалтайме, естественно.
Матрицы сравнивались через коэффициент корреляции.
Реализация этой штуки принесла мне осознание того, что упихиваться в мегу — безумие) не потратив, наверное, ни рубля лишнего, я бы мог спокойно поставить любую СТМку и реализовать более точный и красивый алгоритм) Так что впихивать такое в восьмибитки это чисто ради обучения разве что. И осознания границ.
А учитывая что в CTMках есть уже разжованные примеры того как это всё ускорить при помощи CMSIS-DSP, так в сторону атмеловских ногодрыгалок и нечего вообще смотреть. Но тут возникает вопрос, а не поставить ли оперативку+флешь, и не запилить ли speech-to-text?
Меня больше интересует вопрос так ли сильно тут нужна оперативка и флеш — почему-то кажется, что можно достигнуть вполне удобоваримого компромисса на какой-нибудь ST32F103, с метром флеша и 192 кб оперативки.
Метром флеша не обойтись. 30Мб — русский словарь, основанный на аудиокнигах. А насчёт оперативки — тут как повезёт, нужно смотреть сколько нужно этой libpocketsphinx.
Ну я же не про сфинкса сейчас) Про свои реализации.
В конце концов, есть еще такие веселые вещи, как нейросети — в частности, не так давно разработанная HTM, которая, по идее, должна куда эффективнее хранить и распознавать последовательности, чем какой-то словарь.
Эти фингерпринты, на самом деле более чем похожи друг на друга, и в реальности заставить распознать несколько команд дело долгой и муторной подстройки, в итоге получается штука весьма кривая.
Поэтому алгоритм этих товарищей без доработок я бы не стал юзать.
А тот что «изобретен до нас» — ну в том то и дело, что можно попробовать сократить требования к памяти/вычислительным мощностям без заметного ухудшения качества распознавания.
Разумеется. Это и на Меге можно сделать.
А STM предоставит вам следующие плюсы:
1) DMA — вам достаточно будет настроить таймер, ацп и ДМА, все, данные будут перекидываться в ваш буфер сами, без участия процессора.
2) На некоторых моделях есть аппаратный SDIO, то есть с карточкой общаться будет намного проще и быстрее.
2.1) DMA можно использовать и тут — перекидывая буферы на карточку и не занимая процессорное время.
В равномерно темперированной шкале два соседних полутона по частоте отличаются в 21/12 = ¹²√2 раз — почти на 6 %. А уж сколько это будет в герцах — другой вопрос.
Это весьма важный вопрос, потому что при фиксированной ЧД в, допустим, 8К, разрешение в 4 герца требует 2к точек Фурье, тогда как на меге в реалтайме можно максимум 128-256 в реалтайме считать при такой частоте.
Поскольку нотный ряд основан на отношении частот (октава — 2, квинта — ~1.5, и т.д.), то, если не ошибаюсь, достаточно вычислить, во сколько раз частота первой ноты отличается от эталонной, а потом все последующие частоты сравнивать с учётом этого коэффициента.
Тогда, в какой бы тональности не пели, просто нужно будет не сфальшивить.
Если я правильно понял принцип, то там определяемая частота накладывается на заранее известную, и по наличию «биений» между ними делается вывод, одинаковы они или нет.
Т. е. можно выяснить, равна ли частота эталону, но это не даст компенсацию общей тональности, когда все частоты просто отличаются, допустим, в 1.33 раза, но их соотношение между собой — правильное.
Если человек спел в целом выше, но гармонически верно.
Неправильно)
АКФ это функция корреляции сигнала с самим собой. Для периодического сигнала АКФ тоже будет периодической с периодом равным периоду сигнала. Если сигнал как следует отфильтровать, а после вычислить его АКФ, получим красивую картинку, с явно выраженными периодами, несмотря на наличие высших гармоник. Считаем период — получаем точное значение частоты. Ну, насколько точное, зависит от ЧД.
Коэфициент корреляции оценивает подобность 2 участков одной или разных функций.
Это как раз способ определить те самые «биения».
А для автокорреляционной функции сигнал сравнивается с самим собой, сдвинутым на определённое время, и АКФ — это зависимость «коэффициента биений» от величины этого сдвига.
Т. е. расстояние между двумя минимумами или максимумами коэффициента корреляции как раз будет равно периоду сигнала.
Это (видимо, более простой, чем Фурье?) способ вычисления доминирующей частоты.
В общем, не буду заставлять Вас объяснять мне математический анализ, учиться надо было лучше. :)
Я почти угадал, только вместо эталонной частоты используется этот же сигнал.
Если не ошибаюсь, наглядно это можно представить как муар на противомоскитной сетке.
Сдвигая 2 её слоя друг относительно друга, мы получаем волны затемнений — биения «коэффициента корреляции».
Величина сдвига, при которой в какой-то же точке снова получится минимум или максимум, будет равна размеру ячейки сетки. Т. е. периоду колебаний.
Arduino – в душе этого проекта. Во-первых, чип ATMega328P используется в Arduino Uno. Во-вторых, программа использует библиотеки и бутлоадер от Arduino. Ну, и, в-третьих, целый ряд инженерных решений навеян решениями плат Arduino.
Вот только раз уж так основательно взялись, то могли бы и нормальную плату сделать. Без этого шилдостроительного изврата. Один фиг травить пришлось. А так вся конструкция заняла бы не отсек с кулак, а раза в три-четыре меньше.
Убрать лишние разъемы (оставить только мелкие площадки, если уж они нужны для дебага), резисторы и кондеры заменить на 0805 СМДшные, мегу, кстати, тоже можно.
Плату сделать двустороннюю — дома вполне реально. На крайний случай, как я это называю, полуторасторонню) То бишь с обратной стороны кидать перемычки из проводов.
Ваша схема на выводных компонентах. Ее даже тупой игловский автороутер раскидает по одному слою с небольшим количеством соплей. Не говоря уже про ТопоР или freerouter. Топор так еще нарисует теплые ламповые дорожки. Особенно няшно смотрящиеся в контексте изделия.
Плюс многослойную дома делать не сложней чем однослойную. Тем более фоторезистом. Делаешь одну сторону (вторую закрываешь скотчем) травишь. Потом вытравленное закрываешь, делаешь вторую сторону, травишь. Сверлишь. Совмещение по трем отверстиями.
Кстати, seeedstudio же есть. Как понимаю, вы живете не в России. Так что проблемы почты вам не ведомы. Цена там копеечная. Качество не феерия конечно (когда есть с чем сравнить), но для домашней поделки более чем достаточно.
Именно. Там и заказ плат и организация мелкосерийного производства. Т.е. ты можешь вбросить туда пачку чертежей и документации, посыпать все баблом и получить на выходе 100500 готовых устройств.
Если человек так основателно взялся (потратился на заказной корпус), то и выбор процессора сложно одобрить — упихиваться в хилую 8битную мегу, вместо 32-битного арма за те же деньги не есть гуд — сказывается на качестве работы алгоритмов.
Ардуины развращают молодых разработчиков)
Вы — знаете как и что делать с АРМ. Расскажите новичкам, как переступить порог вхождения. Ведь мало купить процессор, нужен еще и курс обучения (или наставник)…
Загляните в мои статьи. Те что про STM32F1xx.
Правда там не совсем с самого начала разжевывается, за подробным разъяснением как начать заходите на сайт easyelectronix.ru, статьи уважаемого DIHALT как раз то, что вы ищете.
… то, скорее всего, не сработает: если алгоритму кажется, что частота звучит слишком «громко», то она не распознается. Такой эффект будет если одновременно нажать соседние клавиши.
Согласен, тоже хотел написать что это гармоники.
Сам решал подобную задачу — есть интересный вариант решения, без Фурье и аналогичных преобразований. Необходимо посчитать автокорреляцию сигнала, тогда шумы уйдут в никуда, останется очень удобный для обработки сигнал. Дальше посчитать его период.
Удалось достигнуть точности до 10 центов (0.1 интервала между соседними нотами). Куда больше чем может дать Фурье на 256 точек (или сколько там мега потянет в реалтайме?)
Если преобразовывали *весь* звуковой фрагмент, вместе с РЕ и МИ, то гармоники от ДО туда всяко попали тоже. Скорее всего не хватает спектрального разрешения, поэтому 260 и 280 сливаются.
apple_fan, а не могли бы вы выложить схему в PNG, или PDF? В любом формате, который можно сразу просмотреть? Глянуть интересно, а никаких просмотрщиков sch тут нет.
Несколько замечаний:
1) Человек слышит ноту «до» не «если ему щекотать нерв 130 раз в секунду» — в ухе не один нерв, в отличие от АЦП меги. В ухе происходит, по сути, то же преобразование в частотную область, и чувствительные клетки расположены во всем слуховом канале, каждая отвечает за свой интервал частот.
2) Где ваша аналоговая часть? Вы не фильтруете сигнал перед входом? Необходим антиальязинговый фильтр, иначе происходит наложение спектров, сигнал искажается.
Какая у вас частота дискретизации?
1) Аналогия с человеком, конечно, несколько упрощенная. Мне очень хотелось пояснить принцип работы преобразования. Я испугался, что если уйду в детали уха, то могу упустить суть.
2) Аналоговая часть скрыта в детале на базе OPA344. Вот её схема. Антиальязинговый фильтр, как я понимаю, встроен туда.
Судя по описанию, там слишком высокая граница у фильтра.
Вам нужен фильтр где-то на 10 кГц, иначе происходит наложение спектров.
И потом, частоту можно уменьшить, взамен получив больше времени на обработку.
Это защита от альязинга)
Вы играете ноту ДО на 130 Гц — в сигнале присутствуют гармоники
130, 260, 390, ..., 1300,… герц.
Все что выше половины ЧД — накладывается на ваш сигнал. Если у вас ЧД 20к, то гармоника 13000 превратится в 3000.
Кстати, если уж вам известна полоса пропускания, то вообще лучше поставить полосный фильтр, и пропускать только 130-523 (ну, с каким-нибудь небольшим запасом), повысит точность в разы.
Сейчас вы анализируете от 15 — 11130 герц, да еще и с альязингом)
Хе, в такой шкатулке можно ништяки прятать от детей, обучающихся в музыкальной школе. Пусть занимаются, пока всю фальш из произведения не уберут. Жестоко, но один из возможных стимулов.
Круто. Только у меня есть подозрение, что если жать наугад целыми аккордами, то одна из нот или гармоник ноты совпадет с искомой. Хорошо бы кроме наличия определенной ноты, проверять отсутствие соседних нот.
Также, на вашем графике — гармоники исходной ноты (с частотами, кратными основной).
Также, когда делается преобразование Фурье, нежелательно вырезать кусок сигнала, так как будет шум от того, что края резкие (а преобразование Фурье предполагает обработку бесконечного по длительности сигнала). Чтобы их уменьшить, сигнал обычно предварительно обрезается оконной функцией (так, чтобы с краев амплитуда плавно снижалась до нуля).
Голос он не распознает, по-видимому, от того, у вас что-то неправильно сделано. Так как в голосе (я проверил!) тоже есть первая гармоника, может, правда, не такая четкая, как в звуке инструмента.
Я что-то могу сложить во едино алгоритм: Берем громкость по времени с микрофона, преобпразовываем в частоту, а потом определяем громкость каждой частоты? Звучит странно.
uint16_t NoteDetector::detect( uint16_t frequency, uint32_t timeout )
Это возвращает она 0/frequency, а не громкость, я или надо с самим алогритмом разбиратся, а это проверка — соотвествует частота ноте или нет?
Шкатулка с музыкальным замком