преобразование фурье
Добавлено: Вс окт 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 частотных под_диапазонов?
На графике должна быть одна линия.
Как сделать преобразование для реального сигнала? Каким образом подобрать частоту оцифровки?
Разбираюсь с преобразованием для аудио-спектрометра, нужна консультация по коду и по функциям.
Может чегото не хватает или делаю не так.
Контроллер 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 частотных под_диапазонов?
На графике должна быть одна линия.
Как сделать преобразование для реального сигнала? Каким образом подобрать частоту оцифровки?