arm_cfft_sR_q31_len4096 необъявленный

Я выполняю некоторые вычисления БПФ на STM32F407 и хочу сравнить различные функции БПФ, доступные в библиотеке CMSIS DSP. Когда я использую функции CFFT f32, он работает так, как и следовало ожидать, но когда я пытаюсь использовать функции q31/q15, я получаю сообщение об ошибке «arm_cfft_sR_q31_len4096» или arm_cfft_sR_q15_len4096, необъявленное, когда я вызываю их соответствующие функции cfft. Я включил arm_const_structs.h, где он должен быть определен, но, видимо, это не так? Он работает с arm_cfft_sR_f32_len4096 для версии функций f32, так в чем может быть проблема?

Вот как выглядит версия моих вычислений fft для f32:

#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));
}

person Pethead    schedule 03.08.2016    source источник
comment
Опубликуйте точный текст сообщения об ошибке, которое вы получаете.   -  person kkrambo    schedule 03.08.2016
comment
Что вы сделали, чтобы решить проблему самостоятельно (кроме того, что спросили других)? Вы хоть в заголовки смотрели?   -  person too honest for this site    schedule 04.08.2016
comment
Код, который вы разместили, использует arm_cfft_sR_f32_len4096. Вы должны публиковать код, который демонстрирует проблему, о которой вы спрашиваете, а не код, который работает! Как мы должны увидеть проблему в коде, в котором нет проблемы?!   -  person Clifford    schedule 04.08.2016


Ответы (1)


Я нашел копию arm_const_structs.h в Интернете. Он включает в себя следующую строку:

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 в свой проект, чтобы он компилировался и связывался с вашей программой.

person kkrambo    schedule 03.08.2016
comment
Ладно, где ты это нашел? В версии, которая находится на github github.com/ARM -software/CMSIS/blob/master/CMSIS/Include/ f32 также является внешним - person Pethead; 03.08.2016
comment
Я нашел его, просто погуглив имя файла. Да, все объявления extern находятся в файле .h. Вам необходимо связать файл .c, чтобы получить определения. - person kkrambo; 03.08.2016
comment
@kkrambo: Я думаю, вы упустили суть - он говорит, что это работает для arm_cfft_sR_f32_len4096, что также является extern, поэтому он, должно быть, уже связывает определение, по крайней мере, для этого. Более того, ошибка не объявлена, а не определена - это говорит о том, что декларация не видна. - person Clifford; 04.08.2016
comment
@Клиффорд, я понимаю, что ты говоришь. Копия файла .h, которую я нашел, содержит объявление и не заключена ни в какие #ifdefs. Так что либо у него другая версия файла .h, либо он на самом деле не включает файл .h, либо он неправильно написал имя переменной, либо неправильно сообщил сообщение об ошибке. Учитывая то, что написано в вопросе, эта последняя возможность показалась мне наиболее правдоподобной, поэтому я согласился с этим ответом. - person kkrambo; 04.08.2016
comment
Согласен - и я отмечаю, что ваш запрос на дословное сообщение об ошибке еще не рассмотрен. Кто знает, почему за этот по сути неполный вопрос проголосовали за?! - person Clifford; 04.08.2016