Перейти к содержанию
    

FFT на асм для ARM7TDMI (AT91SAM7xx)

Может, он в децибелах кажет?!

 

хрен его знает... Вообще вряд ли.

Я где-то год назад родственный анализатор на C#, .NET 2.0 (VS.NET 2005) написал.

Алгоритм откуда-то выдрал готовый. Как вы понимаете, всё в лоб, плавающая точка в любых количествах и всё прочее :) . Логарифмов вроде нету. Результат визуально близок к винампу.

Могу выложить, если кого интересует.

 

Кстати, как децибелы по таблице просчитать, я уже придумал, осталось реализовать и проверить :) .

 

DRUID3, я RealFFT для 80x86 только нашёл - неактуально :rolleyes: .

 

Асма я этого не знаю. Учить потихоньку начал, но когда это будет ....

Нашёл реализацию FFT на нём - вложение. Для какого проца - не знаю, это с сидюка к какой-то буржуйской книжке. К какой - не знаю. На форумах англоязычных нашёл.

Сам определить я пока не способен. Если кто ориентируется - гляньте плиз.

Меня смущают имена функций типа fft_16_arm9m ....

 

Сейчас курю это - http://code.google.com/p/falab/

Ещё лежит kissFFt, руки пока не дошли ....

 

Спасибо.

ch08_dsp.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Ну и т.д. т.п.

Задам вопрос по-другому.

Какой разрядности у Вас int и long ?

 

И компилятор какой?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Компилятор - IAR

int - 32 (вроде бы). Для 64 написал long long.

 

Вообще у IAR help какой-то тупой, даже размер типов данных я там не нашёл :( .

Хотя в том же CvAVR и прочих это с пол-пинка находится .....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообще у IAR help какой-то тупой, даже размер типов данных я там не нашёл :( .

Хотя в том же CvAVR и прочих это с пол-пинка находится .....

Смотрите EWARM_DevelopmentGuide.ENU.pdf

Part 2. Reference information

Data representation

Basic data types

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Смотрите EWARM_DevelopmentGuide.ENU.pdf

 

спасибо. Так и есть,long long - 64 бита.

Вечером ещё разок проверю на железе ..

Рассобачился я на этих __int32 и __int64 в VS.NET :) . Зато как удобно ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рассобачился я на этих __int32 и __int64 в VS.NET :) . Зато как удобно ...

Что, и stdint.h нет?

 

 

Хех, а я уж решил, что свершилось чудо, и поведение int и long (ещё вчера упоминался long int, не long long) на 32-битниках как-то различается :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

long long поставил.

Объём кода подскочил где-то с 33кил до 38 кил :)

Полосок больше стало, но все равно редкие какие-то ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

DRUID3, я RealFFT для 80x86 только нашёл - неактуально :rolleyes: .

aT_RealFFTrFFT_GCC_TEST.zip

aT_ditNbrRadix2FFT_int_c_GCC_TEST.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

DRUID3, спасибо, буду смотреть. Попытаюсь к иару прикрутить.

 

Кста. Вот тут - http://electronix.ru/forum/index.php?showt...ost&p=57271 вчера поздно вечером что-то нарыл, добавил тупо в иаровский проект - ругается, синтаксис на такой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

DRUID3, спасибо, буду смотреть. Попытаюсь к иару прикрутить.

...там это... для "реал" они во флоат, но никто не мешает принять синус равным 32768 на время военного конфликта в том числе и в тригонометрических формулах. Но вообще Вам сподручнее будет не само realFFT брать, а функцию 2-а реал за одно комплексное двойной длинны(есть там и такая). Кстати, а сколько у Вас точек? Для правильного масштабирования бабочек я там еще свое intFFT приложил. fixed 0.15 не применял, и так хорошо. С asm не спешите заморачиваться. Вы как вычисляете логарифм магнитуды(или просто магнитуду)бинов в частотной области? Там эти вычисления отъедят намного больше MIPS чем FFT на C.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Точек сейчас - 512.

Про логарифм магнетуды, извините не понял. Наверное терию вопроса плохо знаю :( . Поясните пожалуйста.

 

Ваш код (целочисленный) сейчас читаю.

 

Как я понял, у Вас там 2 функции - int fn_aT_ditNbrRadix2FFT_int и fn_aT_ditNbrRadix2ReFFT_int - где какой (имею в виду "за одно комплексное двойной длины")?

 

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Про логарифм магнетуды, извините не понял. Наверное терию вопроса плохо знаю :( . Поясните пожалуйста.

Ну вот Вы график потом отрисовываете. Это график чего? У Вас после 512 точек действительной последовательности будет 512 точоек комплексного спектра. Но рисуете то Вы физический а не комплексный спектр. Т.е. длину вектора образованного каждым комплексным бином - корень из квадрата реал плюс квадрат имеджинари (sqrt(I*I+Q*Q)). Ну и такой спектр еще очень любят потом логарифмировать для качественной визуальной оценки. Корень квадратный и логарифмирование запросто сожрут все эти попытки оптимизации FFT. Тем более не понятно где Вы их взяли для int. Сами писали?

 

Точек сейчас - 512.

 

Ваш код (целочисленный) сейчас читаю.

 

Как я понял, у Вас там 2 функции - int fn_aT_ditNbrRadix2FFT_int и fn_aT_ditNbrRadix2ReFFT_int - где какой (имею в виду "за одно комплексное двойной длины")?

 

Спасибо.

целочисленный - это просто 2-а комплексных БПФ. Прямое и обратное. Отличаются знаком комплексной экспоненты и внесением множителя 1/n для обратного БПФ в одиночный битовый сдвиг при каждом проходе каскада.

 

А нужно еще завернуть такое БПФ для получения БПФ вещественной последовательности. Это другой архив. Там ряд функций. БПФ прямое и обратное для действительной последовательности с отбрасыванием зеркально-сопряженной симметрии и без. Но Вам нужна функция fn_a_2RealFFT() делающая 2 БПФ действительного ряда чисел за раз внутри которой комплексное БПФ такой же длинны. Переделайте эту функцию для int(тривиально) и внутрь вставте либо мою(из того другого архива) целочисленную комплексную БПФ либо чью-то другую.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

такой спектр еще очень любят потом логарифмировать для качественной визуальной оценки. Корень квадратный и логарифмирование запросто сожрут все эти попытки оптимизации FFT. Тем более не понятно где Вы их взяли для int. Сами писали?

Понял, о чём Вы :rolleyes: .

Спектр не логарифмический, логарифмов вообще нигде нету ... И без корней:

#define FMUL(a,b,q) (((long)(a)*(B))>>(q))

enum { FFT_Q=11 }; //exponent

#define FFT_POWER 9

#define FFT_N (1 << FFT_POWER) // 512 - размер выборки

 

...........

for ( i = 0; i < FFT_N; i ++ )

{

// Scaling by FFT_N/2=128

fix re = FFTResult.Re >> (FFT_POWER / 2);

fix im = FFTResult.Im >> (FFT_POWER / 2);

fix Re2, Im2;

 

// Squareing

Re2 = FMUL ( re, re, FFT_Q );

Im2 = FMUL ( im, im, FFT_Q );

Spectrum = Re2 + Im2;

} // for

 

Писал не сам, выдрал, по сути, отсюда - http://electronix.ru/forum/index.php?showt...t&p=1111653 и там выше по теме ..

Насколько это корректно, не знаю :biggrin: . Передирал, как зелёный студент :biggrin: ....

 

целочисленный - это просто 2-а комплексных БПФ. Прямое и обратное. Отличаются знаком комплексной экспоненты и внесением множителя 1/n для обратного БПФ в одиночный битовый сдвиг при каждом проходе каскада.

 

А нужно еще завернуть такое БПФ для получения БПФ вещественной последовательности. Это другой архив. Там ряд функций. БПФ прямое и обратное для действительной последовательности с отбрасыванием зеркально-сопряженной симметрии и без. Но Вам нужна функция fn_a_2RealFFT() делающая 2 БПФ действительного ряда чисел за раз внутри которой комплексное БПФ такой же длинны. Переделайте эту функцию для int(тривиально) и внутрь вставте либо мою(из того другого архива) целочисленную комплексную БПФ либо чью-то другую.

Щас буду смотреть ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Понял, о чём Вы :rolleyes: .

Спектр не логарифмический, логарифмов вообще нигде нету ... И без корней:

:biggrin: Понял. Все уже упрощено дальше некуда. разве что маску наложить. :biggrin:

 

---> 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.

 

Эти цифры вообще нормальные? Может там собака в другом месте зарыта ..

А какая у Вас тактовая? В одном из приведенных Вами же документов - 40 MHz ~ 3ms.

 

Тут у меня такая мысль. Вот этот тип данных complex. Это же структура с двумя полями, так? Т.е. перед каждым обращением к полю нужно вначале перейти на указатель на структуру. А это MIPSы. Инлайнь там что или нет. Попробуйте с обыкновенными масивами I и Q.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А какая у Вас тактовая? В одном из приведенных Вами же документов - 40 MHz ~ 3ms.

48 MHz. Для USB. Хоть ещё ни разу его не использовал :) .

 

Тут у меня такая мысль. Вот этот тип данных complex. Это же структура с двумя полями, так? Т.е. перед каждым обращением к полю нужно вначале перейти на указатель на структуру. А это MIPSы. Инлайнь там что или нет. Попробуйте с обыкновенными масивами I и Q.

попробую. Спасибо.

Я сейчас Ваш смотрю.

Мой вариант по скорости уже приемлемо крутитися, но результаты какие-то странные показывает - от силы 10 полосок из 128, которые я отрисовываю на дисплее. Могу фотку дисплея кинуть вечером. Может "симптоматика" что-то подскажет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...