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;
}
=====================================================================
posted by 털보네i
: