2016-08-03 12 views
0

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)); 
} 
+1

받고있는 오류 메시지의 정확한 텍스트를 게시하십시오. – kkrambo

+0

다른 사람에게 물어 보는 것 외에는 문제를 해결하기 위해 무엇을 했습니까? 당신은 심지어 헤더를 들여다 보았습니까? – Olaf

+3

게시 한 코드는'arm_cfft_sR_f32_len4096'을 사용합니다. 당신은 당신이 물어 보는 문제를 보여주는 teh 코드를 게시해야합니다. 문제가없는 코드의 문제를 어떻게 알 수 있을까요?! – Clifford

답변

1

내가 온라인 arm_const_structs.h의 사본을 발견 : 여기

내 FFT 계산의 F32 버전을 보는 방법이다.

extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len4096; 

extern 키워드가이 라인은 선언 arm_cfft_SR_q31_len4096 아닌 정의 것을 의미에는 다음과 같은 라인이 포함되어 있습니다. 변수는 코드의 다른 위치에 정의되어야합니다.

arm_const_structs.c에 정의가 있습니다.

const arm_cfft_instance_q31 arm_cfft_sR_q31_len4096 = { 
    4096, twiddleCoef_4096_q31, armBitRevIndexTable_fixed_4096, ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH 
}; 

프로젝트에 arm_const_structs.c가 포함되어 컴파일되고 프로그램과 링크되도록하십시오.

+0

좋아, 어디서 났니? github https://github.com/ARM-software/CMSIS/blob/master/CMSIS/Include/arm_const_structs.h에있는 버전에서 f32 파일도 extern입니다. – Pethead

+0

파일 이름을 검색하여 간단히 알았습니다. . 예, 모든 선언은 _h_ 파일에서 'extern'입니다. 정의를 얻으려면 _.c_ 파일로 링크해야합니다. – kkrambo

+0

@kkrambo : 내가 생각하는 요점을 놓쳤다. 그는'arm_cfft_sR_f32_len4096'도'extern'이기 때문에, 적어도 이미 그 정의를 연결하고 있어야한다. 또한 오류는 "선언되지 않음"이 아닌 "정의되지 않음"입니다. * 선언 *이 표시되지 않음을 나타냅니다. – Clifford