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

 
 
> Целочисленные алгоритмы ЦОС, надо сформулировать правила
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
Ответов
DASM
сообщение Sep 19 2013, 15:34
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Странно, дока говорит иное.Вы уверены, что это не проблемы компилятора/ассемблера / ключей?
Go to the top of the page
 
+Quote Post
Corner
сообщение Sep 19 2013, 15:36
Сообщение #3


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

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



Цитата(DASM @ Sep 19 2013, 19:34) *
Странно, дока говорит иное.Вы уверены, что это не проблемы компилятора/ассемблера / ключей?


Только умножение 32*32=32 - MULS


Сообщение отредактировал Corner - Sep 19 2013, 15:39
Go to the top of the page
 
+Quote Post
AndrewN
сообщение Sep 19 2013, 17:41
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 336
Регистрация: 7-03-07
Из: Петербург
Пользователь №: 25 961



QUOTE (Corner @ Sep 19 2013, 18:36) *
Только умножение 32*32=32 - MULS
Для пробразования размером 4К Х 16 этого хватит с избытком. N = 212 даёт рост 12 бит максимум.
Go to the top of the page
 
+Quote Post
Corner
сообщение Sep 24 2013, 16:30
Сообщение #5


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

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



Цитата(AndrewN @ Sep 19 2013, 21:41) *
Для пробразования размером 4К Х 16 этого хватит с избытком. N = 212 даёт рост 12 бит максимум.


16+16+12=44, как тут в 32 укладываться?
Go to the top of the page
 
+Quote Post
AndrewN
сообщение Sep 24 2013, 20:57
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 336
Регистрация: 7-03-07
Из: Петербург
Пользователь №: 25 961



QUOTE (Corner @ Sep 24 2013, 19:30) *
16+16+12=44, как тут в 32 укладываться?
А так и не делается, даже в флоатинг пойнт (24 Х 24 -> 48 но младшие биты округляются до 24. Даже Пентиум - и тот ошибается, потому что внутренне он свои 64 Х 64 -> 128, но потом таки округляет обратно до 64).

Так и тут, 16 Х 16 -> 32, и округляются до 16. Умножения роста не дают, сложение может дать рост в 1 бит на одну фазу БПФ. В итоге 16 + 12 -> 28, укладывается в 32.

Но на самом деле и так поступают довольно редко. Обычно фаза БПФ завершается сдвигом вправо на 1, т.е. масштабированием - с округлением, конечно. Соответственно, результат остаётся тем же Q16.15 что и исходные данные.

Наихудший (в смысле потери точности) метод, это когда вместо масштабирования после бабочек, исходные данные "т..о" сдвигают вправо на число фаз БПФ перед преобразованием (N=256 - на 8, 4096 - на 12...), зато скорость вычислений существенно растёт, так что и так делают.

Конечно, любое умножение делается с округлением, и сложение, если результат масштабируется, тоже. Жизнь несовершенна, но если знать в чём, то жить можно :)

Если есть много времени, то можно данные обрабатывать, например, как Q64.32 =~ плавать в "безошибочном" уютном озере :)

Сообщение отредактировал AndrewN - Sep 24 2013, 21:55
Go to the top of the page
 
+Quote Post
Corner
сообщение Sep 29 2013, 09:15
Сообщение #7


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

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



Цитата(AndrewN @ Sep 25 2013, 00:57) *
А так и не делается, даже в флоатинг пойнт (24 Х 24 -> 48 но младшие биты округляются до 24. Даже Пентиум - и тот ошибается, потому что внутренне он свои 64 Х 64 -> 128, но потом таки округляет обратно до 64).

Так и тут, 16 Х 16 -> 32, и округляются до 16. Умножения роста не дают, сложение может дать рост в 1 бит на одну фазу БПФ. В итоге 16 + 12 -> 28, укладывается в 32.

Но на самом деле и так поступают довольно редко. Обычно фаза БПФ завершается сдвигом вправо на 1, т.е. масштабированием - с округлением, конечно. Соответственно, результат остаётся тем же Q16.15 что и исходные данные.

Наихудший (в смысле потери точности) метод, это когда вместо масштабирования после бабочек, исходные данные "т..о" сдвигают вправо на число фаз БПФ перед преобразованием (N=256 - на 8, 4096 - на 12...), зато скорость вычислений существенно растёт, так что и так делают.

Конечно, любое умножение делается с округлением, и сложение, если результат масштабируется, тоже. Жизнь несовершенна, но если знать в чём, то жить можно sm.gif

Если есть много времени, то можно данные обрабатывать, например, как Q64.32 =~ плавать в "безошибочном" уютном озере sm.gif


Забавно, но я округляю только после того как вырезал нужную полосу. Все биты сохраняю. Только целочисленная математика.
Округление это нелинейная обработка сигнала.

Сообщение отредактировал Corner - Sep 29 2013, 09:19
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
- - Ruslan1   еще может интересно будет, насчет целочисленной ре...   Mar 18 2011, 16:48
|- - Zelepuk   Цитата(Ruslan1 @ Mar 18 2011, 19:48) еще ...   Mar 18 2011, 17:36
|- - MSP430F   Цитата(Ruslan1 @ Mar 18 2011, 20:48) еще ...   Aug 22 2013, 14:14
|- - Zelepuk   Цитата(MSP430F @ Aug 22 2013, 18:14) Скаж...   Aug 23 2013, 07:55
|- - MSP430F   Цитата(Zelepuk @ Aug 23 2013, 11:55) коне...   Aug 23 2013, 08:52
|- - Zelepuk   Цитата(MSP430F @ Aug 23 2013, 12:52) Вопр...   Aug 23 2013, 09:02
|- - MSP430F   Цитата(Zelepuk @ Aug 23 2013, 13:02) поче...   Aug 23 2013, 09:16
|- - Maverick   Цитата(MSP430F @ Aug 23 2013, 12:16) по...   Aug 23 2013, 09:35
|- - Corner   Цитата(MSP430F @ Aug 23 2013, 13:16) Вот ...   Aug 23 2013, 18:04
||- - 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:44


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

 


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


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