Вновь возвращаюсь с вопросом. Необходимо провести FFT над данными из АЦП. Часть кода такова:
Код
int16_t analysis_arr[512]; //данные с АЦП
int16_t spec_ana_arr[1024];
int16_t amplitude_arr[512];
arm_status status;
arm_rfft_instance_q15 S;
arm_cfft_radix4_instance_q15 S_CFFT;
status = ARM_MATH_SUCCESS;
status = arm_rfft_init_q15(&S, &S_CFFT, 512, 0, 1);
arm_rfft_q15(&S, analysis_arr, spec_ana_arr);
arm_cmplx_mag_q15(spec_ana_arr, amplitude_arr, 512);
В функции arm_cmplx_mag_q15 выполняется:
Код
/* C[0] = sqrt(A[0] * A[0] + A[1] * A[1]) */
real = *pSrc++;
imag = *pSrc++;
acc0 = __SMUAD(real, real);
acc1 = __SMUAD(imag, imag);
/* store the result in 2.14 format in the destination buffer. */
arm_sqrt_q15((q15_t) (((q63_t) acc0 + acc1) >> 17), pDst++);
Вопрос в том, для чего нужно сдвигать сумму квадратов аж на 17 разрядов?
Еще вопросы. После выполнения arm_rfft_q15 исходный массив analysis_arr меняется. Почему? Выходной формат функции arm_rfft_q15 9.7, что это означает?