|
Целочисленные алгоритмы ЦОС, надо сформулировать правила |
|
|
|
 |
Ответов
|
Mar 7 2011, 10:07
|
Профессионал
    
Группа: Свой
Сообщений: 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
|
|
|
|
|
Mar 7 2011, 13:38
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|