Микроконтроллеры

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Микроконтроллеры » STM32 » SES+CMSIS DSP Library


SES+CMSIS DSP Library

Сообщений 1 страница 7 из 7

1

Здравствуйте, устанавливаю CMSIS-DSP Support Package через Package Manager и пишу код

Код:
#include <stm32f10x.h>
#include <arm_math.h>

void main(void) {
    
    arm_status status;
    arm_rfft_instance_q15 S;

    status = arm_rfft_init_q15(&S, 2048, 0, 1);

    while(1){

    }
}

Компилирую и получаю

Код:
Building ‘test’ from solution ‘test’ in configuration ‘Debug’
  Linking test.elf
    Output/test Debug/Obj/main.o: In function `main':
    undefined reference to `arm_rfft_init_q15'
Build failed

Понятно, копирую файл libarm_cortexM3l_math.a из CMSIS в папку с проектом, и в настройках Linker -> Additional Input Files указываю $(SolutionDir)\libarm_cortexM3l_math.a.
Теперь компилируется, но размер...
http://s9.uploads.ru/t/AtFX8.png
Вопрос, так и должно быть? Может что-то не так делаю? При любых настройках оптимизации меньше не получается. Нужно для БПФ, раньше использовал функцию из википедии, но там float, хотелось бы на фиксированной точке, планирую на STM32F103C8 вместить.

2

Ну так математика же, важен размер -бери с FPU...

3

dosikus написал(а):

Ну так математика же, важен размер -бери с FPU...

Математика математикой, этот вариант

Код:
uint8_t  FFT(float *Rdat, float *Idat, int N, int LogN, int Ft_Flag)
{
  // parameters error check:
  if((N > 16384) || (N < 1))                            return false;
  if(!NUMBER_IS_2_POW_K(N))                             return false;
  if((LogN < 2) || (LogN > 14))                         return false;
  if((Ft_Flag != FT_DIRECT) && (Ft_Flag != FT_INVERSE)) return false;

  volatile register int  i, j, n, k, io, ie, in, nn;
  volatile float         ru, iu, rtp, itp, rtq, itq, rw, iw, sr;

  static const float Rcoef[14] =
  {  -1.0000000000000000F,  0.0000000000000000F,  0.7071067811865475F,
      0.9238795325112867F,  0.9807852804032304F,  0.9951847266721969F,
      0.9987954562051724F,  0.9996988186962042F,  0.9999247018391445F,
      0.9999811752826011F,  0.9999952938095761F,  0.9999988234517018F,
      0.9999997058628822F,  0.9999999264657178F
  };
  static const float Icoef[14] =
  {   0.0000000000000000F, -1.0000000000000000F, -0.7071067811865474F,
     -0.3826834323650897F, -0.1950903220161282F, -0.0980171403295606F,
     -0.0490676743274180F, -0.0245412285229122F, -0.0122715382857199F,
     -0.0061358846491544F, -0.0030679567629659F, -0.0015339801862847F,
     -0.0007669903187427F, -0.0003834951875714F
  };

  nn = N >> 1;
  ie = N;
  for(n=1; n<=LogN; n++)
  {
    rw = Rcoef[LogN - n];
    iw = Icoef[LogN - n];
    if(Ft_Flag == FT_INVERSE) iw = -iw;
    in = ie >> 1;
    ru = 1.0F;
    iu = 0.0F;
    for(j=0; j<in; j++)
    {
      for(i=j; i<N; i+=ie)
      {
        io       = i + in;
        rtp      = Rdat[i]  + Rdat[io];
        itp      = Idat[i]  + Idat[io];
        rtq      = Rdat[i]  - Rdat[io];
        itq      = Idat[i]  - Idat[io];
        Rdat[io] = rtq * ru - itq * iu;
        Idat[io] = itq * ru + rtq * iu;
        Rdat[i]  = rtp;
        Idat[i]  = itp;
      }

      sr = ru;
      ru = ru * rw - iu * iw;
      iu = iu * rw + sr * iw;
    }

    ie >>= 1;
  }

  for(j=i=1; i<N; i++)
  {
    if(i < j)
    {
      io       = i - 1;
      in       = j - 1;
      rtp      = Rdat[in];
      itp      = Idat[in];
      Rdat[in] = Rdat[io];
      Idat[in] = Idat[io];
      Rdat[io] = rtp;
      Idat[io] = itp;
    }

    k = nn;

    while(k < j)
    {
      j   = j - k;
      k >>= 1;
    }

    j = j + k;
  }

  if(Ft_Flag == FT_DIRECT) return true;

  rw = 1.0F / N;

  for(i=0; i<N; i++)
  {
    Rdat[i] *= rw;
    Idat[i] *= rw;
  }

  return true;
}


Еще с постобработкой 7 кб флеша, но 11.5 озу. А тут как будто вся либа линкуется..

4

sobs, посмотри вот это http://forum.easyelectronics.ru/viewtop … mp;t=27716

5

vt340 написал(а):

sobs, посмотри вот это http://forum.easyelectronics.ru/viewtop … mp;t=27716

Посмотрел, ссылка на гитхаб мертва. На сколько я понял тут просто библиотека для работы с фиксированной запятой (синусы, косинусы, корни, умножение и тд), FFT на их основе надо самому делать?)

Нашел древнюю либу ST UM0585, Сама библиотека, на ее основе написал

Код:
#include <stm32f10x.h>
#include "STM32F10x_DSP_Lib/inc/stm32_dsp.h"

#define FFT_SIZE    1024

uint32_t X[FFT_SIZE], Y[FFT_SIZE];
uint16_t real[FFT_SIZE], imag[FFT_SIZE];

void main(void) {
  uint16_t i;

  for (i = 0; i < FFT_SIZE; i++){
    X[i] = (imag[i] << 16) | real[i];
  }
  
  cr4_fft_1024_stm32(Y, X, FFT_SIZE);

  while (1){
  }

}

Результат 5.5кБ Flash, 12.2кБ ОЗУ. Завтра на работе постараюсь проверить как считает.

6

Ну да, самому, но тебе же не нравятся готовые )
Ссылка и правда уже мертва, но я сейчас посмотрел выше - https://github.com/warpco/ и вуаля - https://github.com/warpco/fix32

7

vt340 написал(а):

Ну да, самому, но тебе же не нравятся готовые )
Ссылка и правда уже мертва, но я сейчас посмотрел выше - https://github.com/warpco/ и вуаля - https://github.com/warpco/fix32

Спасибо, буду думать)


Вы здесь » Микроконтроллеры » STM32 » SES+CMSIS DSP Library