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

 
 
> Целочисленные алгоритмы ЦОС, надо сформулировать правила
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
Ответов
Zelepuk
сообщение Mar 7 2011, 06:30
Сообщение #2


Знающий
****

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



Познавательное видео.

Но хотелось бы писать всё самуму руками. А тут получается вставил блок, нажал кнопочку и всё....
Причём код получается не очень читаемый...

Интересуют принципы.

Иными словами нужно перевести все float в программе в int (в крайнем случае long).
Какие могут быть общие рекомендации для таких задач? Как обезопасить код от переполнений при переходе на "фиксированую точку"?

Данные, над которыми осущесвляются операции поступают в дополнительном коде формата 1.15. Значит ли это что коэффиценты всех преобразований должны быть в таком же формате?

Микроконтроллер 32 битный.
Go to the top of the page
 
+Quote Post
alexPec
сообщение Mar 7 2011, 10:07
Сообщение #3


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

Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968



Цитата(Zelepuk @ Mar 7 2011, 09:30) *
Познавательное видео.

Но хотелось бы писать всё самуму руками. А тут получается вставил блок, нажал кнопочку и всё....
Причём код получается не очень читаемый...

Интересуют принципы.

Иными словами нужно перевести все float в программе в int (в крайнем случае long).
Какие могут быть общие рекомендации для таких задач? Как обезопасить код от переполнений при переходе на "фиксированую точку"?

Данные, над которыми осущесвляются операции поступают в дополнительном коде формата 1.15. Значит ли это что коэффиценты всех преобразований должны быть в таком же формате?

Микроконтроллер 32 битный.


Переполнение по-моему при такой задаче только аналитически оценить. Ну или попроще: сделать модель в матлабе, подать туда реальные даннные, посмотреть значения, умножить их на 4 (для запаса) и исходя из этого выбрать разрядность.
То что отсчеты в 1,15 раз больше по-моему не должно влиять на коэффициенты. Просто выход будет увеличен в 1,15 раз. У фильтра например коэффициенты на форму АЧХ/ФЧХ влияют.
А вот с дробной частью сложнее - надо Вам оценить какая точность фурье (фильтров) требуется. Например если требуется с точностью до 1 вычислять - забыть про дробную часть, просто перевести на фиксированную точку и все. А например если нужна точность 0,01 - то это одна сотая, ближайшее меньшее значение получается 1/2^7 = 1/128 = 0,0078125. Это означает, что под дробну часть нужно отвести 7 бит. Но это на выходе, а внутреняя арифметика будет зависеть от реализации, и надо исходить из выходной точности.
Да, и дробные коэффициенты также реализуются - оцениваете требуемую точность коэффициента, умножаете число на коэффициент и на выходе результат сдвагаете на кол-во знаков дробной части. Например нужно умножить число а= 239 на коэффициент 0,71 с точностью не хуже 0,01 (имеется ввиду в данном случае точность коэффициента а не результата). Получаем что при 7 битах дробной части (точность 0,007) 0,71 в таком формате будет 0,71/0,0078125 =90,7 = 91. Умножаем а*90 = 239*90=21749 результат сдвигаем на 7 бит (делим на 128) получаем 21749/128=169,91... Дробную часть отбрасываем получаем 169. Проверяем: 239*0,71 = 169,69.
Оценить влияние квантования коэффициентов фильтров можно в матлабе, специально для этого там есть fdatool. Там можно указать сколько бить под дробную часть, сколько под целую и много чего еще.

Сообщение отредактировал alexPec - Mar 7 2011, 10:24
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Mar 7 2011, 13:38
Сообщение #4


Знающий
****

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



Цитата(alexPec @ Mar 7 2011, 13:07) *
Переполнение по-моему при такой задаче только аналитически оценить. Ну или попроще: сделать модель в матлабе, подать туда реальные даннные, посмотреть значения, умножить их на 4 (для запаса) и исходя из этого выбрать разрядность.
То что отсчеты в 1,15 раз больше по-моему не должно влиять на коэффициенты. Просто выход будет увеличен в 1,15 раз. У фильтра например коэффициенты на форму АЧХ/ФЧХ влияют.
А вот с дробной частью сложнее - надо Вам оценить какая точность фурье (фильтров) требуется. Например если требуется с точностью до 1 вычислять - забыть про дробную часть, просто перевести на фиксированную точку и все. А например если нужна точность 0,01 - то это одна сотая, ближайшее меньшее значение получается 1/2^7 = 1/128 = 0,0078125. Это означает, что под дробну часть нужно отвести 7 бит. Но это на выходе, а внутреняя арифметика будет зависеть от реализации, и надо исходить из выходной точности.
Да, и дробные коэффициенты также реализуются - оцениваете требуемую точность коэффициента, умножаете число на коэффициент и на выходе результат сдвагаете на кол-во знаков дробной части. Например нужно умножить число а= 239 на коэффициент 0,71 с точностью не хуже 0,01 (имеется ввиду в данном случае точность коэффициента а не результата). Получаем что при 7 битах дробной части (точность 0,007) 0,71 в таком формате будет 0,71/0,0078125 =90,7 = 91. Умножаем а*90 = 239*90=21749 результат сдвигаем на 7 бит (делим на 128) получаем 21749/128=169,91... Дробную часть отбрасываем получаем 169. Проверяем: 239*0,71 = 169,69.
Оценить влияние квантования коэффициентов фильтров можно в матлабе, специально для этого там есть fdatool. Там можно указать сколько бить под дробную часть, сколько под целую и много чего еще.


какие ещё 1.15 раза? 1-количество бит целой части, 15 - количество бит дробной части...
это так, для справки.
______________________________________________________________________________

когда мы перемножаем например два числа в формате 1.15, то получаем число в формате 2.30. Что с ним надо сделать чтобы в дальнейшем переполниий избежать.
Иначе гвооря интересуют "трюки целочисленных вычислений на С"

На ассемблере у меня реализация БПФ есть для моего проца.
Хлчется вкуритсь "трюки" на С чтобы всё что угодно писать... (КИХ, БИХ фильтрацию...)

Сообщение отредактировал Zelepuk - Mar 7 2011, 13:41
Go to the top of the page
 
+Quote Post
alexPec
сообщение Mar 7 2011, 14:47
Сообщение #5


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

Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968



Цитата(Zelepuk @ Mar 7 2011, 16:38) *
когда мы перемножаем например два числа в формате 1.15, то получаем число в формате 2.30. Что с ним надо сделать чтобы в дальнейшем переполниий избежать.

А что с обычными числами делают, то и этими. Если вы уверены, что после умножения не будет переполнения - отбрасываете старший бит, если не уверены - наращивать разрядность; если вам не нужна точность 30 бит после умножения - отбрасываете младшие 15 (или округляете). Т.е если не будет переполнения и нужна точность 15 бит - отбрасываете старший и 15 младших бит и получаете результат в таком же формате.
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
|- - 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: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 Текстовая версия Сейчас: 1st August 2025 - 21:16
Рейтинг@Mail.ru


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