Форум РадиоКот https://radiokot.ru/forum/ |
|
преобразование фурье https://radiokot.ru/forum/viewtopic.php?f=59&t=149491 |
Страница 1 из 1 |
Автор: | Real lev [ Вс окт 29, 2017 19:38:23 ] |
Заголовок сообщения: | преобразование фурье |
Добрый день. Разбираюсь с преобразованием для аудио-спектрометра, нужна консультация по коду и по функциям. Может чегото не хватает или делаю не так. Контроллер STM32f407. Математическую библиотеку "arm_math.h" подключил Код большой, приведу главные функции: //обьявляем размер FFT #define FFT_SIZE 32 //для теста - массив чисел, для обычной синусоиды const uint16_t aSine12bit[32] = { 2047, 2447, 2831, 3185, 3498, 3750, 3939, 4056, 4095, 4056, 3939, 3750, 3495, 3185, 2831, 2447, 2047, 1647, 1263, 909, 599, 344, 155, 38, 0, 38, 155, 344, 599, 909, 1263, 1647}; В начале функции локальные переменные int16_t fft_Sbuff[FFT_SIZE] = {0}; int16_t fft_Dbuff[FFT_SIZE*2] = {0}; По таймеру, раз в секунду: Копируем во входной массив для fft "тестовый" синус. for (i=0; i<FFT_SIZE; i++) { fft_Sbuff[i]=aSine12bit[i];} Делаем преобразование(раз в секунду) arm_rfft_instance_q15 S; status = arm_rfft_init_q15(&S, FFT_SIZE, 0, 1);//функция инициализации необходима для БФП if(status == ARM_MATH_SUCCESS) { arm_rfft_q15(&S,fft_Sbuff, fft_Dbuff);//выполнение БФП arm_cmplx_mag_q15(fft_Dbuff, fft_Sbuff, FFT_SIZE);//вычисляем амплитуды гармоник } Вывожу график вертикальными линиями for (i=0; i<FFT_SIZE; i++) { LCD_vline(i,100, fft_Sbuff[i]);}//аргументы: LCD_vline(x,y, len); В выходном массиве fft_Sbuff находятся амплитуды гармоник 32 частотных под_диапазонов? На графике должна быть одна линия. Как сделать преобразование для реального сигнала? Каким образом подобрать частоту оцифровки? |
Автор: | 240265 [ Сб ноя 04, 2017 09:20:14 ] |
Заголовок сообщения: | Re: преобразование фурье |
http://cvs.aiq.ru/stm32f303-2_2/stm32f303-2_2.html viewtopic.php?p=3198737#p3198737 |
Автор: | AVI-crak [ Вс ноя 05, 2017 18:56:49 ] |
Заголовок сообщения: | Re: преобразование фурье |
Давно я так не обламывался. Решил на халяву посмотреть исходник по http://cvs.aiq.ru/stm32f103-2_2/stm32f4103-2_2.html ссылке, а там каша без переноса строк... И ведь непонятно, то-ли комментарий // на текст, то-ли на часть кода в тени. |
Автор: | Fusion [ Вс ноя 05, 2017 22:29:58 ] |
Заголовок сообщения: | Re: преобразование фурье |
Другой кнопкой мыши - сохранить как - и сохранить с расширением .c Во вторник могу на яндекс диск бросить.... Вот код вместе с логарифмом и выводом на экран: Спойлер#include "FFT.h"void FFT(uint16_t *buffer) { static float Re[512]; static float Im[512]; register int i, j, n, k, io, ie, in, nn; float ru, iu, rtp, itp, rtq, itq, rw, iw, sr; union ADVFLOAT { float x; struct { unsigned int mant : 23; // Mantissa without leading one unsigned int exp : 8; // Exponential part unsigned int sign : 1; // Indicator of the negative number }; }; for(int i=0; i<512; i++) { float aaa=buffer[i]; Re[i] = aaa/256; Im[i] = 0.0; } nn = 512 >> 1; ie = 512; for(n=1; n<=9; n++) { rw = Rcoef[9 - n]; iw = Icoef[9 - n]; in = ie >> 1; ru = 1.0F; iu = 0.0F; for(j=0; j<in; j++) { for(i=j; i<512; i+=ie) { io = i + in; rtp = Re[i] + Re[io]; itp = Im[i] + Im[io]; rtq = Re[i] - Re[io]; itq = Im[i] - Im[io]; Re[io] = rtq * ru - itq * iu; Im[io] = itq * ru + rtq * iu; Re[i] = rtp; Im[i] = itp; } sr = ru; ru = ru * rw - iu * iw; iu = iu * rw + sr * iw; } ie >>= 1; } for(j=i=1; i<512; i++) { if(i < j) { io = i - 1; in = j - 1; rtp = Re[in]; itp = Im[in]; Re[in] = Re[io]; Im[in] = Im[io]; Re[io] = rtp; Im[io] = itp; } k = nn; while(k < j) { j = j - k; k >>= 1; } j = j + k; } SendCMD(ILI9341_MAC); SendDAT(Orient_Land); SendCMD(ILI9341_PAGE_ADDR); SendDAT(0); SendDAT(1+31); SendDAT(1); SendDAT(1+31); SendCMD(ILI9341_COLUMN_ADDR); SendDAT(0); SendDAT(33-10); SendDAT(0); SendDAT(214-10); SendCMD(ILI9341_GRAM); GPIO_SetBits(GPIOB, LCD_RS); // data for (uint16_t j = 1; j < 257; j++) { for (uint8_t i = 0; i < 182; i++) { union ADVFLOAT ax; int exp; ax.x = (Re[j]*Re[j]+Im[j]*Im[j]); exp = ax.exp - 127; ax.sign = 0; ax.exp = 127; float D=12*((ax.x - 1.0f) * LOG2E + exp); if (i<D) { // int K=D; SPI_I2S_SendData(SPI1, WHITE>>8); SPI_I2S_SendData(SPI1, WHITE); } else { if (i==46||i==92||i==138||j==64||j==128||j==192) { SPI_I2S_SendData(SPI1, 0x01); SPI_I2S_SendData(SPI1, 0xE7); } else { SPI_I2S_SendData(SPI1, 0); SPI_I2S_SendData(SPI1, 0); } } } } } //================== // fft.h 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 }; #define LOG2E 1.44269504088896340736f void FFT(uint16_t *buffer); |
Автор: | arkhnchul [ Пн ноя 06, 2017 17:19:49 ] |
Заголовок сообщения: | Re: преобразование фурье |
а там каша без переноса строк там она с *nix-овыми переносами. Ваш редактор не умеет их понимать, или хотя бы автоформатирование кода?) main.c: https://pastebin.com/sNhVNwWp |
Автор: | 240265 [ Пн ноя 06, 2017 20:32:14 ] |
Заголовок сообщения: | Re: преобразование фурье |
Я все в Кейл запульнул и нормально |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |