Определение сигнала (типа голос) ардуиной, в какую сторону смотреть? как можно сделать?
- Войдите на сайт для отправки комментариев
Втр, 30/08/2016 - 15:09
Интересует получить квалифицированный ответ на такой вопрос:
скажем голос перенесли в вниз по частоте и образали фильтрами до примерно 1Гц-300Гц..
голос тут для примера. Так вот интересует как можно обрабатывать типа ардуиной, чтобы сказать в итоге: этот сигнал схож с тем что записано в память, и на выходе даем 1, или не похож ни на что, и даем 0.
Тоесть распознавание аналоговых сигналов, длинной скажем пару сек или до 5сек.
Никто с похожим не сталкивался?
А что такое "схож" и "не похож"? В каких попугаях измерять? Каковы критерии схожести?
Боюсь ардуина Due такую задачу в состоянии потянуть, а остальные нет. Смотрите в сторону преобразований Фурье.
В полосе 300Гц ничего толкового не выйдет, т.е не узнаете ни "кто говорит" ни "что говорит". Кстати, а что из этого нужно?
В полосе 300Гц ничего толкового не выйдет, т.е не узнаете ни "кто говорит" ни "что говорит". Кстати, а что из этого нужно?
Отчего же?
Можно вполне уверенно отличить "кошка" от "собака".
В полосе 300Гц ничего толкового не выйдет, т.е не узнаете ни "кто говорит" ни "что говорит". Кстати, а что из этого нужно?
Отчего же?
Можно вполне уверенно отличить "кошка" от "собака".
Спасибо, поржали..
https://www.youtube.com/watch?v=CxAWINljDAY
И тесткис.. кейс т.е. https://www.youtube.com/watch?v=CEbzm0K_uQc
скажем голос перенесли в вниз по частоте и образали фильтрами до примерно 1Гц-300Гц..
300Гц очень мало. Телефон, например полосу в 3КГц тянет (300-3400Гц). То есть, выдрав из этого диапазона всего 10%, шансы на получение чего-то приличного весьма малы.
Насколько я понял, вы хотите производить корреляционный анализ полученного сигнала с эталоном. Частота оцифровки сигнала даже 300Гц нужна хотя бы 600Гц (по теореме Котельникова). При восьмибитной оцифровке потребуется 600байт из 2К оперативки Uno. При это останется от сигнала то меньше 10%, по сравнению с общепринятой телефонной оцифровкой на 8КГц. Сохранение же на 8КГц потребует 8Кбайт, которые вы найдете только в Due.
Производить корреляционный анализ аналогового сигнала без решения дифференциальных уравнений вряд ли удастся. Что опять таки, вряд ли доступно ардуинам, кром Due. А если уже брать Due, то правильней производить сначала спектральный анализ (преобразование Фурье), а потом уже выполнять корреляционный анализ не сигналов, а их спектральной характеристики. И это будет уже на порядок проще и быстрее, чем корреляционный анализ самих сигналов. Так как от корреляций амплитуды вы уже избавитесь на этапе спектрального анализа.
Если Due нет, рекомендую попробовать пойти следующим путем:
1. Спектральный анализ эталона выполнить на ПК и результат записать в программную память МК, а не оперативную.
2. Спектральный анализ получаемого сигнала попробовать выполнять на лету быстрым преобразованием Фурье. Судя по данной (http://forum.arduino.cc/index.php/topic,38153.0.html) ветке в форуме, народу это удавалось.
3. Выполнять корреляционный анализ между результатом быстрого преобразования Фурье и эталоном в программной памяти.
Если сигнал обрезан сверху по 300 Гц, думаю, для анализа остается только амплитудная огибающая. В принципе, этого не так уж мало. Уже упомянутые "кошка" и "собака" (слова, произнесенные человеком, а не звуки, испускаемые животеыми), как я уже говорил, можно уверенно различить. А вот анализ низкочастотного огрызка спектра, мне кажется, не слишком перспективен.
А вообще, я бы посоветовал сначала прояснить для себя возможности существующих способов распознавания звукового сигнала безотносительно Ардуино, и только когда здесь появится некоторая ясность, думать над конкретной реализацией.
Если сигнал обрезан сверху по 300 Гц, думаю, для анализа остается только амплитудная огибающая. В принципе, этого не так уж мало. Уже упомянутые "кошка" и "собака" (слова, произнесенные человеком, а не звуки, испускаемые животеыми), как я уже говорил, можно уверенно различить.
Выполнять корреляционный анализ без спектрального, конечно можно, вот только перспективы не радужные.
1. Мы различаем звуки в первую очередь по частоте. Амплитуда (громкость) звука для распознания речи или не имеет значение вообще, или ее значение вторично, после спектра.
2. Наиболее легко распознаются гласные и, куда хуже, согласные звуки. Поэтому в легкость распознавания "кошка" и "собака" верится с трудом. Если мы из-за узости частотного диапазона в 300Гц вообще не заметим согласные, то "о-а" отличить от "о-а-а" может и не удастся.
Вообще, подробнее о формантах и распозновании человеческого голоса можно почитать, например, тут: http://speech-text.narod.ru/chap3_4.html
1. Речь не о громкости, а о ритме. В неблагоприятных условиях (например, сильный шум) мы узнаем фразу именно по ритму. На этом основан принцип подбора военных команд, названий букв (аз, буки, веди, глаголь, добро...) и пр.
2. Ну да, гласные различаются по формантам, а последние лежат в диапазоне примерно от 500 до 3000 Гц. Так что в данном случае различать следует не "о-а" от "о-а-а", а слово из двух слогов с ударением на первый слог от с трехсложного слова с ударением на втором.
1. Речь не о громкости, а о ритме.
А разве ритм мы определяем не по спектру?
2. слово из двух слогов с ударением на первый слог от с трехсложного слова с ударением на втором.
Если этого достаточно, тогда другое дело. Но ТС писал "как можно обрабатывать типа ардуиной, чтобы сказать в итоге: этот сигнал схож с тем что записано в память, и на выходе даем 1, или не похож ни на что, и даем 0."
А вы решаете задачу, когда выдать 0, что мало поможет решить задачу, когда выдавать 1. Боюсь, что тут случай не для бритвы Оккама.
А разве ритм мы определяем не по спектру?
Лично я - по амплитуде.
А Вы - по спектру? Поделитесь алгоритмом.
Если этого достаточно, тогда другое дело. Но ТС писал "как можно обрабатывать типа ардуиной, чтобы сказать в итоге: этот сигнал схож с тем что записано в память, и на выходе даем 1, или не похож ни на что, и даем 0."
А вы решаете задачу, когда выдать 0, что мало поможет решить задачу, когда выдавать 1. Боюсь, что тут случай не для бритвы Оккама.
Отчего же. Вопрос лишь в степени схожести. Вряд ли мы сможем отличить "собаку" от "коровы" - следовательно, при нашем подходе, эти два слова схожи. Будем выдавать 1. А 100% распознавание никто не гарантирует даже в диапазоне 20-20000 и при на 3 порядка более высокой производительности вычислительной системы.
Вряд ли мы сможем отличить "собаку" от "коровы"
Судя по тому, что писали на англоязычном форуме в теме, ссылку на которую я дал выше, как раз сможем. Там парню удалось выполнять быстрое преобразование фурье в реальном времени, не записывая звук в память. А уже спектр в память для дальнейшего корреляционного анализа должен влезть.
А Вы - по спектру? Поделитесь алгоритмом.
Естественно, просто частота ритма, может быть 1Гц или даже меньше.
Если же более строго, ритм можно записать при помощи обычной музыкальной записи одной нотой, но отслеживая паузы и длительности. То есть, это спектральная характеристика, так как изменение амплитуды (громкости) во время исполнения музыки или произнесения речи на ритм вообще не влияют.
Судя по тому, что писали на англоязычном форуме в теме, ссылку на которую я дал выше, как раз сможем. Там парню удалось выполнять быстрое преобразование фурье в реальном времени, не записывая звук в память. А уже спектр в память для дальнейшего корреляционного анализа должен влезть.
Вообще-то "выполнить БПФ" и "распознать" - далеко не одно и то же. Поэтому "сможем" - ничем не подтверждается. Формантные области отрезаны - разницы в спектре до 300 Гц нет. За счет чего "сможем"?
Там парню удалось выполнять быстрое преобразование фурье в реальном времени, не записывая звук в память.
Вообще-то "выполнить БПФ" и "распознать" - далеко не одно и то же. Поэтому "сможем" - ничем не подтверждается. Формантные области отрезаны - разницы в спектре до 300 Гц нет. За счет чего "сможем"?
Я же указал "в реальном времени". То есть никакой нужды обрезать нет и можно смело анализировать спектр сигнала в общепринятом диапазоне от 300 до 3100 Гц.
Я же указал "в реальном времени". То есть никакой нужды обрезать нет и можно смело анализировать спектр сигнала в общепринятом диапазоне от 300 до 3100 Гц.
Очень любопытное предложение: звук, в котором отсутствуют частоты выше 300 Нц, анализировать в диапазоне от 300 до 3100 Гц.
Это совет по принципу: Туалетной бумаги нет - купите наждачную.
никакой нужды обрезать нет
отсутствуют частоты выше 300 Нц
А это совет по принципу: Сказали не резать, а я все равно отрежу?
Не понял, а какие с этим "сложности"? Оно вроде всегда ТАК делалось, нет? Поясните, а то я что-то не понял ..
Звук преобразуется в БПФ "на лету", тут же на лету можно сопоставлять "формантный состав" и отделять гласные от согласных ничего и вовсе не записывая "в память" .. не? Я думал именно так и поступают. .. похоже сильно отстал от "новых технологий" ..
Не понял, а какие с этим "сложности"? Оно вроде всегда ТАК делалось, нет? Поясните, а то я что-то не понял ..
Звук преобразуется в БПФ "на лету", тут же на лету можно сопоставлять "формантный состав" и отделять гласные от согласных ничего и вовсе не записывая "в память" .. не? Я думал именно так и поступают. .. похоже сильно отстал от "новых технологий" ..
Так поступают при неограниченном быстродействии процессора. А у нас оно весьма ограничено, если не считать Due.
Задача была сравнить 5 секунд аналогового сигнала на входе с эталоном в памяти. не обязательно речи. То есть, если не сохранять ничего в память, выполняя корреляционный анализ спектра полученного сигнала с эталоном на лету, вы точно упретесь в производительность восьмибитного МК.
А это совет по принципу: Сказали не резать, а я все равно отрежу?
Кто сказал "не резать"?
Внимательно читаем исходное сообщение темы. Там употреблено слово "отрезали". В прошедшем времени. Этих частот в сигнале УЖЕ нет. Что Вы собираетесь анализировть?
Для задач распознавания голоса (слов) вполне достаточен частотный фильтр по диапазону 100-6000 гц., как мне помнится (давно это було), и для значительного количества случаев можно и существенно меньше .. 0.3-3кгц. Соответственно, частота оцифровки вполне может быть в районе 10кгц или период около 100мксек.
На 16-20Мгц (даже не Х-мега) это более 1500 тактов, с учетом обращений к памяти можно урезать до 1тыс. Вы серъезно считаете что БПФ "на лету" и формантное сравнение 1-5 формант на пусть даже 30 звуков займет больше? (в случае неудачи сравнивать весь набор формант для одного звука нет никакого смысла, надеюсь понятно) :)
А дальше "сигнал" практически "зипован" ибо представляет из себя поток "разобранных звуков-букв".
Я конечно же веду речь за 8-битовую и целочисленную арифметику .. если кто-то пытается делать БПФ на Ардуино в компексных числах .. то он сам себе "злобный Буратино"...
Да, кстати .. задача была сравнить 5сек отфильтрованного до 300гц звука с эталоном .. если эталон один, то вопрос вообще не стоит.
А это совет по принципу: Сказали не резать, а я все равно отрежу?
Кто сказал "не резать"?
Внимательно читаем исходное сообщение темы. Там употреблено слово "отрезали". В прошедшем времени. Этих частот в сигнале УЖЕ нет. Что Вы собираетесь анализировть?
Про это я уже писал выше. Если отрезали - забудьте об этой задаче, так даже две гласные буквы не различите.
Для задач распознавания голоса
Вы серъезно считаете что БПФ "на лету" и формантное сравнение
Откуда вы вообще взяли, что стоит задача распзнавания голоса? В начале темы четко сказано, что стоит задача сравнения двух аналоговых сигналов. Одного хранящегося в памяти. Другого - оцифровываемого АЦП.
Речь о БПФ зашла только из тех соображений, что хранить эталонный сигнал в чистом виде и выполнять корреляционный анализ его с поступающим сигналом, есть путь тупиковый. А вот хранить спектр эталонного сигнала в памяти и выполнять корреляционный анализ его со спектром поступающего сигнала - путь вполне реальный.
Ну вот отсюда и взял. Пусть будет не голос. Там частотный диапазон 1-300гц, так что вопрос о быстродействии как-бы не стоит. Да, вспомнил .. автору стоит поискать что-то про "вейвлетные преобразования", это разновидность Фурье.
Нашел в вики рекурсивный алгоритм построения вейвлета Хаара и вспомнилось.
В общем подход следующий: вейвлет Хаара, это по сути это набор полусумм и полуразностей двух "соседних отсчетов" и легко преобразуется к алгоритму "бегущего оконного вейвлета" заданной степени масштабирования. Соответственно, исходный эталон преобразуем в набор вейвлетов заданного масштаба - "окон" заранее и с ним производим сравнение текущего накопленного содержимого проверочного окна по очереди. Если вся последовательность окон совпала - значит похоже. Первое несовпадение запускает проверку сначала.
По задаче имеем частоты эталона в диапазоне 1-300гц или количество масштабов 8-9 или 2048 чисел (256,128,64,..,1) в одном окне сравнения длительностью в 1сек. Соотвественно для эталона в 5 сек потребуется заранее определить около 10кб эталонных значений. Упихивается во флеш.
Далее, поступающий входной сигнал вычисляет "текущие" значения для масштабов постепенно, по мере появления входных данных и сразу производит сравнение с эталоном. Несовпадение с эталоном просто "продвигает" насчитанный вейвлет. А совпадение накапливает "образец" и продвигает его сравнение.
На каждом входном значении требуется насчитать 18 чисел в "худшем случае", отмасштабировать их к диапазону значений эталона и произвести 18 сравнений. Вполне решаема для Мег задача.
Вейвлетов там только не хватало, этот бред сивой кобылы давно на помойку выбросили.
Бред сивой кобылы:
Вот так правильней )
А если без шуток, то, как я уже писал выше, корреляционный анализ непосредственно результата оцифровки аналогового сигнала с эталоном возможен, но мало эффективен. Гораздо правильней выполнять корреляционный анализ спектров сигналов. По крайней мере, ухо млекопитающих частоты различает на порядки лучше, чем амплитуду.
Для того, чтобы получить спектр, необходимо использовать либо преобразования Фурье, либо вейвлет-преобразование. Первое популярней. Если кто знает еще варианты, явно не уступающие перечисленным, пополните список, пожалуйста.
Что касается вейвлетов, то их значимость для кодирования. Последнее, что припоминается, это JPEG2000. А вот для анализа сигналов они применяются весьма широко. Другое дело, на восьмибитном МК, боюсь, БПФ будет целесообразней, исключительно из-за тех компромиссов, на которые мы обречены без арифметики с плавающей запятой. Хотя тут выбор уже за ТС.
https://habrahabr.ru/post/168517/ вот хорошая статья на Хабре по вейвлет преобразованиям при сжатии изображений. Особенно интересны комментарии про использование целочисленной арифметики .. что я и делал когда-то давно. :)
Видимо я слишком сумбурно написал. Предложенный метод позволяет распознавать сигнал по эталону "на лету", а не предварительно записанными кусками по 5 секунд.
Просто мне было интересно вспомнить свои старые потуги в области распознавания речи, да и ребенок уже интересуется " а можно ли научить Ардуину слушать голосовые команды" .. вот, вспомнилось .. можно будет "попгобовать". :)
Особенно интересны комментарии про использование целочисленной арифметики .. что я и делал когда-то давно. :)
А вообще очень интересно было бы сравнить результы решения данной задачи через БПФ и через вейвлеты, при использовании одинакового алгоритма для корреляционного анализа. Но времени нет, самому и то и другое кодировать (
Так что посылай всех догматиков, что против вейвлетов выступают! Я бы еще третий способ спектрального анализа поискал )
Так ось "масштабов" вейвлета - это и есть "спектр" сигнала, только разложенный по частотам кратным 2. Для указанного диапазона у ТС получаем спектр из частот 1,2,4,8,16,32,64,128 и 256гц .. всего 9 масштабов. Вот "формантный состав" и можно сравнивать с эталоном после квантований. :)
Бред сивой кобылы:
Вот так правильней )
А если без шуток, то, как я уже писал выше, корреляционный анализ непосредственно результата оцифровки аналогового сигнала с эталоном возможен, но мало эффективен. Гораздо правильней выполнять корреляционный анализ спектров сигналов. По крайней мере, ухо млекопитающих частоты различает на порядки лучше, чем амплитуду.
Для того, чтобы получить спектр, необходимо использовать либо преобразования Фурье, либо вейвлет-преобразование. Первое популярней. Если кто знает еще варианты, явно не уступающие перечисленным, пополните список, пожалуйста.
Вы не дочитали, я писал что если только магнитуда меняется, а частота например постоянна, одномерный массив, тогда просто кореляция. Если с частотой, то БПФ - И Кореляция результатов БПФ.
Вы не дочитали, я писал что если только магнитуда меняется, а частота например постоянна, одномерный массив, тогда просто кореляция. Если с частотой, то БПФ - И Кореляция результатов БПФ.
Значит я неверно Вас понял. Приношу извинения. Без корреляционного анализа мы сигналы в любом случае не сравним. Я не знаю другого пути. Если бы кто подсказал, было бы поучительно.
А при чем тут Хартли? Это же, вроде, частный случай теоремы Шенона, интересной только для оценки пропускной способности канала (диапазона) связи. Любимое связистами соотношение сигнал/шум.
А если была описка, и речь про метод Хаара, то сие и есть простейший вейвелет.
4-ре года ищу с кем поспорить
Я преобразования Фурье хуже помню, чем мои дочки (
Так что оппонент я Вам никакой.
А при чем тут Хартли? Это же, вроде, частный случай теоремы Шенона, интересной только для оценки пропускной способности канала (диапазона) связи. Любимое связистами соотношение сигнал/шум.
А если была описка, и речь про метод Хаара, то сие и есть простейший вейвелет.
https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A5%D0%B0%D1%80%D1%82%D0%BB%D0%B8
https://en.wikipedia.org/wiki/Discrete_Hartley_transform
MagicianT, очень интересны детали вашей реализации распознавания голоса на базе Леонардо, в частности:
1. Схемная реализация:
а) Вы пишете голос через микрофон на SD (или куда ещё) и потом его передаете в Леонардо и распознаете "пачками" (ибо памяти у Леонардо 2.5кб, что явно мало для длинного фрагмента звука);
б) или у вас реализовано "распознавание на лету"? В смысле что микрофонный модуль подключается непосредственно к Леонардо и фрагмент звука записывается в память МК и там же распознается с формированием оконного БПФ "на лету";
в) или Вы используете персональный компьтер как средство приема звука (звуковая карта), его предварительного хранения и получения результат БПФ, которое уже воспринимается и анализируется Леонардо?
г) К Леонардо подключен DSP имеющий встроенную функцию преобразования БПФ ..
очень интересен ваш вариант схемной реализации ...
Для себя, преимуществом (и недостатком) применения вейвлетного преобразования я вижу его логарифмичность масштабов с основанием 2 .. это может быть слишком грубым "спектроанализатором" для распознавания именно речи. С другой стороны, в виде преобразования Хаара оно выполняется крайне просто и с меньшей вычислительной мощностью чем даже оконный БПФ.
Не, ну трындец. Умные, образованые ДПФ-БПФ, вавлеты-хуеты... Вы реально не понимаете, что обрезав полосу до 300Гц - ловить нечего? Практически вся информация из потока просто выброшена. Её уже нет. И распознавать просто нечего. И никакие огибающие не помогут. Когдато занимался задачей частотного уплотнения, в канал телефона еще коечто надо было запихнуть. Пока канал урезается с 3400 до 2400Гц - еще нормально все понимаемо, до 2100Гц - иногда есть затруднения, а 2000 - тарабарщина 50/50. Первой исчезает звук "и" часть гласных становятся неразличимы. А при 300Гц вообще ничего от речи не остается. Неверите - возьмите аквалайзер нормальный вырежте им все выше 300Гц и насладитесь результатом
Распознавание речи вообще куда более сложная задача чем БПФ+корреляция с шаблоном. Так можна более менее сделать только под конкретного человека да и то если "правильно" говорит. Понятно не по урезаному до 300Гц.
Блин .. тут обсуждается как-бы 2 задачи:
1. От автора темы, с его урезанным сигналом от 1 до 300Гц .. и что там у него на самом деле и откуда перенесено - его проблема. Он хочет всего лишь выяснить "похоже оно на образец или нет". Кстати, без озвученных критериев похожести .. нет в ней никакого "распознавания".
2. Собственно вопрос распознавания голоса Ардуинкой. Точнее его теоретическая (и как пишут тут) практическая реализация .. эта часть мне и интересна. В ней нет никакого "урезанного" сигнала .. речь идет про частоту оцифровки в 6-10кГц и соответственно попытки понять можно ли анализировать такой оцифрованный звук речи "на лету", с дунькиного микрофона непосредственно дунькой БЕЗ его предварительной записи/нарезки или куда-то в отдельное хранилище и последующим распознаванием. Сдается что - можно.
Насчет самих алгоритмов распознавания .. у меня есть свои старые идеи, хочу их попробовать "ещё раз". Только и всего. То, что сейчас используют я уже нашел кучу интересных статей и обзоров. Узнал очень много интересного, но всё это "в дуньку" вряд ли влезет.
P.S. Не, в 2560 программно может и влезет, там флеша многа .. но вот врядли 16Мгц 8-и битной арифметики "хватит" чтобы успеть отлавливать голосовые команды микрофоном ..
Кстати, без озвученных критериев похожести
Я вот, кстати, задал этот вопрос ТС ещё в самом первом посте темы (ответа, кстати, не получил). Но, похоже, проблемы ТС здесь заинтересовали меня одного, все остальные холиварят "о своём, о девичьем" :))) Да и самого ТС, похоже, эта тема не волнует - пришёл, пукнул, и смылся - ни одного комментария.
Так а что там можно сказать БЕЗ ответа на заданный вами вопрос о критериях похожести? Предлагаете "погадать на кофейной гуще"? Вопрос коррелирует с тем, который мне тоже интересен .. вот и обсуждаем .. мож автору тоже чего сгодится? Практика показывает, что часто вопрошающий задает совсем не тот вопрос, который его интересует на самом деле .. а так, глядишь прочитает и поставит вопрос точнее. А "заодно" можно и свои вопросы порешать .. "2 в 1" :)
Logik-у: Мне кажется, в тех каналах ВЧ снизу до 300 то же обрезан спектр, поэтому вы и не могли разобрать.
А вообще мне тема интересна в широком смысле, голос и речь просто самое затёртое применение алгоритмов распознавания, И самое запутаное, там такой обфурскейшн наворотили эти копи-расты, что уже никто не понимает как простейший кодек работает.
Был у меня проэкт распознавать движения, с акселерометра, 3Д, посложнее чем видео или речь. Для каратиста например, сравнить удар с мастерским, или для пилота. Вобщем я ничего экстраординарного не примудал к той идее, которую уже обрисовал, только измерений добавил.
На Леонардо:
В: а) Вы пишете голос через микрофон на SD (или куда ещё) и потом его передаете в Леонардо и распознаете "пачками" (ибо памяти у Леонардо 2.5кб, что явно мало для длинного фрагмента звука);
Пакетами, размер БПФ 256, потом уплотнение 128 бинов до 16 байт. 1 секунда - хватает на двухсловную фразу проверки динамиков на компе "спикер лефт"/"спикер райт". Семплирование 4кГц.
В: б) или у вас реализовано "распознавание на лету"? В смысле что микрофонный модуль подключается непосредственно к Леонардо и фрагмент звука записывается в память МК и там же распознается с формированием оконного БПФ "на лету";
Не, на лету поленился, поставил триггер, появился звук - пишем / сравниваем. Но эта часть зависит от того сколько словарный запас, я сделал 1-у комманду с хранением в ЕЕПРОМ. Легко переписать код под ФЛЭШ, до 20 комманд, 1к на комманду (или удар мастера). С одной на лету проблем с быстродейстжием ардуино нет, а вот 10 может не потянуть, не проверял
Ознакомиться можно здесь: https://cloud.mail.ru/public/4xEH/Q9xrNuy5j https://cloud.mail.ru/public/4xEH/Q9xrNuy5j
Спасибо, очень интересно. Показалось несколько странным вычисление магнитуды в цикле строки 409 скетча 3е .. почему именно 243 и 100 в качестве коэффициентов-множителей?
Апроксимация, что бы квадратный корень не считать - долго на ардуино. Взято отсюда: http://www.dspguru.com/dsp/tricks/magnitude-estimator
Ошибка не более 5%. Коэфициенты 0.95 и 0.39 для 8-бит (0.95х256 и 0.39х256)
Ну .. в целом там понятно все .. только вот в современных релизах пытаются отвязаться от темпа речи и тембра говорящего, чего у Вас - нет. То есть, если сказать заветную фразу медленно или быстро - Вас Леонардо не опознает. А в целом - очень просто и интересный код, спасибо.
Ну, не совсем так. Как я уже упоминал, мой подход для речи - 2 D сравнение, соответственно фильтры ВЧ и корелляция то же 2D.
Представ'те пятно краски на бумаге (спектрограмма) и его надо сражнить с другим. Смещение вверх-вниз (по частоте) оценивается как ошибка в
той же пропорции что и смещение влево-вправо ( ошибка времени или темпа голоса). Вот кернел:
1
const
int8_t EE[3][3] = {
// EDGE ENHANCEMENT HPF MATRIX 3 x 3
2
{-1, -1, -1 },
3
{-1, 8, -1 },
4
{-1, -1, -1 }
5
};
как видите, он симметричен. Вводя ассиметрию я запросто могу дегрейдить частотную (идентификация голосового тракта) или темпоральную компоненту (усталость, темп ).
Результаты просто невероятные, при всех аппроксимациях ардуино с вероятностью 98-99% распознаёт "front left". Для "front right" кореляция падает ниже 30%. Что интересно, фразы на половину - первое слово - схожи. Там есть куда "дегрейдить", я не смог повторить одно и тоже слово с вероятностью больше 95, слишком жёсткий фильтр.
"вейвлетные преобразования", это разновидность Фурье.
Отнюдь.
А если без шуток, то, как я уже писал выше, корреляционный анализ непосредственно результата оцифровки аналогового сигнала с эталоном возможен, но мало эффективен. Гораздо правильней выполнять корреляционный анализ спектров сигналов. По крайней мере, ухо млекопитающих частоты различает на порядки лучше, чем амплитуду.
Последнее замечание весьма существенно.
Дело в том, что само ухо производит преобразование сигнала весьма близкое к Фурье-анализу. Именно поэтому (и ТОЛЬКО поэтому) сравнение спектров вместо сравнения сигналов приводит к гораздо лучшему результату с точки зрения человеческого слуха.
Если же у нас сигнал от 1 до 300 Гц, то мне представляется маловероятным, что его сравнение следует производить, исходя из особенностей человеческого слуха. И ТС об этом не пишет.
Следовательно, целесообразность БПФ вызывает существенные сомнения. Про вейвлеты я даже не говорю: во-первых, не доказано, что ухо делает что-то похожее на вейвлет-преобразование, а во-вторых, вейвлеты пока теоретически проработаны существенно хуже, чем ПФ.
В общем, первое, что следует сделать, - это определиться с критерием схожести. И только потом искать под этот критерий адекватный алгоритм обработки.
В общем, первое, что следует сделать, - это определиться с критерием схожести. И только потом искать под этот критерий адекватный алгоритм обработки.
Плюсую. Просто ТС пропал и народ подался в теоретизирование при различных допущениях )