реклама на сайте
подробности

 
 
> Библиотека DSP для STM32F1xx от STM, не понятны результаты FFT
Halfback
сообщение Oct 11 2012, 12:15
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 322
Регистрация: 28-05-05
Пользователь №: 5 512



Здравствуйте!
Пытаюсь понять как работает библиотека STM DSP (STM32F10xxx DSP library firmware), а конктретно FFT. ЧТо 64 что 256 - непонятен результат на выходе функции. Подробно в листинге:

Код
#define NPT 64
#define PI2  6.28318530717959
.....
long lBUFIN[NPT];         /* Complex input vector */
long lBUFOUT[NPT];        /* Complex output vector */
......
for(i=0;i<NPT;i++) lBUFIN[i] = 500+500*sin(PI2*i/NPT);
cr4_fft_64_stm32(lBUFOUT, lBUFIN, NPT);


по сути я нарисовал синус с амплитудой в диапазоне 0...1000 что по сути будет соответствовать оцифровке с 10-12 битного АЦП.
Далее само преобразование. Смотрел в отладчике - там в результате в массиве lBUFOUT какая-то белиберда. В pdf на библиотеку формата выходных данных не нашел. Про входные данные понял так: младшие 2 байта - действительная часть сигнала, старшие 2 - мнимые. В примерах посмотрел на функцию MygSin - почему-то они в отчеты синуса запихивают в старшие разряды. Непонятно. wacko.gif

В общем прошу помощи у тех кто в сове время разобрался - как правильно упаковывать в lBUFIN и как декодировать lBUFOUT.
Заранее спасибо!

Ссылки:
Описание библиотеки
Библиотека

Сообщение отредактировал Halfback - Oct 11 2012, 12:17
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Xenia
сообщение Oct 11 2012, 12:40
Сообщение #2


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



А у него точно long длиной в 32 бита? Может быть для уверенности лучше написать uint32_t, как в примере? А то по идее у него уже обычный int должен быть длиной в 32 бита.

А пример у вас в описании библиотеки приведен:

Код
#define N 64 /*Number of points*/
uint32_t x[N],y[N]; /* input and output arrays */
uint16_t real[N], imag[N]; /* real and imaginary arrays */
/* Fill the input array */
for(i=0; i<N; i++)
x[i] = (((uint16_t)(real[i])) | ((uint32_t)(imag[i]<<16)));
cr4_fft_64_stm32(y, x, N); /*computes the FFT of the x[N] samples*/

Это означает, что действительная часть хранится в младших 16-ти битах 32-битного числа, а мнимая - в его старших 16-битах.
И хотя там явно о том не сказано, но, по-видимому, и в результате преобразования тоже будет та же самая система.
Поэтому, на мой взгляд, было бы проще объявить входные и выходные данные не как массив из 32-битных целых, а как массив структур из 16-битных real и image полей:
Код
struct complex
{ uint16_t real;
  uint16_t imag;
} BUFOUT[NPT], BUFIN[NPT];

for(i=0;i<NPT;i++) { BUFIN[i].real=500+500*sin(PI2*i/NPT); BUFIN[i].imag=0; }
cr4_fft_64_stm32(BUFOUT, BUFIN, NPT);
// cos-амплитуды выбираем из BUFOUT[i].real, а sin-амплитуды из BUFOUT[i].imag

Тогда и упаковывать/распаковывать ничего не придется.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th July 2025 - 19:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01329 секунд с 7
ELECTRONIX ©2004-2016