реклама на сайте
подробности

 
 
6 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> FFT на асм для ARM7TDMI (AT91SAM7xx)
ReAl
сообщение Nov 15 2012, 19:55
Сообщение #16


Нечётный пользователь.
******

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



Цитата(_Pasha @ Nov 15 2012, 14:28) *
А заинлайнить BitShift() и Butterfly() слабо? sm.gif
Когда там запилят уже 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; а раскрыв крыльев бабочки передавать надо)


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Nov 15 2012, 20:41
Сообщение #17


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Вроде ж давно есть fixed...

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


Где там ошибка - сходу вроде нету. Мож, в представлении Q11 косяк? Не вникал, короче.
Go to the top of the page
 
+Quote Post
hd44780
сообщение Nov 16 2012, 16:56
Сообщение #18


Профессионал
*****

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



По-моему, BitShift это мелочи sm.gif , я сейчас пытаюсь основной цикл перекрутить ...

Код
  // 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 sad.gif


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Nov 16 2012, 17:30
Сообщение #19


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(hd44780 @ Nov 16 2012, 20:56) *
Butterfly - самая тяжёлая вещь ...

Глянул - точно. Надо избавиться от complex.c - сразу инлайнами сделать операции над комплексными числами. Потом - сделать unroll для хотя бы внутреннего цикла. Оптимизация -О2 или -О3
Go to the top of the page
 
+Quote Post
hd44780
сообщение Nov 18 2012, 09:09
Сообщение #20


Профессионал
*****

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



inline сделал, слегка видоизменил структуру вызовов кода - пошустрей пошёл, но недостаточно - сильно заметен рендеринг, хотя тот же рендер на осциллограмме летает.

_Pasha, с unroll непонятно - как я могу его сделать, ведь число оборотов циклов заранее неизвестно?
Возможно я не понял, что Вы имели в виду sad.gif . Поясните пожалуйста.


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Nov 18 2012, 10:57
Сообщение #21


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(hd44780 @ Nov 18 2012, 12:09) *
_Pasha, с unroll непонятно - как я могу его сделать, ведь число оборотов циклов заранее неизвестно?
Возможно я не понял, что Вы имели в виду sad.gif . Поясните пожалуйста.

Вы про unroll loops? Это - можно -O2 сделать - оно автоматом включится, там где выгоднее.
Про перестановку бит - я тут более артист разговорного жанра... надо еще посчитать, что лучше. Но может лучше - табличкой, для 256 отсчетов-то?
Go to the top of the page
 
+Quote Post
hd44780
сообщение Nov 18 2012, 11:26
Сообщение #22


Профессионал
*****

Группа: Свой
Сообщений: 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, ещё уровень рисует - просто максимум по каждому блоку данных АЦП. Еще и часиси рисует sm.gif.
Щас выкину всё, оставлю только FFT.


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
hd44780
сообщение Nov 18 2012, 16:14
Сообщение #23


Профессионал
*****

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



_Pasha, спасибо.

Со скоростью вроде управился, работает довольно быстро.
Осталось, в общем-то главное - работает он как-то ненормально, рисует что-то странное..
Видимо, придётся перебирать разные реализации FFT sad.gif


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Nov 18 2012, 20:23
Сообщение #24


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Там очень проблемно с переполнением - я у себя переделал оригинальный проект (с потерей скорости - на 64 бит арифметику) для простоты.
Go to the top of the page
 
+Quote Post
hd44780
сообщение Nov 19 2012, 08:03
Сообщение #25


Профессионал
*****

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



Спасибо.
Вечерком проверю вариант с заменой int на long.
Геннадий, а вы не копались, в каком месте алгоритма эти переполнения лезут? Главный цикл, последуэщий расчёт спектра, ещё что?


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
hd44780
сообщение Nov 19 2012, 17:18
Сообщение #26


Профессионал
*****

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



Проверил. Особых тормозов от long int не заметил.
Полосок заметно больше стало, но всё равно WinAmp круче.

Сейчас другие реализации алгоритма буду пробовать ...


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Nov 19 2012, 17:25
Сообщение #27


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



А какой должна быть разница от замены int на long в случае ARM-а ? :-)


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
hd44780
сообщение Nov 19 2012, 17:39
Сообщение #28


Профессионал
*****

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



Медленнее. То же самое как на 8-битном проце складывать-вычитать 16-битные числа.
Ну и т.д. т.п.


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
adnega
сообщение Nov 19 2012, 17:43
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(hd44780 @ Nov 19 2012, 20:18) *
Полосок заметно больше стало, но всё равно WinAmp круче.

Может, он в децибелах кажет?!
Go to the top of the page
 
+Quote Post
DRUID3
сообщение Nov 19 2012, 18:15
Сообщение #30


山伏
*****

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



Цитата(hd44780 @ Nov 15 2012, 10:05) *
На Си нашёл, вставил в программу - тормозит оно. Конечно, гораздо лучше, чем на AVR, но всё равно не айс.
Надо сделать аудио-анализатор. Сделать-сделал, осциллограммы рисует великолепно, рендер быстрый для дисплея написал, а с FFT проблемы.

Вам нужен RealFFT и аппроксимация формулы для нахождения магнитуды (Р.Лайонс страница 475). По-поводу asm я где-то статью когда-то чью-то бросал сюда на форум. По поводу мегаоптимизаций - откажитесь от битреверса, примените RADIX4 и на асме вручную разверните внутренние циклы (не каскады бабочек). Вряд ли есть куда двигаться дальше в этом вопросе...

кстати раз уж пошли аппроксимации то набор IIR + блочное суммирование под частоту обновления экрана вполне претендует на спасение отца русской демократии. Ну а если уж совсем упростить - полосовые фильтры можно строить на основе фильтров скользящего среднего (можно ведь и в дифференцирующем включении их реализовать). Но результат будет... ммм... ну главное что он таки будет.


--------------------
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...
Go to the top of the page
 
+Quote Post

6 страниц V  < 1 2 3 4 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 09:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01499 секунд с 7
ELECTRONIX ©2004-2016