Как стать автором
Обновить

Комментарии 134

А как открыть шкутулку, если рядом нет пианино?
Телефон с нужной мелодией. Не?
Можно, только нужен хороший динамик и неплохая запись. Если в мелодии есть басы, то не факт, что телефон потянет.
Можно сыграть ту же мелодию на другом инструменте. Или, наверное, насвистеть. Важно воспроизвести нужную частоту.
А может в этом весь смысл? Открыть шкатулку можно ТОЛЬКО рядом с пианино?
НЛО прилетело и опубликовало эту надпись здесь
Современные цифровые пианино уж очень хорошо маскируются под настоящие!
Спеть мелодию?
Кинуть в пол.
Оригинальная идея!
НЛО прилетело и опубликовало эту надпись здесь
Ах вот оно что. Я учту.
П.С. Данная картинка лучше всего передавала что я после прочтения поста почувствовал.
Ух ты ж ёжик как полезно! Огромное спасибо!
Как это нет пианино? В каждой квартире оно обязано быть :) В крайнем случае можно поставить пианино на смартфон. А если серьёзно, то практичней было бы открывать её после настукивания нужной мелодии.
Автор молодец, крайне интересный подход к такой стандартной задаче.
Я сначала тоже думал про стук. Однако, такую штуку уже кто-то сделал. А с мелодией чуть интереснее.
Можно было бы сделать крышку из нескольких разных сортов дерева, чтобы при стуке они издавали звук разной частоты. Правда со временем дерево начало бы сохнуть, что повлияло бы на звучание. Впрочем, можно было бы добавить функцию калибровки, а заодно и функцию «хард-ресета» с уничтожением содержимого шкатулки… Но это уже комбайн какой-то получается :)
А еще можно поставить шариковый тилт сенсор, он реагирует на легкие вибрации и можно отлично распознавать стук (проверял лично). Ну и конечно для этого важно чтобы он располагался правильно в пространстве. Итого получается что шкатулку нужно правильно расположить в пространстве и легонько настучать по ней через заданные промежутки.
Стук, думаю, также можно распознавать микрофоном: есть шум/нет шума.
Для очень большой шкатулки)
Есть пару вопросов. Можно ли напеть мелодию и думали ли вы, что все шкатулки, которые надежно закрыты, должны быть сделаны так, что бы не открывались, если дернуть крышку.

Просто сейчас выглядит как-то слабенько (шкатулка и замочек)
Мелодию напеть, теоретически, можно. Поскольку важна частота, думаю, талантливый певец сможет её воспроизвести. У меня самого не вышло.

Не могу спорить, что эту деревянную шкатулку несложно взломать. Однако, мне сложно представить, как её взломать не оставив следов взлома.
Можно попробовать развить алгоритм, чтобы он ориентировался не на конкретные частоты, а на мелодию, спетую в любой тональности. То есть прослушал мелодию -> выделил ноты -> проанализировал ступени — если совпало с каким-то допуском: типа I-III-V (не зависимо от тональности) то открывает.
Это очень интересная идея. Если бы процессор был помощнее, то я бы сделал преобразование Фурье, и мог бы работать с любой тональностью. Надо покопать мат. часть, выяснить, можно ли это сделать без преобразования.
Можно. Автокорреляцию считать. Даже мега потянет реалтайм, я так делал гитарный тюнер, который определял ноты от 80 Гц до 2КГц, кажется. С точностью до 0.1 интервала между соседними нотами (для 80 гц, МИ, следующая нота ФА 84.7, интервал — 4.7 герца!).
В качестве «пасхального яйца» при обнаружении мелодии частушек, тюнер выдавал сообщение.
Определял все, и свист, и пение.
Расскажите про автокорреляцию. Ведь имеется в виду автокорреляционная функция, так?

Какая у вас была частота дискретизации? Сколько надо было самплов для определения?
Да, АКФ.
ЧД подстраивалась автоматически, т.к. диапазон был весьма широкий (до 2КГц).
Семплов столько, сколько нужно чтобы уместился хотя бы один период. Если есть время — можно и несколько, чтобы точнее определять.
Здорово! А, если не секрет, на каком железе вы это делали?
На меге88, но это было, скажем так, по молодости)
Сейчас я настоятельно бы рекомендовал не страдать фигней, а взять контроллер серии STM32F1xx, которые по цене есть дешевле любой меги, но являются полноценными 32-битными армами, с аппаратными 32-битными же умножителями, аппаратным делителем и частотами до 72 МГц.
На нем со свистом пойдет и Фурье, и АКФ и любая другая обработка сигнала.
Спасибо за рекомендации. Я обязательно посмотрю и на алгоритм, и на эти устройства. Эх, знал бы прикуп…
А если поставить STM32F4xx так можно и голосом управлять, вроде «сизам, откройся».
Поставить мало, нужно еще и алгоритм нормальный.
Вообще, распознавание речи и на STM32F1xx можно сделать, у него возможности широкие)
Если делать «голосовое управление», то оно влезет и в атмелину так как распознаётся отпечатки голосовой команды, а если нужно «распознавание речи», из звука в текст, то тут с алгоритм уже всё изобретен до нас, но требования у него значительно выше (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, которая, по идее, должна куда эффективнее хранить и распознавать последовательности, чем какой-то словарь.
Нейросети на STМ32? Нет, не слышал. Хотя можно попробовать FANN накормить аудиокнигами.
Ну я и на меге НС крутил, правда, мелкую, многослойный перцептрон.
A HTM можно запросто и на СТМке развернуть…
Я как-то, кстати, собрал распознавалку голоса со сфинксом. Телефон целый. Правда, железом послужил дешёвый плеер на базе Android.
Эти фингерпринты, на самом деле более чем похожи друг на друга, и в реальности заставить распознать несколько команд дело долгой и муторной подстройки, в итоге получается штука весьма кривая.
Поэтому алгоритм этих товарищей без доработок я бы не стал юзать.

А тот что «изобретен до нас» — ну в том то и дело, что можно попробовать сократить требования к памяти/вычислительным мощностям без заметного ухудшения качества распознавания.
Скажите, а вот эти STM-ки могут оцифровывать речь и класть на SD (свой диктофон с поэтессами и шахматами)?
Разумеется. Это и на Меге можно сделать.
А STM предоставит вам следующие плюсы:
1) DMA — вам достаточно будет настроить таймер, ацп и ДМА, все, данные будут перекидываться в ваш буфер сами, без участия процессора.
2) На некоторых моделях есть аппаратный SDIO, то есть с карточкой общаться будет намного проще и быстрее.
2.1) DMA можно использовать и тут — перекидывая буферы на карточку и не занимая процессорное время.
В равномерно темперированной шкале два соседних полутона по частоте отличаются в 21/12 = ¹²√2 раз — почти на 6 %. А уж сколько это будет в герцах — другой вопрос.
Это весьма важный вопрос, потому что при фиксированной ЧД в, допустим, 8К, разрешение в 4 герца требует 2к точек Фурье, тогда как на меге в реалтайме можно максимум 128-256 в реалтайме считать при такой частоте.
Поскольку нотный ряд основан на отношении частот (октава — 2, квинта — ~1.5, и т.д.), то, если не ошибаюсь, достаточно вычислить, во сколько раз частота первой ноты отличается от эталонной, а потом все последующие частоты сравнивать с учётом этого коэффициента.

Тогда, в какой бы тональности не пели, просто нужно будет не сфальшивить.
*в какой бы тональности ни пели
Ясно. Я испугался вычисления точной частоты первой ноты. Но, судя по комментариям Ariman'а, есть довольно изящный способ эту задачу решить.
Если я правильно понял принцип, то там определяемая частота накладывается на заранее известную, и по наличию «биений» между ними делается вывод, одинаковы они или нет.

Т. е. можно выяснить, равна ли частота эталону, но это не даст компенсацию общей тональности, когда все частоты просто отличаются, допустим, в 1.33 раза, но их соотношение между собой — правильное.
Если человек спел в целом выше, но гармонически верно.
Неправильно)
АКФ это функция корреляции сигнала с самим собой. Для периодического сигнала АКФ тоже будет периодической с периодом равным периоду сигнала. Если сигнал как следует отфильтровать, а после вычислить его АКФ, получим красивую картинку, с явно выраженными периодами, несмотря на наличие высших гармоник. Считаем период — получаем точное значение частоты. Ну, насколько точное, зависит от ЧД.
Спасибо за пояснение.
Кажется, понял.

Коэфициент корреляции оценивает подобность 2 участков одной или разных функций.
Это как раз способ определить те самые «биения».

А для автокорреляционной функции сигнал сравнивается с самим собой, сдвинутым на определённое время, и АКФ — это зависимость «коэффициента биений» от величины этого сдвига.

Т. е. расстояние между двумя минимумами или максимумами коэффициента корреляции как раз будет равно периоду сигнала.

Это (видимо, более простой, чем Фурье?) способ вычисления доминирующей частоты.
В общем, не буду заставлять Вас объяснять мне математический анализ, учиться надо было лучше. :)
Я почти угадал, только вместо эталонной частоты используется этот же сигнал.

Если не ошибаюсь, наглядно это можно представить как муар на противомоскитной сетке.
Сдвигая 2 её слоя друг относительно друга, мы получаем волны затемнений — биения «коэффициента корреляции».

Величина сдвига, при которой в какой-то же точке снова получится минимум или максимум, будет равна размеру ячейки сетки. Т. е. периоду колебаний.
*в какой-то точке
Просто напрашивается: а если батарейка сядет? Reset не поможет, только механика. Что-то предусмотрено в таком случае?
Конечно. Под кнопкой – разъём для зарядки:
Что будет когда сядет батарейка у закрытой шкатулки?
а в каком месте тут упомянутый в тегах arduino?
Arduino – в душе этого проекта. Во-первых, чип ATMega328P используется в Arduino Uno. Во-вторых, программа использует библиотеки и бутлоадер от Arduino. Ну, и, в-третьих, целый ряд инженерных решений навеян решениями плат Arduino.
Вот только раз уж так основательно взялись, то могли бы и нормальную плату сделать. Без этого шилдостроительного изврата. Один фиг травить пришлось. А так вся конструкция заняла бы не отсек с кулак, а раза в три-четыре меньше.
Нормальную плату – это как? Заказ на фабрике?
Полагаю, нормальную — это без «этажерок».
Слишком много места они сейчас занимают.
Я ж этажерку сделал не ради этажерки: не смог на одном слое развести. Ну а многослойную дома сложно делать. Каков выход?
Убрать лишние разъемы (оставить только мелкие площадки, если уж они нужны для дебага), резисторы и кондеры заменить на 0805 СМДшные, мегу, кстати, тоже можно.
Плату сделать двустороннюю — дома вполне реально. На крайний случай, как я это называю, полуторасторонню) То бишь с обратной стороны кидать перемычки из проводов.
Ваша схема на выводных компонентах. Ее даже тупой игловский автороутер раскидает по одному слою с небольшим количеством соплей. Не говоря уже про ТопоР или freerouter. Топор так еще нарисует теплые ламповые дорожки. Особенно няшно смотрящиеся в контексте изделия.

Плюс многослойную дома делать не сложней чем однослойную. Тем более фоторезистом. Делаешь одну сторону (вторую закрываешь скотчем) травишь. Потом вытравленное закрываешь, делаешь вторую сторону, травишь. Сверлишь. Совмещение по трем отверстиями.
Следующий раз буду более доверять игловскому роутеру. А то и ТопоР попробую. Да и двухслойной платы, похоже, напрасно испугался. Спасибо за советы!
Кстати, seeedstudio же есть. Как понимаю, вы живете не в России. Так что проблемы почты вам не ведомы. Цена там копеечная. Качество не феерия конечно (когда есть с чем сравнить), но для домашней поделки более чем достаточно.
Полазел по seeedstudio. Это базар вроде digikey и mouser, так? То есть, они только компонентами торгуют, так?
Именно. Там и заказ плат и организация мелкосерийного производства. Т.е. ты можешь вбросить туда пачку чертежей и документации, посыпать все баблом и получить на выходе 100500 готовых устройств.
А-а-а! Офигенно. Какое-то время назад вы открыли для меня dealextreme, а теперь и этот базар.
Такое ощущение, что вы живете в каком то параллельном интернете :)
О, у них еще и лазерная резка появилась. Такими темпами глядишь и кастомное изготовление корпусов осилят.
Если человек так основателно взялся (потратился на заказной корпус), то и выбор процессора сложно одобрить — упихиваться в хилую 8битную мегу, вместо 32-битного арма за те же деньги не есть гуд — сказывается на качестве работы алгоритмов.
Ардуины развращают молодых разработчиков)
Вы — знаете как и что делать с АРМ. Расскажите новичкам, как переступить порог вхождения. Ведь мало купить процессор, нужен еще и курс обучения (или наставник)…
Загляните в мои статьи. Те что про STM32F1xx.
Правда там не совсем с самого начала разжевывается, за подробным разъяснением как начать заходите на сайт easyelectronix.ru, статьи уважаемого DIHALT как раз то, что вы ищете.
Прошу прощения, опечатался в ссылке на easyelectronics.
Вот правильная ссылка.
Привет белой зависти на прямые руки :) Респект…
А ведь шкатулка не откроется, если сыграть такую же мелодию в другой тональности…
Не-а. Нужно точное совпадение. Зато она откроется, если сыграть эту мелодию с аккомпанементом.
Хм. С правильным аккомпанементом?
То есть если я буду просто одновременно нажимать все клавиши из некоторого диапазона…
… то, скорее всего, не сработает: если алгоритму кажется, что частота звучит слишком «громко», то она не распознается. Такой эффект будет если одновременно нажать соседние клавиши.
Если это «до» — 130 Гц, то 260 и 400, похоже, её гармоники («до» и «соль» на октаву выше).
Согласен, тоже хотел написать что это гармоники.
Сам решал подобную задачу — есть интересный вариант решения, без Фурье и аналогичных преобразований. Необходимо посчитать автокорреляцию сигнала, тогда шумы уйдут в никуда, останется очень удобный для обработки сигнал. Дальше посчитать его период.
Удалось достигнуть точности до 10 центов (0.1 интервала между соседними нотами). Куда больше чем может дать Фурье на 256 точек (или сколько там мега потянет в реалтайме?)
Там на графике не 260 и 400, а больше — скорее 280 и 415.
Если преобразовывали *весь* звуковой фрагмент, вместе с РЕ и МИ, то гармоники от ДО туда всяко попали тоже. Скорее всего не хватает спектрального разрешения, поэтому 260 и 280 сливаются.
Возможно :)
Мегавещь, на конвейер не думаете ставить?
Пока нет. Делал для себя, доказать, что это возможно.
apple_fan, а не могли бы вы выложить схему в PNG, или PDF? В любом формате, который можно сразу просмотреть? Глянуть интересно, а никаких просмотрщиков sch тут нет.
Несколько замечаний:
1) Человек слышит ноту «до» не «если ему щекотать нерв 130 раз в секунду» — в ухе не один нерв, в отличие от АЦП меги. В ухе происходит, по сути, то же преобразование в частотную область, и чувствительные клетки расположены во всем слуховом канале, каждая отвечает за свой интервал частот.

2) Где ваша аналоговая часть? Вы не фильтруете сигнал перед входом? Необходим антиальязинговый фильтр, иначе происходит наложение спектров, сигнал искажается.
Какая у вас частота дискретизации?

Отличные вопросы.

1) Аналогия с человеком, конечно, несколько упрощенная. Мне очень хотелось пояснить принцип работы преобразования. Я испугался, что если уйду в детали уха, то могу упустить суть.

2) Аналоговая часть скрыта в детале на базе OPA344. Вот её схема. Антиальязинговый фильтр, как я понимаю, встроен туда.

Частота дискретизации: 22260 Герц.
Судя по описанию, там слишком высокая граница у фильтра.
Вам нужен фильтр где-то на 10 кГц, иначе происходит наложение спектров.
И потом, частоту можно уменьшить, взамен получив больше времени на обработку.
Я в этой теме новичок. Допустим, я хочу распознавать три центральные октавы: от 130 до 523 Герц. Как помогает фильтр на 10кГц в этом случае?
Он защищает от альязинга.
Если его не ставить, все высшие гармоники, все ВЧ шумы лезут вам в вашу полосу пропускания, искажая сигнал.
Это ясно. Но ведь играет одно фортепьяно. Ведь эти шумы – не от него, так? То есть, это защита от рандомных шумов в комнате?
Это защита от альязинга)
Вы играете ноту ДО на 130 Гц — в сигнале присутствуют гармоники
130, 260, 390, ..., 1300,… герц.
Все что выше половины ЧД — накладывается на ваш сигнал. Если у вас ЧД 20к, то гармоника 13000 превратится в 3000.
Блин, понял, спасибо.
Кстати, если уж вам известна полоса пропускания, то вообще лучше поставить полосный фильтр, и пропускать только 130-523 (ну, с каким-нибудь небольшим запасом), повысит точность в разы.
Сейчас вы анализируете от 15 — 11130 герц, да еще и с альязингом)
Ага, так и есть. У вас на входе нет фильтра. Какая ЧД у вас? Нижние частоты, полагаю, серьезно искажаются.
Am Dm E Am
Се-е-еза--ам, откро-ой-сяя-я
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Главное не забыть ключик в виде рояля притащить :-D
НЛО прилетело и опубликовало эту надпись здесь
Ну или смартфон/планшет на худой конец :)
Я тоже про подарок думал: подарить знакомому музыканту, с какой-нибудь подсказкой про ключевую мелодию.
Только в игре ноты сравнивал человек, а тут эта задача возложена на машину. :)
А что за тонкие полоски в фанерке? для чего они использованы?
Для механизма замка. Эдакая деревянная «Г», прикреплённая к моторчику. Я сделал их несколько на всякий случай. Использовал лишь три.
Ponoko — интересный сайт для любителей DIY.

Может хабросообщество подскажет какие аналогичные сайты есть в сети?
Хе, в такой шкатулке можно ништяки прятать от детей, обучающихся в музыкальной школе. Пусть занимаются, пока всю фальш из произведения не уберут. Жестоко, но один из возможных стимулов.
НЛО прилетело и опубликовало эту надпись здесь
Ну это уже совсем жестоко.
Круто. Только у меня есть подозрение, что если жать наугад целыми аккордами, то одна из нот или гармоник ноты совпадет с искомой. Хорошо бы кроме наличия определенной ноты, проверять отсутствие соседних нот.

Также, на вашем графике — гармоники исходной ноты (с частотами, кратными основной).

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

Голос он не распознает, по-видимому, от того, у вас что-то неправильно сделано. Так как в голосе (я проверил!) тоже есть первая гармоника, может, правда, не такая четкая, как в звуке инструмента.
Сим-сим откройся. А Серву почему подешевле не нашел? ведь навалом же разных подешевле.
Мне очень приглянулась эта из-за ползунка. А где живут дешёвые сервы?
Спасибо, буду там теперь брать. Я за свой что-то 17$ заплатил.
Там можно было и обычную вращалку сделать. Она бы двигала через коромысло задвижку и все дела. Тем более что лазером можно детали нарезать.

Или тут такое же коромысло поставить и двигать его плечо двигалкой. Было бы куда изящней и надежней вашей конструкции из щепочек.
> сколько раз в секунду ему «щекотали» микрофон
Надо сделать антивариант. Начинаешь фальшивить — бьет указкой по голове.
Я что-то могу сложить во едино алгоритм: Берем громкость по времени с микрофона, преобпразовываем в частоту, а потом определяем громкость каждой частоты? Звучит странно.

uint16_t NoteDetector::detect( uint16_t frequency, uint32_t timeout )
Это возвращает она 0/frequency, а не громкость, я или надо с самим алогритмом разбиратся, а это проверка — соотвествует частота ноте или нет?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории