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;
'programming language > MATLAB' 카테고리의 다른 글
MATLAB 메모리와 속도 (0) | 2012.10.21 |
---|---|
MATLAB run configuration 을 통한 실행 (0) | 2012.08.15 |
MATLAB Conditional Breakpoints (2) | 2012.08.06 |
MATLAB 단축키 설정 백업 (0) | 2012.08.05 |
MATLAB persistent 주의 할 점 (2) | 2012.07.03 |
MATLAB 파일이름 다룰때 유용한 함수들 fileparts, fullfile, filesep (0) | 2012.07.01 |
MATLAB 그래프 자동 업데이트 linkdata (0) | 2012.06.30 |
MATLAB assert() 함수 (0) | 2012.06.28 |
댓글