|
|
  |
Voice recognition with AVR |
|
|
|
Oct 23 2008, 23:34
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(=GM= @ Oct 24 2008, 02:07)  Не скажите, ведь надо делать два преобразования 16-битных чисел для каждой спектральной составляющей, что добавит десяток тактов к вашему умножению. Почему два? Положительных составляющих типа не бывает? ;> Цитата Возможно оптимальнее будет использовать комбинацию MUL для младших байтов и MULS для старших. Для младших надо сделать операцию NEG. иначе такое умножение ни к чему хорошему не приведет. Цитата учесть знаковую конверсию, то вгрубе будет 100. Если преобразовывать сразу при расчете, то это сведется к доп. 3-м тактам в худшем случае (к двум в лучшем) на каждую составлющую: Код brpl __store com RxH neg RxL __store: в среднем +5 тактов к 38-ми
|
|
|
|
|
Oct 24 2008, 03:35
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Господа, ну вы что, думаете, что я не знаю, как быстро возвести в квадрат на AVR? Конечно знаю. Если к вашим упражнениям прибавить необходимые загрузки и выгрузки, то получим число, близкое к моему. А корни считать надо все равно. Еще раз повторюсь: там много накладных расходов. Я буду их уменьшать. Но, видимо, потом, потому как необходимо править последний проход БПХ для перетасовывания данных. А господину Огурцову я бы порекомендовал сначала думать, потом говорить, и не высасывать из пальца темы для флуда. PS А почему никто не кричит, что 2000 тактов на 32хточечное БПХ - это много?
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Oct 24 2008, 10:46
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Для тех, кому не терпится, выкладываю проект и листинг. В проекте только DHT и расчет мощностей с нормированием. Временно выключен inline для того, чтобы проще было читать листинг. Несмотря на то, что я перетасовал выход DHT для более простой манипуляции с данными в последующем расчете мощностей выигрыша это почти не дало. Результаты со включенным инлайном: DHT - 1947 PWRS - 3122 Если есть возражения к коду - велком...
proj.zip ( 6.25 килобайт )
Кол-во скачиваний: 113
list.zip ( 6.88 килобайт )
Кол-во скачиваний: 105
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Oct 24 2008, 10:53
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(defunct @ Oct 23 2008, 22:34)  Почему два? Положительных составляющих типа не бывает? Два, потому что есть действительная и мнимая составляющая спектра, каждую надо проверять на знак. Загрузку считать надо обязательно, поскольку множители не константы. (Подправил цифры, почему-то считал, что movw выполняется за два такта.) Вот мой вариант перемножения (a1,a0)*(a1,a0)+(b1,b0)*(b1,b0)->(c3,c2,c1,c0), сделанный на базе ваших макросов, просто отказался от регистров промежуточного хранения r7-r4 Код ld a1,y+ ld a0,y+ ld b1,y+ ld b0,y+
mul a1,a1 movw c2,r0 mul a0,a0 movw c0,r0 mul a1,a0 add c1,r0 adc c2,r1 adc c3,r2 add c1,r0 adc c2,r1 adc c3,r2
mul b1,b1 add c2,r0 adc c3,r1 mul b0,b0 add c0,r0 adc c1,r1 adc c2,r2 adc c3,r2 mul b1,b0 add c1,r0 adc c2,r1 adc c3,r2 add c1,r0 adc c2,r1 adc c3,r2 Итого 32 такта на вычисления, всего, с загрузкой множителей из рамы, получилось 40 тактов. Ещё можно сэкономить регистры b1, b0, если делать загрузку второго множителя в регистры (a1,a0) непосредственно перед вычислением (b1,b0)*(b1,b0). (Третий раз корректирую, спасибо rst7) Цитата(defunct @ Oct 23 2008, 22:34)  Если преобразовывать сразу при расчете, то это сведется к доп. 3-м тактам в худшем случае (к двум в лучшем) на каждую составлющую: Код brpl __store com RxH neg RxL __store: Хм, загрузка множителя не даёт флагов, надо делать тестирование, а это доптакты. Вы привели неполный код для конверсии. В среднем у вас будет будет 6 тактов, т.е. для вашего кода в среднем будет 38+6=44 на вычисления плюс 8 на загрузку, всего 52.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 24 2008, 11:08
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(=GM= @ Oct 24 2008, 13:53)  Два, потому что есть действительная и мнимая составляющая спектра. И они обе отрицательные всегда?  Цитата Не знаю, как вы считали такты, для вашего кода у меня получилось ровно 40 тактов, не считая загрузки множителей. Загрузку считать надо обязательно, поскольку они не константы. AVR-студией, код приведен. Загрузка операндов там есть, правда не из RAM а из флеш, но по скорости одинаково. Цитата Хм, загрузка множителя не даёт флагов, надо делать тестирование, а это доптакты. Вы привели неполный код для конверсии. В среднем у вас будет будет 6 тактов, т.е. для вашего кода в среднем будет 40+6=46 на вычисления плюс 8 на загрузку, всего 54. Нет не будет там 6 тактов в среднем, в среднем будет 5, как я и написал, из расчета что одна из составляющих уже положительная. Вчитайтесь в то что я написал. Преобразовывать сразу при расчете. - расчитали спектральную составляющую и перед сохранением (пока еще флаги известны) сделали модуль. Вы же предполагаете что модуль будет считаться после загрузки. i.e.: 1. расчет составляющей <-- я предлагаю преобразование делать сразу здесь 2. сохранение в массив 3. загрузка из массива <-- вы предполагаете преобразование делать здесь 4. вычисление мощности
|
|
|
|
|
Oct 24 2008, 11:29
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата brpl __store com RxH neg RxL __store: Чтото мне говорит, что такой код работать не будет. Вот так - будет: Код NEG Rh NEG Rl SBCI Rh, 0 А вообще я по другому делаю, рекомендую глянуть в проект/листинг.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Oct 24 2008, 12:04
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата Вот мой вариант перемножения (a1,a0)*(a1,a0)+(b1,b0)*(b1,b0)->(c3,c2,c1,c0), Тоже не работает. Два произведения есть, а суммы нету  Господа, хватит. IAR делает вполне приемлемый код
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Oct 25 2008, 09:54
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата считать спектр мощности при этом теряя всю информацию о фазовой составляющей Нам фаза сигнала не нужна. Мы сравниваем спектры мощности. Такой у нас алгоритм. Цитата Быстрая корреляция методом сравнения спектров мощности это нечто новое вообще. Тут никто не говорит о вычислении взаимной корреляции. Цитата Отбрасывать половину спектра... Вернее зачем отбрасывать я понимаю, а вот зачем ее было считать!!!??? А кто ее отбрасывает и кто ее считает? 32 результата после Хартли суть 15 пар значений, которые определяют мощность каждой спектральной составляющей и постоянку, которую отбрасываем. Цитата Кстати в FWT это отбрасывание делается лЁгко, и экономит часть расчетов... А причем тут вейвлеты? Отбрасывать надо пол-спектра именно при DFT (Фурье), на входе которого только действительные числа. Тогда спектр зеркально симметричен. Мы же, для оптимизации, пользуем DHT (Хартли), которое именно под это и заточено - под обработку действительных исходных данных. Цитата Мда уш... К Вам это тоже относится
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Oct 25 2008, 11:14
|

山伏
    
Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294

|
Цитата(Rst7 @ Oct 25 2008, 12:54)  Нам фаза сигнала не нужна. Мы сравниваем спектры мощности. Такой у нас алгоритм. ну так алгоритм принципиально глупый скажу я Вам, он насыщен излишними вычислениями в принципе, а некоторые уже взялись за ассемблер... Цитата(Rst7 @ Oct 25 2008, 12:54)  Тут никто не говорит о вычислении взаимной корреляции. Вот это то меня и пугает. Ибо это и есть математическая основа любого распознавания. Цитата(Rst7 @ Oct 25 2008, 12:54)  А кто ее отбрасывает и кто ее считает? 32 результата после Хартли суть 15 пар значений, которые определяют мощность каждой спектральной составляющей и постоянку, которую отбрасываем. Ага. Вот только основная мощность фонемы сосредоточена в частотах от 500 Hz... Мощность,в этом контексте, показывает что "за пределами" сигнала практически нет, а не то, что это кртитерий распознавания... Цитата(Rst7 @ Oct 25 2008, 12:54)  А причем тут вейвлеты? А при том, что это отображение во многих случаях(вот как сдесь) эффективнее FCT(или FHT). Причем ни для быстрой корреляции ни для, непонятно для чего примененного, спектра мощности оно не потребует туда-сюда переходов к комплексным числам, как и Хартли. Цитата(Rst7 @ Oct 25 2008, 12:54)  Отбрасывать надо пол-спектра именно при DFT (Фурье), на входе которого только действительные числа. Тогда спектр зеркально симметричен. Мы же, для оптимизации, пользуем DHT (Хартли), которое именно под это и заточено - под обработку действительных исходных данных. Вы меня совершенно не поняли. Я про отброс частот 0..400Hz которые обрабатываются "напрасно"... Цитата(Rst7 @ Oct 25 2008, 12:54)  К Вам это тоже относится  Разумеется. Только не в этом случае.
--------------------
Нас помнят пока мы мешаем другим... //-------------------------------------------------------- Хороший блатной - мертвый... //-------------------------------------------------------- Нет старик, это те дроиды которых я ищу...
|
|
|
|
|
Oct 25 2008, 12:08
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата ну так алгоритм принципиально глупый Да ну? А я, например, считаю, что алгоритм весьма не глуп. Вычисляя спектр мощности мы выбрасываем из сигнала то, что не несет информации (например, фазу сигнала). Затем ищем ближайший из известных спектров. А вот что Вы предлагаете - мне пока не понять. Вы предлагаете вычислять корреляционную функцию заранее известных сигнало прямо c входными семплами??? И что же Вы получите на выходе? Банально, что делать с фазой сигнала, которая не несет информации, но может сильно меняться?
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Oct 26 2008, 12:44
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Ну что, сделал я поиск ближайшего спектра, заодно пооптимизировал остальное (в частности, сумму квадратов считаю прямо в финальных бабочках DHT, в результате получение 15ти квадратов мощностей из исходных 32х выборок сигнала занимает 2634 такта, причем заодно я нахожу максимальное значение мощности для последующей нормализации). Ну а нормализация с извлечением корня и поиск ближайшего из 25ти спектров занимает 6924 6482 такта. Основное время, как понимаете, занимает именно поиск ближайшего. В принципе, есть одна идея насчет оптимизации этого поиска, но это потом, когда получится остальное. С другой стороны, суммарно имеем менее 10000 тактов, что при тактовой, скажем, 8МГц - чуть больше миллисекунды. А выборка 32х точек - 10мс. Исходник и листинг в аттаче.
main.zip ( 10.61 килобайт )
Кол-во скачиваний: 202PS Ждем спектров  PPS И еще немножко оптимизировал, аттач положил новый.
Сообщение отредактировал Rst7 - Oct 26 2008, 12:55
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|