Типы данных Simulink - PullRequest
       11

Типы данных Simulink

0 голосов
/ 22 марта 2019

Я читаю IMU на плате arduino с блоком s-функции в simulink для двойных или единичных типов данных, хотя мне просто нужна точность в 2 десятичных знака как ("xyz.ab"). Я хочу улучшить производительность с помощьюменяя типы данных и удивляясь, что

есть способ уменьшить точность до 2 десятичных знаков в блоке s-функции или путем добавления / использования любых других блоков / кодов преобразования в simulink помимо использования инструмента с фиксированной точкой?

Sfunctionblock

1 Ответ

0 голосов
/ 19 апреля 2019

Для истинной передачи с фиксированной точкой набор инструментов с фиксированной точкой является наиболее общим ответом, как указано в комментарии Фила.

Однако, чтобы избежать использования набора инструментов, вы также можете разработать свой собственный целочисленный формат с фиксированной точкой идобавьте блок, который принимает входные данные с плавающей запятой и преобразует его в целочисленный формат (и наоборот в выходных данных).

Например, если вы знаете, что диапазон равен 327.68 y = int16 (u * 100.0);

для преобразования входа в S-функцию.На выходе это будет обращение

y = double (u) /100.0;

(код функции Eml / matlab можно избежать с помощью блоков умножения, деления и преобразования.)

Однако помните о доступных битах и ​​о том, что операции масштабирования (*, /) выполняются с плавающей запятой, а не с целым числом.

2 ^ (nrOfBits-1) -1 показывает вамкакой диапазон вы можете представить, включая signeage.Для типов без знака uint8 / 16/32 диапазон составляет 2 ^ (nrOfBits) -1.Затем вы используете масштабирование, чтобы вписать представимый бит в используемый вами диапазон с плавающей запятой.Масштабированный диапазон, разделенный на 2 ^ nrOfBits, скажет вам, какое будет разрешение (насколько велики шаги).

Вам нужно будет соответственно масштабировать переменные на стороне Arduino, когда вы переходите к целому числуинтерфейс этого типа.(Я предполагаю, что у вас есть доступ к этому коду - в противном случае было бы сложно использовать любой другой интерфейс, кроме того, который уже предоставлен)

Обратите внимание, что intXX (doubleVar * scale) всегда будет усекать значенияцелое числоЕсли вам нужно правильное округление, вы должны также включить функцию округления, например:

int16 (round (doubleVar * scale));

Вам не нужно использовать базовую шкалу 10, любыеможно использовать масштабирование и смещения, но проще разбирать числа вручную, если вы держите основание 10 (т. е. 0,1 10,0 100,0 1000,0 и т. д.).

В качестве последнего примечания, если интерфейс кода Arduino имеет плавающую точку(одинарный / двойной) и не может быть изменен на целочисленный тип;Вы не получите никакого ускорения от округления десятичных дробей, так как в любом случае будет передана полная плавающая точка.Даже если вам удастся немного уменьшить данные с помощью целых чисел, я подозреваю, что это не даст большого ускорения, если вы не передадите большие объемы данных.В любом случае код интерфейса будет иметь сравнительно большие накладные расходы.

Удачи в вашем проекте!

...