|
|
  |
Voice recognition with AVR |
|
|
|
Oct 23 2008, 13:50
|
Гуру
     
Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588

|
Цитата(Rst7 @ Oct 23 2008, 13:19)  Ну что, вычисление мощностей с нормированием - это плюс 3200 тактов. Не понимаю, как вы считаете. Если даже преположить, что после, например, ДПФ будет два слова на выборку вместо одного, то мощность - это два умножения и сложение, т.е. где-то 5 тактов без пересылок для 8 бит, ну или 50 для 16 бит. Нормаирование - одно сравнение и одно умножение. Пусть еще столько же. Как удалось увличить эту цифру в 30 раз ? Цитата(Rst7 @ Oct 23 2008, 13:45)  Так что, слабо? На слабо меня не взять. А вот перспективной идеей - можно. Так что там, есть уже какие наработки ? Или выложить слабо (с) ?
|
|
|
|
|
Oct 23 2008, 13:51
|
Гуру
     
Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261

|
Цитата(Огурцов @ Oct 23 2008, 17:38)  ...жду когда здесь что-то вменяемое появится, чтобы помоделировать. Врачи, как известно, делятся на три категории: 1. Терапевты, - всё обо всём знают, но ничего не умеют.. 2. Хирурги, - ничего решительно не знают, но всё умеют.. 3. Патологоанатомы, - всё знают и всё умеют, но приходят слишком поздно.. Вы, как я понимаю, "Терапевт"?
|
|
|
|
|
Oct 23 2008, 18:20
|

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

|
Цитата(Огурцов @ Oct 23 2008, 16:50)  Не понимаю, как вы считаете. Если даже преположить, что после, например, ДПФ будет два слова на выборку вместо одного, то мощность - это два умножения и сложение, т.е. где-то 5 тактов без пересылок для 8 бит, ну или 50 для 16 бит. Нормаирование - одно сравнение и одно умножение. Пусть еще столько же. Как удалось увличить эту цифру в 30 раз ? Я не считаю. Это результат замера. А вот как Вам удалось получить "30 раз" я не знаю. Даже Ваша прикидка дает (50+50)*15=1500, и еще там одно деление 32 на 32, это 500 тактов, грубо говоря, и еще 15 квадратных корней, у меня получилось 56*15=840. Итого, 3340, даже больше, чем мой код  Другое дело, там прилично накладных расходов в связи с тем, что данные для каждой частоты расположены на выходе ДПХ не очень удачно для простой обработки. Но это, я думаю, можно будет устранить. Однако, больших чудес ждать не приходится. Ну и с другой стороны, эта часть кода имеет сложность O(n), так что если вдруг будем увеличивать количество точек, общий вес этой части уменьшится. Цитата На слабо меня не взять. А вот перспективной идеей - можно. Зачем Вам идеи? Вы же все знаете и все умеете?  Цитата Так что там, есть уже какие наработки ? Или выложить слабо (с) ? Уже готовитесь спереть? Пока выложить могу только эти две функции. Они Вам нужны?
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Oct 23 2008, 19:14
|
Гуру
     
Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588

|
8x Код : C = A * A + B * B; +00000069: 0288 MULS R24,R24 Multiply signed +0000006A: 0190 MOVW R18,R0 Copy register pair +0000006B: 2411 CLR R1 Clear Register +0000006C: 01C9 MOVW R24,R18 Copy register pair 13: } +0000006D: 0F82 ADD R24,R18 Add without carry +0000006E: 1F93 ADC R25,R19 Add with carry Я насчитал 7 16x Код C = A * A + B * B; +00000069: 2744 CLR R20 Clear Register +0000006A: FD37 SBRC R19,7 Skip if bit in register cleared +0000006B: 9540 COM R20 One's complement +0000006C: 2F54 MOV R21,R20 Copy register +0000006D: 01CA MOVW R24,R20 Copy register pair +0000006E: 01B9 MOVW R22,R18 Copy register pair +0000006F: 940E0085 CALL 0x00000085 Call subroutine +00000071: 017B MOVW R14,R22 Copy register pair +00000072: 018C MOVW R16,R24 Copy register pair +00000073: 019E MOVW R18,R28 Copy register pair +00000074: 2744 CLR R20 Clear Register +00000075: FD37 SBRC R19,7 Skip if bit in register cleared +00000076: 9540 COM R20 One's complement +00000077: 2F54 MOV R21,R20 Copy register +00000078: 01CA MOVW R24,R20 Copy register pair +00000079: 01B9 MOVW R22,R18 Copy register pair +0000007A: 940E0085 CALL 0x00000085 Call subroutine +0000007C: 01DC MOVW R26,R24 Copy register pair +0000007D: 01CB MOVW R24,R22 Copy register pair +0000007E: 0EE8 ADD R14,R24 Add without carry +0000007F: 1EF9 ADC R15,R25 Add with carry +00000080: 1F0A ADC R16,R26 Add with carry +00000081: 1F1B ADC R17,R27 Add with carry 13: } +00000082: 01C7 MOVW R24,R14 Copy register pair
+00000083: 940C00A4 JMP 0x000000A4 Jump
+00000085: 9F62 MUL R22,R18 Multiply unsigned +00000086: 01D0 MOVW R26,R0 Copy register pair +00000087: 9F73 MUL R23,R19 Multiply unsigned +00000088: 01F0 MOVW R30,R0 Copy register pair +00000089: 9F82 MUL R24,R18 Multiply unsigned +0000008A: 0DE0 ADD R30,R0 Add without carry +0000008B: 1DF1 ADC R31,R1 Add with carry +0000008C: 9F64 MUL R22,R20 Multiply unsigned +0000008D: 0DE0 ADD R30,R0 Add without carry +0000008E: 1DF1 ADC R31,R1 Add with carry +0000008F: 9F92 MUL R25,R18 Multiply unsigned +00000090: 0DF0 ADD R31,R0 Add without carry +00000091: 9F83 MUL R24,R19 Multiply unsigned +00000092: 0DF0 ADD R31,R0 Add without carry +00000093: 9F74 MUL R23,R20 Multiply unsigned +00000094: 0DF0 ADD R31,R0 Add without carry +00000095: 9F65 MUL R22,R21 Multiply unsigned +00000096: 0DF0 ADD R31,R0 Add without carry +00000097: 2799 CLR R25 Clear Register +00000098: 9F72 MUL R23,R18 Multiply unsigned +00000099: 0DB0 ADD R27,R0 Add without carry +0000009A: 1DE1 ADC R30,R1 Add with carry +0000009B: 1FF9 ADC R31,R25 Add with carry +0000009C: 9F63 MUL R22,R19 Multiply unsigned +0000009D: 0DB0 ADD R27,R0 Add without carry +0000009E: 1DE1 ADC R30,R1 Add with carry +0000009F: 1FF9 ADC R31,R25 Add with carry +000000A0: 01BD MOVW R22,R26 Copy register pair +000000A1: 01CF MOVW R24,R30 Copy register pair +000000A2: 2411 CLR R1 Clear Register +000000A3: 9508 RET Subroutine return Где-то 108. Цитата(Rst7 @ Oct 23 2008, 18:20)  и еще там одно деление 32 на 32, это 500 тактов Да деление, но оно одно на весь результат. Сколько там, на 8 отсчетов, 16 или 32 - сколько берем, еще не определились. Если брать много, то несколько фонем может объединиться, если брать мало, число "фонем" может возрасти, т.к. вроде бы спектр некоторых фонем динамический, и фонема получится состоящая как бы из нескольких частей. Несмотря на свое определение. Цитата(Rst7 @ Oct 23 2008, 18:20)  и еще 15 квадратных корней, у меня получилось 56*15=840. А зачем корни ? Какая разница, сравнивать значение или его корень ? И даже с корнем - тоже один корень на выборку. Цитата(Rst7 @ Oct 23 2008, 18:20)  Уже готовитесь спереть? Нет, пока думаю, скачивать файл или не скачивать ) Цитата(Rst7 @ Oct 23 2008, 18:20)  Пока выложить могу только эти две функции. Они Вам нужны? Я ж не один здесь. Надеюсь. Не подойдет мне, может кому другому подойдет.
Сообщение отредактировал Огурцов - Oct 23 2008, 19:27
|
|
|
|
|
Oct 23 2008, 19:54
|

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

|
Цитата(Огурцов @ Oct 23 2008, 22:14)  8x Код : C = A * A + B * B; +00000069: 0288 MULS R24,R24 Multiply signed ... Я насчитал 7 Чипуха какая-то. Очевидно что для двух * должно быть две команды MUL. Подозреваю такая же чипуха у вас и в 16x. Теперь понятно откуда у вас берется порядок на 16x.
|
|
|
|
|
Oct 23 2008, 20:26
|
Гуру
     
Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588

|
Цитата(defunct @ Oct 23 2008, 19:54)  Чипуха какая-то. Очевидно что для двух * должно быть две команды MUL. Действительно, косячище. Это мы с другом оптимизатором наоптимизили. Код +00000069: 8199 LDD R25,Y+1 Load indirect with displacement +0000006A: 8189 LDD R24,Y+1 Load indirect with displacement +0000006B: 0298 MULS R25,R24 Multiply signed +0000006C: 0190 MOVW R18,R0 Copy register pair +0000006D: 2411 CLR R1 Clear Register +0000006E: 819A LDD R25,Y+2 Load indirect with displacement +0000006F: 818A LDD R24,Y+2 Load indirect with displacement +00000070: 0298 MULS R25,R24 Multiply signed +00000071: 01C0 MOVW R24,R0 Copy register pair +00000072: 2411 CLR R1 Clear Register +00000073: 0F28 ADD R18,R24 Add without carry +00000074: 1F39 ADC R19,R25 Add with carry +00000075: 833C STD Y+4,R19 Store indirect with displacement +00000076: 832B STD Y+3,R18 Store indirect with displacement 21, из них 12 на загрузку/выгрузку. Итого 9 вместо 7. Цитата(defunct @ Oct 23 2008, 19:54)  Подозреваю такая же чипуха у вас и в 16x. Для 16x несколько лучше, в процентном оношении - стало 151, из них 16 на загрузку/выгрузку. С другой стороны вот это Код LDD R25,Y+1 Load indirect with displacement LDD R24,Y+1 можно будет заменить на Код LDD R25,Y+1 Load indirect with displacement MOV R24,R25 И вообще, с оптимизацие того же ДПФ оптимизатор скорее всего не справится...
Сообщение отредактировал Огурцов - Oct 23 2008, 20:20
|
|
|
|
|
Oct 23 2008, 22:06
|

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

|
Цитата(Огурцов @ Oct 23 2008, 19:26)  21, из них 12 на загрузку/выгрузку. Итого 9 вместо 7 Вообще 10, если без очистки R1. Но за каким шутом вы его очищаете? Проще так Код ld r16,y+ muls r16,r16 movw r17,r0 ld r16,y+ muls r16,r16 add r17,r0 adc r18,r1 st y+,r18 st y+,r17 16/8
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 23 2008, 22:06
|

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

|
Цитата(Огурцов @ Oct 23 2008, 23:26)  Для 16x несколько лучше, в процентном оношении - стало 151, из них 16 на загрузку/выгрузку. Моя цифра - 38 (32-х битный результат): Код .def AL = R24 .def AH = R25
.def z_reg = R2
.def u32_b0 = R18 .def u32_b1 = R19 .def u32_b2 = R20 .def u32_b3 = R21
; --> ax 16 bit operand ; <-- 32 bit result u32_xx .MACRO sqr_ax mul ah, ah movw u32_b3: u32_b2, r1:r0
mul al, al movw u32_b1: u32_b0, r1:r0
mul ah, al
add u32_b1, r0 adc u32_b2, r1 adc u32_b3, z_reg
add u32_b1, r0 adc u32_b2, r1 adc u32_b3, z_reg .endmacro
.cseg ldi AL, Low(RAMEND) out SPL, AL ldi AL, High(RAMEND) out SPH, AL
clr z_reg
; начинаем счет таков отсюда ;-----> C = A * A + B * B (a=1234, b=567, c should be 1844245) ldi al, Low(1234) ldi ah, High(1234) sqr_ax ; A * A
movw r5:r4, u32_b1:u32_b0 movw r7:r6, u32_b3:u32_b2
ldi al, Low(567) ldi ah, High(567) sqr_ax ; B * B
add u32_b0, r4 adc u32_b1, r5 adc u32_b2, r6 adc u32_b3, r7 ; A * A + B * B Результат в u32_xx (b3 - MSB, b0 - LSB).
|
|
|
|
|
Oct 23 2008, 22:32
|
Гуру
     
Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588

|
Цитата(=GM= @ Oct 23 2008, 22:06)  Вообще 10, если без очистки R1. Но за каким шутом вы его очищаете? Да что вы, это результат с отключенным мосхом. Compiler only, так сказать. Цитата(defunct @ Oct 23 2008, 22:18)  Уже немного оптимизировал, из 44-х тактов осталось 38. Ну вот, это гораздо ближе к прогнозу. Те вещи, которые можно творить на асме, на це никогда не сделаешь. Обратное тоже верно )
|
|
|
|
|
Oct 23 2008, 23:07
|

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

|
Цитата(defunct @ Oct 23 2008, 21:18)  Уже немного оптимизировал, из 44-х тактов осталось 38. знаковые/беззнаковые не суть важно. (при возведении в квадрат всегда получаем положительное число, поэтому отрицательные операнды можно предварительно преобразовать в положительные, рез-тат не изменится, а по тактам такое преобразование - чепуха, никак не > 100). Не скажите, ведь надо делать два преобразования 16-битных чисел для каждой спектральной составляющей, что добавит десяток тактов к вашему умножению. Возможно оптимальнее будет использовать комбинацию MUL для младших байтов и MULS для старших. Кстати, спасибо, вы дали ответ на мой вопрос, насколько в данном случае авр уступает дсп по скорости (боюсь, какбы друит не набежал(:-)) - примерно в 38+38 = 76 раз по тактам, а если учесть знаковую конверсию, то вгрубе будет 100.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|