2015-12-05 5 views
-2

Микроконтроллер, который я должен реализовать, цифровой фильтр не поддерживает операции с плавающей запятой.Как мы можем кодировать в представлении с фиксированной точкой для входа с плавающей запятой?

Учитывая аналоговый входной сигнал (который может принимать значения от -1,65 В до 1,65 В), отобранные с заданной скоростью 100 Гц, я могу выполнять операции с фиксированной точкой. Поэтому я предполагаю, что мне сначала нужно преобразовать свой вход в фиксированную точку. Также указано, что выход АЦП квантован в десятичные значения без знака.

Моя проблема есть.

Я знаю, что существует формат Qm.n для фиксированных точек, который содержит бит знака. И ни одна из ссылок на сайте не включают в себя преобразование из подписанного ввода с плавающей точкой беззнаковой фиксированной точкой

И я нашел этот код:

int fixedValue = (int)Math.Round(floatValue*Scale); 

double floatValue = (double)fixedValue/Scale; 

Вопросов: 1. Как я могу выбрать свой коэффициент масштабирования? 2. Зависит ли он от диапазона моих входных значений и количества бит, используемых для представления с фиксированной точкой? 3. Формат Qm.n использует бит бит. Могут ли представления фиксированной точки быть неподписанными?

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

Заранее спасибо.

+0

Это неясно - где точка с плавающей запятой здесь? –

+0

Я отредактирую свой вопрос sir – chaine09

+0

@OliverCharlesworth, пожалуйста, ознакомьтесь с изменениями в моем вопросе выше – chaine09

ответ

2

Используйте простую двухточечную интерполяцию.

#define Value_MAX 1.65 
#define Value_MIN (-1.65) 
#define value10bit_MAX 1023 
#define value10bit_MIN 0 
#define slope ((value10bit_MAX - value10bit_MIN)/(Value_MAX - Value_MIN)) 

int value10bit = (int)Math.Round((floatValue - Value_MIN)*slope + value10bit_MIN); 

OP сообщает "микроконтроллер, которые поддерживают только операции с фиксированной точкой." но, похоже, использует (или хочет использовать) int fixedValue = (int)Math.Round(floatValue*Scale);. Так что, возможно, это работает для OP

+1

@chux Спасибо за ответ! Значит, мне больше не нужен коэффициент масштабирования в моем коде? – chaine09

+0

Определение «Масштаб» неясно. Фактически, я ожидал бы, что встроенный процессор будет _provide_ 10-битным значением от своего аналого-цифрового преобразователя и, таким образом, отрицает необходимость для всего этого преобразования. IAC, двухточечное картографирование может работать в любом направлении - базовая школьная математика. – chux

+0

Технически, 'Value_MIN' также должен быть заключен в скобки, поскольку' -' является оператором. Это маловероятно, чтобы вызвать проблему, но это хорошая привычка не делать исключений в этом вопросе, макросы достаточно сложны ;-) – chqrlie