Перейти к содержанию
    

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

навскидку: положительное значение 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте. Надеюсь, что не помешаю если влезу. Разбираюсь с контроллером 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. Что делать то?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В нём написано, что в качестве аргумента функция принимает значение угла выраженное в радианах. Т.е. допустим я захочу найти синус 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)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что за псевдоплавающая точка, подскажите, плиз? Это блочная которая?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что за псевдоплавающая точка, подскажите, плиз? Это блочная которая?

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

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

 

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

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

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

))))))))

но я бы её назвал согласно этой аналогии всё же именно псевдофиксированная )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...