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

 
 
> Целочисленные алгоритмы ЦОС, надо сформулировать правила
Zelepuk
сообщение Mar 6 2011, 07:22
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Существует рабочий алгоритм(несколько фильтров и БПФ). Код работает на плавучке на обычном десктопе.
Стоит задача портировать алгоритм на процессор с фиксированой точкой.
Отсчёты, над которыми производятся преобразования, поступают в формате 1.15.
Понимаю что тупое преобразование float в int ни к чему хорошему не приведёт.
Тогда стоит вопрос: какие требования к оперрациям нужно предъявить?

Коэффиценты фильтров и БПФ должны быть тоже в 1.15?
Как производить умножение, деление, суммирование и вычитание, чтобы избегать переполнений?

(лучше если примеры коротенькие на С будут)

Используется 32-битный процессор на ARM9E ядре

Заранее спасибо.



Сообщение отредактировал Zelepuk - Mar 6 2011, 07:48
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Ruslan1
сообщение Mar 18 2011, 16:48
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



еще может интересно будет, насчет целочисленной реализации БПФ посмотрите вот это

Вроде нареканий не было и чистый си, хоть куда лепится sm.gif И очень экономно подходит к используемой памяти, как RAM так и ROM.
Используются 16-битные знаковые числа. Очень удобно напрямую данные с АЦП подсовывать, ну или после нормирования, чтобы максимально использовать все биты.
Go to the top of the page
 
+Quote Post
MSP430F
сообщение Aug 22 2013, 14:14
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 20-05-13
Пользователь №: 76 911



Цитата(Ruslan1 @ Mar 18 2011, 20:48) *
еще может интересно будет, насчет целочисленной реализации БПФ посмотрите вот это

Вроде нареканий не было и чистый си, хоть куда лепится sm.gif И очень экономно подходит к используемой памяти, как RAM так и ROM.
Используются 16-битные знаковые числа. Очень удобно напрямую данные с АЦП подсовывать, ну или после нормирования, чтобы максимально использовать все биты.


Скажите, а можно этот код переделать на 4096 точек (там сейчас 1024) ? Ответьте, пожалуйста. Очень надо.
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Aug 23 2013, 07:55
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Цитата(MSP430F @ Aug 22 2013, 18:14) *
Скажите, а можно этот код переделать на 4096 точек (там сейчас 1024) ? Ответьте, пожалуйста. Очень надо.

конечно можно! За отдельную плату готов предоставить готовую реализацию на 4096 точек cool.gif

P.S. Протестировано на MSP430F47197 в проекте счётчика электроэнергии.

Сообщение отредактировал Zelepuk - Aug 23 2013, 07:57
Go to the top of the page
 
+Quote Post
MSP430F
сообщение Aug 23 2013, 08:52
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 20-05-13
Пользователь №: 76 911



Цитата(Zelepuk @ Aug 23 2013, 11:55) *
конечно можно! За отдельную плату готов предоставить готовую реализацию на 4096 точек cool.gif

P.S. Протестировано на MSP430F47197 в проекте счётчика электроэнергии.


Вопрос такой. Какова точность целочисленного 32-разрядного БПФ (вся арифметика не должна выходить за пределы 32 разрядов) ?
Если у меня данные честные 16-битные и я хочу получить на выходе спектр с диапазоном тоже в 90 дБ, то целочисленных вычислений в 32 разрядов для этого не достаточно, не так ли ?
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Aug 23 2013, 09:02
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Цитата(MSP430F @ Aug 23 2013, 12:52) *
Вопрос такой. Какова точность целочисленного 32-разрядного БПФ (вся арифметика не должна выходить за пределы 32 разрядов) ?
Если у меня данные честные 16-битные и я хочу получить на выходе спектр с диапазоном тоже в 90 дБ, то целочисленных вычислений в 32 разрядов для этого не достаточно, не так ли ?

почему недостатачно? как вы считаете? у меня всё было достатачно точно, единственное что: нужно данные масштабировать в нужных местах.

Сообщение отредактировал Zelepuk - Aug 23 2013, 09:03
Go to the top of the page
 
+Quote Post
MSP430F
сообщение Aug 23 2013, 09:16
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 20-05-13
Пользователь №: 76 911



Цитата(Zelepuk @ Aug 23 2013, 13:02) *
почему недостатачно? как вы считаете? у меня всё было достатачно точно, единственное что: нужно данные масштабировать в нужных местах.


Вот над этим я сейчас и бьюсь. Вот здесь человек пишет:
" Перед автором стояла задача написать преобразование Фурье на 2048 точек при разрядности исходных данных 16 бит. Из-за отсутствия арифметического сопроцессора пришлось делать целочисленное преобразование, что создало некоторые трудности. При разрядности исходных данных 16 бит разрядность коэффициентов должна быть не менее 16, чтобы не происходило потери точности. Их произведение содержит 32 разряда. 2048 точек дают еще 11 дополнительных разрядов, а это значит, что в 32-разрядное процессорное слово промежуточные данные не помещаются. Вычисление каждой “бабочки” ведется с точностью 64 разряда, а результат округляется до 32 разрядов. "

И как же можно тогда все посчитать в 32 разрядах без потери точности ?
Go to the top of the page
 
+Quote Post
Corner
сообщение Aug 23 2013, 18:04
Сообщение #8


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

Группа: Участник
Сообщений: 1 072
Регистрация: 11-12-12
Пользователь №: 74 815



Цитата(MSP430F @ Aug 23 2013, 13:16) *
Вот над этим я сейчас и бьюсь. Вот здесь человек пишет:
" Перед автором стояла задача написать преобразование Фурье на 2048 точек при разрядности исходных данных 16 бит. Из-за отсутствия арифметического сопроцессора пришлось делать целочисленное преобразование, что создало некоторые трудности. При разрядности исходных данных 16 бит разрядность коэффициентов должна быть не менее 16, чтобы не происходило потери точности. Их произведение содержит 32 разряда. 2048 точек дают еще 11 дополнительных разрядов, а это значит, что в 32-разрядное процессорное слово промежуточные данные не помещаются. Вычисление каждой “бабочки” ведется с точностью 64 разряда, а результат округляется до 32 разрядов. "

И как же можно тогда все посчитать в 32 разрядах без потери точности ?


С учетом Cortex-M3 можно использовать 32 битное умножение со знаком и 64 бит накопление - SMLAL инструкция. Для signed long long компилер сам подставит.
Вот если нет 64 бит аккумулятора, то можно использовать отдельно знаковое умножение с арифметическим сдвигом на 32 (взятие старшей части от умножения), тогда коэффициенты придется обрезать по модулю (считать за 1), чтобы они не превышали ((64 - Х)/2) бит, где Х - log N по основанию 2, а N - число точек (максимум 16384 точки). Это лишь вопрос к правильной табличке синусов. Уровень шума не вырастет больше чем на 1 дБ. При этом использовать максимальное отрицательное число для выбранного размера нельзя. Например, для 24 бит синус должен лежать в диапазоне от -8388607 до +8388607.
Обрезать результат сильнее нельзя, так как если, к примеру, использовать 16 бит знаковые данные и 16 бит знаковый синус, то динамический диапазон уже ни при каком числе точек не превысит 87 дБ (3 дБ "съедает" формат синусов), даже если результат накапливать в 64 битном аккумуляторе без потерь.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Zelepuk   Целочисленные алгоритмы ЦОС   Mar 6 2011, 07:22
- - _Anatoliy   Цитата(Zelepuk @ Mar 6 2011, 09:22) Это...   Mar 6 2011, 08:35
- - Zelepuk   Познавательное видео. Но хотелось бы писать всё с...   Mar 7 2011, 06:30
|- - alexPec   Цитата(Zelepuk @ Mar 7 2011, 09:30) Позна...   Mar 7 2011, 10:07
||- - Zelepuk   Цитата(alexPec @ Mar 7 2011, 13:07) Переп...   Mar 7 2011, 13:38
||- - alexPec   Цитата(Zelepuk @ Mar 7 2011, 16:38) когда...   Mar 7 2011, 14:47
|- - diwil   Цитата(Zelepuk @ Mar 7 2011, 09:30) Иными...   Mar 7 2011, 11:58
|- - Zelepuk   Цитата(diwil @ Mar 7 2011, 14:58) 1. floa...   Mar 7 2011, 21:12
|- - diwil   Цитата(Zelepuk @ Mar 8 2011, 00:12) Никак...   Mar 9 2011, 08:05
- - PetrovichKR   ЦитатаХлчется вкуритсь "трюки" на С чтоб...   Mar 8 2011, 04:31
|- - Zelepuk   Цитата(Ruslan1 @ Mar 18 2011, 19:48) еще ...   Mar 18 2011, 17:36
|- - Maverick   Цитата(MSP430F @ Aug 23 2013, 12:16) по...   Aug 23 2013, 09:35
||- - MSP430F   Цитата(Corner @ Aug 23 2013, 22:04) С уче...   Aug 26 2013, 12:44
||- - Corner   Цитата(MSP430F @ Aug 26 2013, 16:44) Как ...   Aug 29 2013, 15:02
|- - alex_os   Цитата(MSP430F @ Aug 23 2013, 13:16) Вот ...   Sep 18 2013, 19:26
|- - Corner   Цитата(alex_os @ Sep 18 2013, 23:26) можн...   Sep 19 2013, 15:02
|- - DASM   Цитата(alex_os @ Sep 18 2013, 23:26) Ужас...   Sep 19 2013, 15:21
|- - Corner   Цитата(DASM @ Sep 19 2013, 19:21) UMULL 3...   Sep 19 2013, 15:28
- - Corner   На ПЛИС БПФ 8192 точки 18 бит знаковое сносно дает...   Aug 22 2013, 14:35
- - Zelepuk   Вообще проще взять и проверить. Код есть. За полча...   Aug 23 2013, 09:17
- - DASM   Странно, дока говорит иное.Вы уверены, что это не ...   Sep 19 2013, 15:34
|- - Corner   Цитата(DASM @ Sep 19 2013, 19:34) Странно...   Sep 19 2013, 15:36
|- - AndrewN   QUOTE (Corner @ Sep 19 2013, 18:36) Тольк...   Sep 19 2013, 17:41
|- - Corner   Цитата(AndrewN @ Sep 19 2013, 21:41) Для ...   Sep 24 2013, 16:30
|- - AndrewN   QUOTE (Corner @ Sep 24 2013, 19:30) 16+16...   Sep 24 2013, 20:57
|- - Corner   Цитата(AndrewN @ Sep 25 2013, 00:57) А та...   Sep 29 2013, 09:15
- - DASM   Посмотрю завтра, с телефона неудобно. И что, в экс...   Sep 19 2013, 15:44


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


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


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