2016-08-03 4 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

関連する問題