2011-05-07 1 views
4

내 시스템에서 사인 값/코사인 값을 계산하기 위해 룩업 테이블을 구현했습니다. 이제 역 삼각 함수 (arcsin/arccos)가 필요합니다.사인 룩업 테이블에서 arcsin 연산의 효율성

내 응용 프로그램이 프로그램 메모리가 제한되어 있으므로 arcsin에 대한 두 번째 찾아보기 테이블을 추가 할 수없는 임베디드 장치에서 실행됩니다. 그래서 염두에두고 해결책은 사인 조회 테이블을 찾아 해당 색인을 검색하는 것이 었습니다.

이 솔루션이 수학 표준 라이브러리의 표준 구현을 사용하는 것보다 효율적인지 궁금합니다.
누군가 이미 이것을 실험 해 보았습니까?

현재 LUT의 구현은 0에서 PI/2까지의 사인 값의 배열입니다. 테이블에 저장된 값에 4096을 곱하여 정수 값을 유지하면서 응용 프로그램에 충분한 정밀도를 유지합니다. 조회 테이블은 1/4096의 해상도로 6434 값의 배열을 제공합니다. 그러면 두 개의 funcitons가 사인 & 코사인을 라디안 단위로 4096을 인수로 취합니다. 이러한 함수는 주어진 각도를 첫 번째 사분면에서 해당 각도로 변환하고 테이블에서 해당 값을 읽습니다.

내 응용 프로그램은 40MIPS에서 dsPIC33F로 실행되며 C30 컴파일 스위트를 사용합니다.

+3

현재 사인/코사인 테이블 – finnw

+0

의 구조를 설명하십시오. finnw와의 동의. 이제 테이블의 구조에 따라 테이블에 대해 충분히 빠른 이진 검색을 수행 할 수 있습니다. 그러나 당신은 또한 이런 식으로 다소 정확성을 잃을 것입니다. – schnaader

+0

내 조회 테이블 구현에 대한 정보로 내 질문을 편집했습니다. – greydet

답변

3

하드웨어, 컴파일러 또는 코드에 대해 알려주지 않으므로 확실하게 말할 수 없습니다. 그러나 선험적으로, 나는 컴파일러의 표준 라이브러리가 코드보다 더 효율적일 것으로 기대한다.

+0

조회 테이블 및 실행 장치에 대한 정보를 추가했습니다. – greydet

3

C++을 지원하지 않는 C30 컴파일러를 사용해야한다는 것은 불행한 일입니다. 그렇지 않으면 Optimizing Math-Intensive Applications with Fixed-Point Arithmetic 및 관련 라이브러리를 알려줄 것입니다.

그러나 일반적인 원칙은 the CORDIC algorithm이며, 메모리 사용 공간은 현재 구현보다 훨씬 작습니다. 이 기사에서는 arctan() 및 arccos() 생성에 대해 설명하고 arcsin()은 here과 같이 계산할 수 있습니다.

enter image description here

당신은 또한 제곱근과 분열을해야한다는 점 또한 시사 물론

enter image description here

. PIC24/dsPIC에는 하드웨어 정수가 포함되어 있어도 값 비쌉니다. 수학 가속에 관한 기사에서도 제곱근을 다루고 있습니다. 룩업 테이블 방식은 직접 룩업에서는 더 빠를 것이지만 역 검색에서는 그렇지 않을 수도 있지만이 기사에서 설명한 접근 방식은 더 일반적이며 더 정확합니다 (라이브러리는 64 비트 정수를 36.28 비트로 사용합니다 고정 소수점을 사용하면 응용 프로그램의 정밀도와 범위가 줄어들 수 있습니다.) 소프트웨어 부동 소수점을 사용하는 표준 라이브러리 구현보다 확실히 빠릅니다.

0

6434의 이진 탐색은 값을 찾기 위해 ~ 12 개의 검색을 취하고 더 많은 정확도가 필요한 경우 보간법을 수행합니다. 죄악 곡선의 특성으로 인해 한쪽 끝이 다른 쪽보다 정확도가 훨씬 높아집니다. 메모리를 절약 할 수 있다면 입력에 균등하게 간격을 둔 역 패턴을 만드는 것이 속도와 정확성에있어 더 나은 선택 일 수 있습니다.

기본 제공 버전과의 비교에서 테스트해야합니다. 그럴 때 이미지의 크기가 얼마나 증가하는지주의하십시오. 일부 시스템에서는 stdin 구현이 상당히 복잡 할 수 있습니다.

+0

죄송합니다. 제 2 테이블을 가질 여유가 없다고 말한 부분을 놓쳤습니다. 나는 아직도 stdlib d를 제거함으로써 얻을 수있는 절약액을 볼 수 있습니다. – AShelly

1

메모리를 절약하기 위해 대단위 룩업 테이블을 결합하는 "반"접근 방식을 사용하고있는 중간 값에 대한 숫자 근사 (선형 보간보다 정확한 것 등 Maclaurin Series.)

일부 예제는 here입니다.

This question에도 관련 링크가 있습니다.