본문 바로가기
programming language/MATLAB

MATLAB Fixed point toolbox, demo버그?

by __observer__ 2012. 8. 4.
반응형

MATLAB 이 좋은 건 문법의 간편함이나 방대한 라이브러리뿐만이 아니라

 

굉장히 잘 정리되어 있는 매뉴얼에 있다고 생각합니다.

 

각종 example 뿐만 아니라 demo를 보면 각 함수의 사용법에 대해 쉽게 이해 할 수가 있습니다.

 

그런데 Fixed point toolbox 관련 데모를 보다가 약간 이해 안 되는 코드가 있더군요.

 

아래 주소에 Fixed-Point Data Type Override, Min/Max Logging, and Scaling 라는 제목의 데모가 소개 됩니다.

 

http://www.mathworks.co.kr/products/demos/fixedpt/datatype_override/fi_datatype_override_demo.html

 

위 데모에서는 다음과 같은 함수가 있는데요.

 

function T = fi_best_numeric_type_from_logs(x, is_signed, word_length)

%FI_BEST_NUMERIC_TYPE_FROM_LOGS  Best fixed-point numeric type from min/max logs.

%    T = FI_BEST_NUMERIC_TYPE_FROM_LOGS(X, IS_SIGNED, WORD_LENGTH)

%    returns the best-precision fixed-point NUMERICTYPE object T based

%    on the min/max logs of FI object X, and whether the target

%    fixed-point data type IS_SIGNED (true/false) and the target

%    fixed-point WORD_LENGTH.

%

%    See FI_DATATYPE_OVERRIDE_DEMO for an example of use.

 

%    Copyright 2005 The MathWorks, Inc.

%    $Revision: 1.1.8.1 $

 

% Compute the range of the min/max logs.

A = max(abs(double(minlog(x))),abs(double(maxlog(x))));

 

% Compute the integer part such that the range will not overflow.

integer_part = ceil(log2(A))  ;

 

% Compute the fraction length.

fraction_length = word_length - integer_part - double(logical(is_signed));

 

% Construct the fixed-point numeric type object.

T = numerictype(is_signed, word_length, fraction_length);

 

위 함수는 fixed point log report 의 최대 최소 값으로부터 fractional bits 를 계산해 주는 함수이고 빨간색 표시 부분은 정수 비트수를 계산하는 부분 입니다.

 

그런데 빨간색 표시된 코드는 잘못 된 것 같다는 생각이 들더군요.

 

double 값 -1 과 double 값 1 은 fi object 를 이용해서 최적의 fraction 값을 찾아보면 다음과 같습니다.

 

위 예에서 sfi() 함수는 입력 값에 대해 signed 16 비트에 대한 최적의 fractional 비트를 표시해 줍니다.

 

-1 일 때는 FractionLength : 15 이고, 1 일 때는 FractionLength : 14 인 것을 알 수 있죠.

 

Wordlength : 16, FractionLength : 15 이면 double 값 1 은 overflow 가 납니다.

 

A = max(abs(double(minlog(x))),abs(double(maxlog(x)))); 부분에서 minlog(x) = -1 이고 maxlog(x) = 1 이라면 …..… A = 1 이 될 테고~~

 

integer_part = ceil(log2(A)) = 0 이 되겠죠. 정수 비트가 0 개면 double 값 1 은 표현 할 수가 없는 거죠.

 

따라서 위 fi_best_numeric_type_from_logs() 함수는 그냥 안 쓰는 게 좋고 굳이 써야 한다면, 다음과 같이 고칠 수 있을 것 같습니다. 

 

function T = fi_best_numeric_type_from_logs(x, is_signed, word_length)

 

A = [double(minlog(x)) double(maxlog(x))];

TempFi=fi(A,double(logical(is_signed)),word_length);

T=TempFi.numerictype;



반응형

댓글