|
|
  |
FFT на асм для ARM7TDMI (AT91SAM7xx) |
|
|
|
Nov 15 2012, 19:55
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(_Pasha @ Nov 15 2012, 14:28)  А заинлайнить BitShift() и Butterfly() слабо?  Когда там запилят уже fixed point в gcc? В С11 уже ж вроде попало. Или в 4.8 уже есть? Сюда Код typedef int _Complex cmplx_t;
//cmplx_t a = 2 + 3I; //cmplx_t b = -1 + 2I;
void foo(cmplx_t *px, cmplx_t *py, cmplx_t w, int len) { while(len--) { cmplx_t temp = *px + *py * w; *py = *px - *py * w; *px = temp; ++px; ++py; } } arm-none-eabi-gcc -Os -S -mcpu=cortex-m3 -mthumb cmplx-int.c CODE foo: push {r4, r5, r6, r7, r8, lr} ldr r4, [sp, #24] b .L2 .L3: ldmdb r1, {r5, r8} mul r7, r2, r5 mls r7, r3, r8, r7 mul r8, r2, r8 mla r5, r3, r5, r8 ldr ip, [r0, #-8] ldr r6, [r0, #-4] rsb r8, r7, ip str r8, [r1, #-8] add r7, ip, r7 rsb r8, r5, r6 adds r5, r6, r5 str r8, [r1, #-4] str r7, [r0, #-8] str r5, [r0, #-4] .L2: subs r4, r4, #1 adds r0, r0, #8 adds r1, r1, #8 cmp r4, #-1 bne .L3 pop {r4, r5, r6, r7, r8, pc} ещё fixed point встроенный, так и вообще хорошо. (правда это Cortex-M3, тут ещё mla/mls хорошо пошли) Закат солнца вручную тоже нормально выглядит: Код #define FIXED_FACTOR (1<<12)
typedef int _Complex cmplx_t;
void foo(cmplx_t *px, cmplx_t *py, cmplx_t w, int len) { while(len--) { cmplx_t temp = *py * w / FIXED_FACTOR; *px = *px + temp; *py = *px - temp; ++px; ++py; } } CODE foo: push {r4, r5, r6, r7, r8, lr} ldr r4, [sp, #24] b .L2 .L5: ldmdb r1, {r5, r8} mul r6, r2, r5 mls r6, r3, r8, r6 mul r8, r2, r8 mla r5, r3, r5, r8 cmp r6, #0 itt lt addlt r6, r6, #4064 addlt r6, r6, #31 cmp r5, #0 ldr ip, [r0, #-8] ldr r7, [r0, #-4] itt lt addlt r5, r5, #4064 addlt r5, r5, #31 add r6, ip, r6, asr #12 add r5, r7, r5, asr #12 str r6, [r0, #-8] str r5, [r0, #-4] str ip, [r1, #-8] str r7, [r1, #-4] .L2: subs r4, r4, #1 adds r0, r0, #8 adds r1, r1, #8 cmp r4, #-1 bne .L5 pop {r4, r5, r6, r7, r8, pc}
(ой, ну по нормальному там не ++px; ++py; а раскрыв крыльев бабочки передавать надо)
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Nov 15 2012, 20:41
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Вроде ж давно есть fixed... Да, пока не забыл - бит реверс по приснопамятному красивому трюку ЗдесьТ.е. вместо тяжеленького BitShift пишем хард-кодед вариант Код b = ((b * 0x0802LU & 0x22110LU) | (b * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16; Где там ошибка - сходу вроде нету. Мож, в представлении Q11 косяк? Не вникал, короче.
|
|
|
|
|
Nov 16 2012, 16:56
|

Профессионал
    
Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980

|
По-моему, BitShift это мелочи  , я сейчас пытаюсь основной цикл перекрутить ... Код // Main FFT loop for ( stc = 0; stc < NumOfStages; stc ++ ) { NumOfButterflys = (1<<stc); NumOfBlocks = FFT_N>>(stc+1);
for ( blc=0; blc < NumOfBlocks; blc ++ ) { base = (1<<(stc+1))*blc; for ( bfc=0; bfc < NumOfButterflys; bfc ++ ) { Butterfly ( X+base+bfc, X+base+bfc+NumOfButterflys, NumOfBlocks*bfc ); } // for } // for } // for Butterfly - самая тяжёлая вещь ... http://www.embeddedsignals.com/ARM.htm - есть всё, но Cortex-M3
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Nov 18 2012, 10:57
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(hd44780 @ Nov 18 2012, 12:09)  _Pasha, с unroll непонятно - как я могу его сделать, ведь число оборотов циклов заранее неизвестно? Возможно я не понял, что Вы имели в виду  . Поясните пожалуйста. Вы про unroll loops? Это - можно -O2 сделать - оно автоматом включится, там где выгоднее. Про перестановку бит - я тут более артист разговорного жанра... надо еще посчитать, что лучше. Но может лучше - табличкой, для 256 отсчетов-то?
|
|
|
|
|
Nov 18 2012, 11:26
|

Профессионал
    
Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980

|
Цитата(_Pasha @ Nov 18 2012, 12:57)  Вы про unroll loops? Это - можно -O2 сделать - оно автоматом включится, там где выгоднее. Спасибо, попробую. Цитата(_Pasha @ Nov 18 2012, 12:57)  может лучше - табличкой, для 256 отсчетов-то? с этим вообще пока не разбирался почти. Гляну ещё. Вот, сделал замеры времени одного прохода FFT через DBGU и COM-порт: ---> DoFFT start Create complex data: 1 ms Window function 0: 0 ms FFT: 9 ms Determine spektrum: 0 ms --> DoFFT end Window function 0 - прямоугольное окно, т.е. вообще там ничего нет. FFT - скачет 8-9 ms. Determine spektrum - всегда 0 - значит, меньше 1 ms. Эти цифры вообще нормальные? Может там собака в другом месте зарыта .. У меня сейчас отображает всё вместе - осциллограмму, FFT, ещё уровень рисует - просто максимум по каждому блоку данных АЦП. Еще и часиси рисует  . Щас выкину всё, оставлю только FFT.
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Nov 19 2012, 18:15
|

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

|
Цитата(hd44780 @ Nov 15 2012, 10:05)  На Си нашёл, вставил в программу - тормозит оно. Конечно, гораздо лучше, чем на AVR, но всё равно не айс. Надо сделать аудио-анализатор. Сделать-сделал, осциллограммы рисует великолепно, рендер быстрый для дисплея написал, а с FFT проблемы. Вам нужен RealFFT и аппроксимация формулы для нахождения магнитуды (Р.Лайонс страница 475). По-поводу asm я где-то статью когда-то чью-то бросал сюда на форум. По поводу мегаоптимизаций - откажитесь от битреверса, примените RADIX4 и на асме вручную разверните внутренние циклы (не каскады бабочек). Вряд ли есть куда двигаться дальше в этом вопросе... кстати раз уж пошли аппроксимации то набор IIR + блочное суммирование под частоту обновления экрана вполне претендует на спасение отца русской демократии. Ну а если уж совсем упростить - полосовые фильтры можно строить на основе фильтров скользящего среднего (можно ведь и в дифференцирующем включении их реализовать). Но результат будет... ммм... ну главное что он таки будет.
--------------------
Нас помнят пока мы мешаем другим... //-------------------------------------------------------- Хороший блатной - мертвый... //-------------------------------------------------------- Нет старик, это те дроиды которых я ищу...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|