13

나는 double을 사용하는 C 코드를 가지고있다. DSP (TMS320)에서 코드를 실행할 수 있기를 원합니다. 그러나 DSP는 double 형을 지원하지 않으며 오직 고정 소수점 형을 지원합니다. 코드를 고정 소수점으로 변환하는 가장 좋은 방법은 무엇입니까? 정수로 구현 된 고정 소수점 수를위한 좋은 C 라이브러리가 있습니까?어떻게 부동 소수점 C 코드를 고정 소수점으로 변환합니까?

+3

이것은 꽤 큰 주제입니다. 이 SO 질문에 대한 훌륭한 토론이 있습니다 : http://stackoverflow.com/questions/79677/whats-the-best-way-to-do-fixed-point-math. 거의 모든 답변에 유용한 덩어리가있었습니다. – mtrw

+1

호기심에서 DSP 컴파일러는 고정 점을 어떻게 표현합니까? 두 개의 정수로? 예를 들어 두 개의 고정 소수점 숫자를 함께 추가하는 방법은 무엇입니까? – chrisaycock

+0

이들은 32 비트 값 ('long')으로 표현되며 유형에 내재적으로 시프트됩니다. 예를 들어, 점 ('_iq16') 뒤에 16 비트가 있으면 기본 유형의 정수 65536으로 고정 소수점 수 1.0을 나타냅니다. 동일한 유형의 고정 소수점 수를 더하거나 뺄 때 표준 정수 연산을 사용할 수 있습니다. 곱셈은 ​​스케일링을 수정하기 위해 추가 시프트가 필요합니다. – starblue

답변

8

TI는 "IQmath"라는 고정 소수점 라이브러리 제공 :

http://focus.ti.com/lit/sw/sprc990/sprc990.pdf

현재 코드 분석을 포함 변환 - 당신이 그것을 저장할 수있는 범위를 알 필요가 각 변수를, 어떤 정밀도가 필요 . 그런 다음 저장할 유형을 결정할 수 있습니다. IQMath는 q30에서 +/- 2 범위와 0.0000000001 ~ q1의 정밀도 및 ~ +/- 1 백만 범위 및 정밀도 0.5의 유형을 제공합니다.

가능한 변수의 범위를 오버플로, 당신은 오버 플로우에 대한 검사를 추가해야하고 그것을 처리하는 방법을 결정할 수있는 작업에 대한

- 등 최대, 축척이 다른 가게에서 그것을 핀, 오류를 제기,

실제로 프로세스의 데이터 흐름을 깊이 이해하지 않고 고정 소수점으로 변환 할 수있는 방법은 없습니다.

5

대부분의 DSP 툴체인은 소프트웨어에서 부동 소수점 에뮬레이션 용 라이브러리를 포함합니다. 이 작업은 느려지지만 먼저 부동 소수점 지원을 사용하여 코드를 작성한 다음 충분한 성능을 얻으려면 고정 소수점으로 변환해야하는 곳이 몇 개 있는지 확인해야합니다. 또한 고정 소수점으로 포팅 할 때 비교할 때 부동 소수점 연산을 실행해야 프로세스에서 아무 것도 잃지 않았는지 확인할 수 있습니다.

0

거기에 몇 가지 라이브러리가 있습니다. 더 많은 가능성이 있지만, 귀하의 장치에 대한 PSP는 수학 라이브러리의 일종을 포함해야합니다. 문서화되어야합니다. PSP에서 제공하는 API를 사용할 때 원시 기반 부동 소수점 산술을 수행 할 때 사용하는 컨트롤 구조가 의미가 없기 때문에 코드를 다시 작성해야 할 수 있습니다.

예를 들어 - C 코드 드문 드문, 당신은 부동 소수점 에뮬레이션 라이브러리를 사용할 수 있습니다 매우 드물게/복식을 사용하지 않는 경우이

double arraysum = 0.0; 
for (int i = 0; i < arraylen; i++) 
{ 
    arraysum += array[i]; 
} 

psp_decimal_t arraysum; 
if (0 != psp_sum_elements(&array, arraylen, &arraysum)) 
{ 
    printf("error!"); 
} 
+0

링크가 작동하지 않습니다. 정확한 내용을 입력하십시오. – Danijel

+0

슬프게도, 나는 그 내용을 다른 곳이나 그것을 게시 한 개인에서도 찾을 수 없었습니다. –

2

로 변환 할 수 C 코드를 10 배에서 100 배 느리게 실행하지 않아도됩니다. 성능이 저하되고 부동 소수점 연산이 많이 발생하지 않고 모든 실제 입력에 대해 산술 및 저장 연산마다 필요한 스케일 및 정밀도를 알고 있다면 수동으로 각 산술 연산을 변환 할 수 있습니다. 스케일 된 정수 데이터 유형 및 연산을 사용했습니다. 그러나 정밀도 요구 사항을 분석하는 것은 일반적으로 DSP 유형 코드에 대해 중요하지 않습니다. 이 주제에는 많은 DSP 및 수치 방법 교과서 장이 있습니다.

+0

... 마지막 문장을 정교하게 작성하십시오. 도움이 필요합니다. – jpinto3912

12

다음 코드는 정수를 내부 표현으로 사용하여 고정 유형을 정의합니다. 더하기와 빼기는 +- 연산자로 간단히 수행됩니다. 곱셈은 ​​정의 된 MULT 매크로를 사용하여 수행됩니다.

#include <stdio.h> 
typedef int Fixed; 

#define FRACT_BITS 16 
#define FRACT_BITS_D2 8 
#define FIXED_ONE (1 << FRACT_BITS) 
#define INT2FIXED(x) ((x) << FRACT_BITS) 
#define FLOAT2FIXED(x) ((int)((x) * (1 << FRACT_BITS))) 
#define FIXED2INT(x) ((x) >> FRACT_BITS) 
#define FIXED2DOUBLE(x) (((double)(x))/(1 << FRACT_BITS)) 
#define MULT(x, y) (((x) >> FRACT_BITS_D2) * ((y)>> FRACT_BITS_D2)) 

위의 코드를 사용하여 이미지 처리 알고리즘에서 분수를 나타 냈습니다. 복식을 사용하는 버전보다 빠르며 그 결과는 거의 동일합니다.

+0

이 라이브러리를 확인하십시오 : [http://www.sf.net/projects/fixedptc](http://www.sf.net/projects/fixedptc) –

관련 문제