Micom_Electric/마이컴_원칩
2010. 11. 6. 17:33
- 온도 테이블을 이용한 인덱싱 루틴 : 바이너리 검색 (binary search)
지난번에 올린 루틴에 문제가 있어 수정함.
기울기 계산시 소수점 이하로 내려가므로 float 연산을 요구하게 되어
float 연산을 피하기 위해 계산 순서를 변경하여 정수범위에서 하도록 함
=====================================================================
int16_t BInterp(int16_t *xaxis, int16_t *yaxis, uint8_t num, uint16_t xval){
// when call the num means the last index value : 0...9 num=9
// Binary interpolation routine
uint8_t left, right, mid;
int16_t yval;
if(xval <= xaxis[0]) return(yaxis[0]);
else if(xval >= xaxis[num]) return(yaxis[num]);
else{
left = 0;
right = num;
}
while((left+1) < right){
mid = (left + right) / 2;
if(xval < xaxis[mid])
right = mid;
else if(xval > xaxis[mid])
left = mid;
else
return(yaxis[mid]);
}
// incline = (yaxis[right]-yaxis[left]) / (xaxis[right]-xaxis[left])
// yval = y[left] + (incline * offset)
// rearrange formula to avoid float
yval = (yaxis[right]-yaxis[left]) * (xval-xaxis[left]);
yval = yaxis[left] + yval / (xaxis[right]-xaxis[left]);
return yval;
}
=====================================================================