STM32F407에서 일부 FFT 계산을 수행하고 있으며 CMSIS DSP 라이브러리에서 사용할 수있는 다른 FFT 함수를 비교하려고합니다. 내가 f32 CFFT 함수를 사용할 때 예상대로 작동하지만 q31/q15 함수를 사용하려고하면 각각의 cfft 함수를 호출 할 때 "arm_cfft_sR_q31_len4096"또는 arm_cfft_sR_q15_len4096 선언되지 않은 오류가 발생합니다. arm_const_structs.h를 정의해야하지만 어디에서 정의해야합니까? 함수의 f32 버전에서 arm_cfft_sR_f32_len4096과 함께 작동하므로 문제가 될 수 있습니까?arm_cfft_sR_q31_len4096 undeclared
#include "arm_const_structs.h"
float32_t fft_data[FFT_SIZE * 2];
uint16_t util_calculate_fft_value(uint16_t *buffer, uint32_t len, uint32_t fft_freq, uint32_t fft_freq2)
{
uint16_t i;
float32_t maxValue; // Max FFT value is stored here
uint32_t maxIndex; // Index in Output array where max value is
tmStartMeasurement(&time); // Record clock cycles
// Ensure in buffer is not longer than FFT buffer
if (len > FFT_SIZE)
len = FFT_SIZE;
// Convert buffer uint16 to fft input float32
for (i = 0; i < len ; i++)
{
fft_data[i*2] = (float32_t)buffer[i]/2048.0 - 1.0; // Real part
fft_data[i*2 + 1] = 0; // Imaginary part
}
// Process the data through the CFFT module intFlag = 0, doBitReverse = 1
arm_cfft_f32(&arm_cfft_sR_f32_len4096, fft_data, 0, 1);
// Process the data through the Complex Magniture Module for calculating the magnitude at each bin
arm_cmplx_mag_f32(fft_data, fft_data, FFT_SIZE/2);
// Find maxValue as max in fft_data
arm_max_f32(fft_data, FFT_SIZE, &maxValue, &maxIndex);
if (fft_freq == 0)
{ // Find maxValue as max in fft data
arm_max_f32(fft_data, FFT_SIZE, &maxValue, &maxIndex);
}
else
{ // Grab maxValue from fft data at freq position
arm_max_f32(&fft_data[fft_freq * FFT_SIZE/ADC_SAMP_SPEED - 1], 3, &maxValue, &maxIndex);
if (fft_freq2 != 0)
{
// Grab maxValue from fft data at freq2 position
float32_t maxValue2; // Max FFT value is stored here
uint32_t maxIndex2; // Index in Output array where max value is
arm_max_f32(&fft_data[fft_freq * FFT_SIZE/ADC_SAMP_SPEED - 1], 3, &maxValue2, &maxIndex2);
maxValue = (maxValue + maxValue2)/2.0;
}
}
tmStopMeasurement(&time); // Get number of clock cycles
// Convert output back to uint16 for plotting
for (i = 0; i < len/2; i++)
{
buffer[i] = (uint16_t)(fft_data[i] * 10.0);
}
// Zero the rest of the buffer
for (i = len/2; i < len; i++)
{
buffer[i] = 0;
}
LOG_INFO("FFT number of cycles: %i\n", time.worst);
return ((uint16_t)(maxValue * 10.0));
}
받고있는 오류 메시지의 정확한 텍스트를 게시하십시오. – kkrambo
다른 사람에게 물어 보는 것 외에는 문제를 해결하기 위해 무엇을 했습니까? 당신은 심지어 헤더를 들여다 보았습니까? – Olaf
게시 한 코드는'arm_cfft_sR_f32_len4096'을 사용합니다. 당신은 당신이 물어 보는 문제를 보여주는 teh 코드를 게시해야합니다. 문제가없는 코드의 문제를 어떻게 알 수 있을까요?! – Clifford