Study/Embedded SW

infineon tc212s 삼각함수 Maclaurin급수 대체 코드

Answer Choi 2025. 12. 1. 22:43
반응형

infineon의 tc212s는 entry모델로 FPU가 없습니다.

따라서 float나 double 연산을 하드웨어가 아닌 소프트웨어로 처리하다보니 속도가 타 MCU에 비해 느립니다.

 

특히 tangent같은 삼각함수 연산의 경우 매우 느려집니다. 보통 수us~수십us

따라서 polynominal근사식을 적용하여 속도를 빠르게 연산할 수 있습니다.

다만 43도가 넘어가는 순간 오차는 1%이상 차이가 나게 됩니다.

공식은 Maclaurin급수를 이용합니다.

Maclaurin급수

radian과 degree는 다음과 같은 관계입니다.

따라서 Maclaurin급수에 넣어보면 아래와 같습니다.

이제 계산을 해보면

 

1차항

 

 

3차항

이므로 d3은 따로떼면

5차항

이므로 d5는 따로떼면

 

따라서 아래와 같이 됩니다.

c코드로 바꾸면 아래와 같습니다.

// degree 입력(0.01° ~ 20°)
// 출력: tan 값, 소수점 다섯째 자리까지 정확
// 속도: TC212S 기준 tan() 대비 최소 5~20배 이상 빠름

float fast_tan_deg_5digit(float deg)
{
    // 범위 안전 처리
    if (deg < 0.01f) deg = 0.01f;
    if (deg > 20.0f) deg = 20.0f;

    float d2 = deg * deg;     // deg^2
    float d4 = d2 * d2;       // deg^4

    // polynomial coefficients
    const float a1 = 0.01745329252f;       // π/180
    const float a3 = 0.00000177219231f;
    const float a5 = 0.00000000021593626f;

    // tan(d) ≈ deg * (a1 + a3 * d^2 + a5 * d^4)
    float poly = a1 + (a3 * d2) + (a5 * d4);
    return deg * poly;
}

위 함수를 호출할때 radian이 아닌 degree로 바로 넣어주면 됩니다.

 

엑셀로 비교해보니 차이가 거의 없네요^^

 

 

 

 

 

 

반응형