blackfin533에서 -1.31의 형식을 가진 fract32를 가진 코드 조각을 발견했습니다.두 고정 소수점 분수의 제곱근을 계산하는 것에 대해 설명합니다.
복소수 (re, img)의 진폭을 계산할 때 왜 프리 - 시프 팅이 필요한지 알 수 없습니다. 나는 1.31을 1.31의 소수 포맷으로 곱하고 싶다면 31 비트 오른쪽으로 이동해야한다는 것을 안다.
GO_coil_D [0], 을 .RE GO_coil_D와 [0]은 fract32 두 .im있다.
나는 다음과 같은 코드가 무엇을하고 있는지 얻을 수 없습니다
norm[0] = norm_fr1x32(GO_coil_D[0].re);
norm[1] = norm_fr1x32(GO_coil_D[0].im);
shift = (norm[0] < norm[1]) ? (norm[0] - 1) : (norm[1] - 1);
vectorFundamentalStored.im = shl_fr1x32(GO_coil_D[0].im,shift);
vectorFundamentalStored.re = shl_fr1x32(GO_coil_D[0].re,shift);
vectorFundamentalStored.im = mult_fr1x32x32(vectorFundamentalStored.im, vectorFundamentalStored.im);
vectorFundamentalStored.re = mult_fr1x32x32(vectorFundamentalStored.re, vectorFundamentalStored.re);
amplitudeFundamentalStored = sqrt_fr16(round_fr1x32(add_fr1x32(vectorFundamentalStored.re,vectorFundamentalStored.im))) << 16;
amplitudeFundamentalStored = shr_fr1x32(amplitudeFundamentalStored,shift);
round_
fr1x32` (fract32의 F1) fract16 편견 라운딩을 사용 fract 16 비트 32 비트 fract를 반올림합니다.
norm_fr1x32
norm_fr1x32 (fract32) int 입력 변수를 정규화하는 데 필요한 왼쪽 시프트 수를 0x40000000 - 0x7fffffff 간격 또는 0x80000000 - 0xc0000000 간격으로 반환합니다. 즉, fract32 x; shl_fr1x32 (x, norm_fr1x32 (x)); 비트 '0'0x7fffffff에 0x40000000과, 또는의 범위 0x80000000에 소수부의 최상위 N 비트가 모든 경우가 0xC0000000
실제 파트가 3/1024 (십진수)이고 허수 부분이 4/1024 인 경우 프리 스케일링이있는 경우와없는 경우의 작업 예제를 추가했습니다. 피타고라스 3-4-5 삼각형을 형성하기 때문에 절대 값 (진폭)은 5/1024 여야합니다. –
실재를 그 자체와 가상으로 곱한 원래의 문제가 무엇인지 말해 주시겠습니까? 결과를 더한 다음 제곱근을 취해 오른쪽 31 비트를 이동 하시겠습니까? 그 접근법의 문제점은 무엇입니까? –
1.31 형식 분수의 제곱근을 쉽게 계산할 수 있다면 실수 및 허수 릿 부분을 제곱 할 때 약간의 정밀도가 손실 될 수 있지만 그렇게하는 것은 그리 문제가되지 않습니다. –