Jump to content

    
Sign in to follow this  
Artunique

"Все точки над фиксированной.точкой"

Recommended Posts

 

Всем привет. Решил добиться полного понимания Fixed Point арифметики. Для меня, да и для многих это очень актуально, я уверен. Больше всего, с этой арифметикой намудрено в матлабе. Например отрицательное значение fractional bitwidth и тп. И все говорят, что значение fractional очень важно указать верным, но никто не говорит как. Для конкретики и понимания возьмем обычный fir фильтр в матлабе. В его параметрах можно указать разрядность на входе + fractional часть и разрядность на выходе + fractional часть. То же самое можно указать для коэффициентов фильтра. Я точно знаю, сколько бит у меня на входе, знаю разрядность коэффициентов, знаю разрядность на выходе. Но ОТКУДА брать значение этой fractional части? И почему на выходе CIC фильтра матлаб мне выдает отрицательное значение этой fractional части? :help:

Share this post


Link to post
Share on other sites

навскидку: положительное значение fractional bitwidth говорит о том, что десятичный разделитель (точка, отделяющая целую и дробную часть) находится левее на столько-то битов по сравнению с положением этой точки ровно после самого младшего бита разрядной сетки данной переменной. А отрицательное значение - соответственно, что десятичный разделитель находится правее. Это однозначно означает, что разрядная сетка вашей переменной содержит только целую часть, и то не всю, а начиная с какого-то разряда (указанного в отрицательном значении fractional).

Вот пример:

разряды вообще  : 9 8 7 6 5 4 3 2 1 0.-1 -2 -3
разрядная сетка :     4 3 2 1 0
конкретной
переменной

В данном примере у конкретной переменной bitwidth = 5, а fractional bitwidth = -4. Это говорит о том, что нулевой разряд вашей переменной он на самом деле не нулевой, а 4.

Share this post


Link to post
Share on other sites

Здравствуйте. Надеюсь, что не помешаю если влезу. Разбираюсь с контроллером ATSAM4SD32C на базе ядра cortex m4. Ядро имеет набор так называемых DSP инструкций, мощь которых (как заявляет ARM) реализована набором ф-ций находящихся в библиотеке CMSIS-DSP. Так среди них есть несколько ф-ций для генерации синуса (для работы с фиксированной и плавающей запятой). Т.к. мой контроллер не имеет на борту FPU, то я выбрал ф-цию работающую с фиксированной запятой. Вот её описание -> http://www.keil.com/pack/doc/CMSIS/DSP/html/group__sin.html. В нём написано, что в качестве аргумента функция принимает значение угла выраженное в радианах. Т.е. допустим я захочу найти синус 180 градусов (да, знаю что он равен 0) т.е. в радианах это запишется так x = sin(3.14159265358979). Но как я понял, тип q31_t может принимать значения [-1; 1 - 2^-(n-1)] или примерно [-1;1]. Если же я засуну в эту ф-цию константу PI, то процессор начнёт обрабатывать плавающую запятую. т.к. #define PI 3.14159265358979f. Что делать то?

 

Share this post


Link to post
Share on other sites
В нём написано, что в качестве аргумента функция принимает значение угла выраженное в радианах. Т.е. допустим я захочу найти синус 180 градусов (да, знаю что он равен 0) т.е. в радианах это запишется так x = sin(3.14159265358979). Но как я понял, тип q31_t может принимать значения [-1; 1 - 2^-(n-1)] или примерно [-1;1]. Если же я засуну в эту ф-цию константу PI, то процессор начнёт обрабатывать плавающую запятую. т.к. #define PI 3.14159265358979f. Что делать то?

Смею предположить, что для функции arm_sin_q31 0 рад = 0, pi рад = 2^30, 2*pi = 2^31. Входной диапазон соответственно [0:2*pi) или [0 : 2^31-1)

Share this post


Link to post
Share on other sites
serjj, спасибо за помощь. Чесно говоря не знаю правы Вы или нет (у меня под конец дня чё то уже мозги в насыщение зашли, так что инфу не воспринимаю), но мне так же ещё и вот туточки помогли (если вдруг интересно) http://radiokot.ru/forum/viewtopic.php?f=5...469125#p2469125. Завтра попробую всё проанализировать.

Share this post


Link to post
Share on other sites

т.к. #define PI 3.14159265358979f. Что делать то?

 

При работе с псевдоплавающей точкой из моего опыта вычисляется sin(1) то 90 градусов и однозначно пересчитывается в радианы. Думаю, что сетка [-8;8].

Share this post


Link to post
Share on other sites
А что за псевдоплавающая точка, подскажите, плиз? Это блочная которая?

Псевдоплавающая точка термин используемый мной по аналогии с анекдотом.

Продавец каждый день решает сколько сегодня весит килограмм.

 

Программист для каждой переменной int решает вопрос масштаба : чему равно 0х7fff, или 0x7fffffff и т.п.

Когда пользуетесь чужой библиотекой, масштаб ищется в описании или проверяется практикой.

 

 

 

Share this post


Link to post
Share on other sites
т.к. #define PI 3.14159265358979f. Что делать то?

 

При работе с псевдоплавающей точкой из моего опыта вычисляется sin(1) то 90 градусов и однозначно пересчитывается в радианы. Думаю, что сетка [-8;8].

Поправлюсь, не sin(1), а арккосинус0).

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this