임베디드 애플리케이션을위한 고정 소수점 삼각법


9

sin () cos () 및 tan () 함수가 필요한 임베디드 응용 프로그램에서 회전 (및 기타) 변환을 수행해야합니다. 나는 당신이 룩업 테이블을 사용할 수 있다는 것을 알고 있는데, 그것은 내 연구를 할 수있는 유일한 솔루션이지만, 거기에 좋은 고정 점 삼각 라이브러리가 있습니까?

응용 프로그램에 cortex M3을 사용하려고 생각하고 있으므로 응용 프로그램을 쉽게 유지하기 위해 가능한 한 부동 소수점에서 멀리하고 싶습니다.


두 가지 생각 : 전통적인 회전 기본 구현은 CORDIC 알고리즘입니다. 공급 업체가 현재 고려중인 M3과 경쟁하는 Cortex M4를 제공하는지 확인할 수도 있습니다.
Chris Stratton

4
룩업 테이블을 사용하고 싶지 않은 이유는 무엇입니까? 그것은 죄와 죄에 매우 효과적입니다. 알고리즘 적으로 죄와 죄를 짓는 것은 더 오래 걸릴 것입니다. 유일한 장점은 사용되는 프로그램 메모리 공간이 적을 수 있지만 실제로 응용 프로그램에서 중요합니까?
Olin Lathrop

@OlinLathrop, 다른 사람들이 찾은 것을 알고 싶습니다. 아마도 찾을 수없는 메모리 공간을 절약하면서 오류없이 작은 문제로 신속하게 문제를 해결할 수있는 효율적인 방법입니까? 내가 아는 것 (그리고 내가 틀릴 수 있음)에서 표준 라이브러리를 사용하여 알고리즘을 해결하는 가장 큰 문제는 모든 수학이 부동 소수점으로 수행되고 모든 숫자로 수행 해야하는 FPU가 없다는 것입니다. 이는 매우 비효율적입니다. .. 룩업 테이블의 가장 큰 문제점은 얼마나 정확해야합니까? 그리고 그 정확도 요구 사항이 변경되면 여전히 충분한 프로그램 메모리가 있습니까?
Bob

얼마나 정확한가? 적당한 크기의 조회 테이블은 대부분의 내장 된 sin / cos 요구에 충분합니다. 1025 개의 테이블 항목을 사용하면 4096 각도 해상도를 얻을 수 있습니다. 이 시점에서 선형 상호 연관은 테이블 항목간에 정확한 정확도를 제공합니다. 사인 조회에 대한 잘못된 오해가 많이있는 것 같습니다. 자세한 내용은 electronics.stackexchange.com/a/16516/4512 에서 내 대답 을 참조하십시오.
Olin Lathrop

나는 당신이 말하는 것을 듣고 사인 함수에 대한 룩업 테이블의 아이디어를 이해하지만 코드가 제한적 인 경우 (프로젝트는 항상 코드 공간을 채 웁니다)이를 처리하는보다 간단한 방법이 있습니까? 그것이 제가 물었던 이유입니다. 많은 재능있는 사람들이 거기에 기여하고 있으며, 그들이 더 나은 것을 발견했는지 알고 싶습니다.
Bob

답변:


6

임베디드 응용 프로그램에서 삼각법을 수행하는 좋은 방법은 필요한 함수에 다항식 근사 를 사용하는 것입니다. 코드는 간결하고 데이터는 몇 가지 계수로 구성되며 필요한 연산은 곱셈과 뺄셈입니다. 많은 임베디드 시스템에는 하드웨어 멀티 플라이어가있어 우수한 성능을 제공합니다.


1
부동 소수점 명령어를 사용하지 않는 임베디드 애플리케이션에 최적화 된 C 버전의이 버전을 출시 한 사람이 있습니까? 다항식 근사법의 양쪽에서 높은 오류는 트릭을 사용하여 오류를 줄이기 위해 다른 세그먼트에 다른 다항식을 사용하거나 다른 트릭을 사용할 수 있습니다.
Bob

1
제네릭 C는 정수가 아닌 고정 소수점 데이터 형식과 연산을 직접 지원하지 않으므로이 데이터 형식에 대한 최적화는 플랫폼에 따라 다릅니다. 예를 들어, 대부분의 DSP는 하드웨어에서 직접 고정 소수점 분수 데이터 유형을 지원합니다. C에서는 독점 라이브러리를 통해 액세스 할 수 있습니다.
Dave Tweed 님이


Generic C는 _Fract 데이터 유형을 통해 지원을 받고 있지만 대부분의 마이크로 컨트롤러 구현에는 공급 업체별 라이브러리가 있습니다. 모든 고정 소수점 요구에 libmathq15 를 사용 합니다. 지금까지 작업을 수행했습니다.
slightlynybbled

_Fract쓰레기 IMHO의 조각이다; 나는 그것이 C위원회에 의해 "표준화되었다"는 사실을 싫어한다. 모든 상황에서 Q15 또는 Q31을 사용하도록 강요하므로 많은 상황에서 의미가 없으며 그러한 상황에 대한 도움없이 좌초됩니다.
Jason S

3

이것을 위해 고정 소수점 Cortex 라이브러리를 사용하는 것에 반대하고 있습니까?

q31_t arm_sin_q31 (q31_t x)
Q31 데이터에 대한 삼각 사인 함수에 대한 빠른 근사치.

에서:

CMSIS-DSP : 다양한 데이터 유형에 대한 60 개 이상의 기능이있는 DSP 라이브러리 모음 : 고정 소수점 (분수 q7, q15, q31) 및 단 정밀도 부동 소수점 (32 비트). 라이브러리는 Cortex-M0, Cortex-M3 및 Cortex-M4에 사용할 수 있습니다.

이차 보간법으로 룩업 테이블을 사용하지만 매우 빠릅니다. 속도는 빨라지지만 더 많은 오차는 선형 보간에 적용 할 수 있습니다.

또한 Cortex M4조차도 반드시 FPU를 가질 필요는 없습니다. 나는 그들이 "M4F"라고 부르는 것을 보았습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.