Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32 FFT (БПФ)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Роман
Всем добрый день!
Недавно начал знакомство с библиотекой fft для DSP ядра arm_cfft_radix4_f32 STM32F3 и его АЦП соответственно.
Поглядел пример, решил запустить свою программку которая берет сигнал с АЦП и выдает график спектра сигнала.
Сперва просто попробовал выдавать осциллограмму, с чем успешно справился, все правильно измеряет.

Параметры для получения спектра следующие.

На вход ацп подаю сигнал от 0 до 1000 Гц с цифрового генератора.
Сигнал смещен в положительную сторону, изменяется от 0 до 3 вольта. Амплитуда сигнала постоянная. Вход АЦП пока напрямую подключен к выходу генератора витой парой.

Частота выборки АЦП задается по таймеру - 2048 Гц далее через DMA все кладу в буфер. Получаю 2048 отсчетов на канал. Sample rate на канал АЦП - 7,5 циклов.
Количество отсчетов БПФ - 1024 дискретность 1 герц

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


(С матаном и теорией по БПФ не дружу особо только поверхностно, заранее прошу прощения за что-то глупое.)
В чем моя ошибка?
Lmx2315
..при оцифровке сигнал теряет амплитуду пропорционально графику sin(x)/x , чем ближе к fсэмпл тем меньше.
V_G
Цитата(Lmx2315 @ Aug 18 2018, 23:04) *
..при оцифровке сигнал теряет амплитуду пропорционально графику sin(x)/x , чем ближе к fсэмпл тем меньше.

С какого перепугу? Амплитуду теряют образы из высших зон Найквиста. При частоте сигнала, меньшей половины частоты дискретизации, амплитуда меняться не должна. Искать глюк в программе
Самурай
Цитата(Lmx2315 @ Aug 18 2018, 17:04) *
..при оцифровке сигнал теряет амплитуду пропорционально графику sin(x)/x , чем ближе к fсэмпл тем меньше.


Только не при оцифровке, а при обратном процессе, а так все верноsm.gif))

Цитата(V_G @ Aug 18 2018, 19:08) *
С какого перепугу? Амплитуду теряют образы из высших зон при несоблюдении теоремы Котельникова. При частоте сигнала, меньшей половины частоты дискретизации, амплитуда меняться не должна. Искать глюк в программе


Вот и мне интересно, с какого это перепугу теряется амплитуда образов из высших зон при несоблюдении теоремы Котельникова??? Мы все еще про АЦП говорим? Или Вы так образно назвали ослабление сигнала на пару дБ в пределах полосы пропускания АЦП, которая, к слову, обычно в разы больше максимальной частоты дискретизации?

И вопрос для ТС: что из себя представляет Ваш "цифровой генератор"? Можете показать осциллограммы, соответствующие трем Вашим рисункам со спектром?
Роман
Цитата(Самурай @ Aug 18 2018, 19:42) *
И вопрос для ТС: что из себя представляет Ваш "цифровой генератор"? Можете показать осциллограммы, соответствующие трем Вашим рисункам со спектром?



Генератор такой, только модель немного другая


Сейчас показать осциллограммы не могу. В ПН могу снять повторно, перепроверить. Но вчера, когда тестировал, снимал синус и выводил его на комп, амплитуда оставалась такой же, как задано на генераторе сигналов во всей полосе 0 - 1 кГц (АЦП вроде как боле 5 MSPS хватит за глаза для такой частоты). Падение амплитуды от частоты происходит после БПФ.

еще я при получении данных с ацп сразу их нормализовывал и приводил к вольтам в тип float, после передавал в БПФ функцию. Но на выходе получаю какие то попугаи.
Genadi Zawidowski
У Вас не синусоида подается а сигнал переменной скважности?
Роман
Цитата(Genadi Zawidowski @ Aug 18 2018, 20:17) *
У Вас не синусоида подается а сигнал переменной скважности?


синус подаю с генератора. АЦП оцифровывает правильно.
Genadi Zawidowski
FFT "не в ту сторону" ?
Подайте постоянный код вместо АЦП - должна появиться постоянная составляющая на нулевой частоте
Роман
Цитата(Genadi Zawidowski @ Aug 18 2018, 20:04) *
FFT "не в ту сторону" ?
Подайте постоянный код вместо АЦП - должна появиться постоянная составляющая на нулевой частоте

Пост сост-ая есть слева, но плохо отрисовывается, она 720 единиц (попугаев).
Сегодня переделал немного, отображаю спектр с зеркальной частью от 0 до 512 Гц. Частоты 100, 300, 400 Гц. На 500 гц сходится в один спектр в зеркальной части
получаю такую картину


Далее с графиком синус. сигнала, оцифрованный АЦП его гармоники.
10 Гц, 100 и 300 Гц. Амплитуда синусоиды постоянная, при переводе в вольты все точно получается.
Нажмите для просмотра прикрепленного файла
Нажмите для просмотра прикрепленного файла
Нажмите для просмотра прикрепленного файла

Суммирование частот 10 и 200 гц
Нажмите для просмотра прикрепленного файла
ViKo
Значит, проблема в рисовании спектра. Палки должны быть одинаковые.
Я бы предположил, что амплитуда сигнала теряется из-за фильтра на входе АЦП, но, похоже, нет.
Роман
Цитата(ViKo @ Aug 20 2018, 10:24) *
Значит, проблема в рисовании спектра. Палки должны быть одинаковые.
Я бы предположил, что амплитуда сигнала теряется из-за фильтра на входе АЦП, но, похоже, нет.

Да должно быть. Но нет((((
Вот кусок кода где получаю выход fftOutput
CODE

#define ADC_BUFF_SIZE 2048

#define FFT_IN_BUFF_SIZE 2048
#define FFT_OUT_BUFF_SIZE 1024

#define UTX_BUFF_SIZE (4096)+2

uint16_t ADC_BUFF[ADC_BUFF_SIZE];
float32_t fftOutput[FFT_OUT_BUFF_SIZE] = {0};
float32_t fftInput[FFT_IN_BUFF_SIZE] = {0};

uint32_t fftSize = 1024;
uint32_t ifftFlag = 0;
uint32_t doBitReverse = 1;
arm_cfft_radix4_instance_f32 S;

for(uint16_t i=0; i<(ADC_BUFF_SIZE/2); i++)
{
fftInput[i] = ((float32_t)(ADC_BUFF[(i*2)]));
}
arm_cfft_radix4_init_f32(&S, fftSize, ifftFlag, doBitReverse);
arm_cfft_radix4_f32(&S, fftInput);
arm_cmplx_mag_f32(fftInput, fftOutput, fftSize);


Уже при отладке вижу в fftOutput что основная гармоника и ее зеркальное отображение имеют разные значения.
ViKo
На входные данные еще нужно окно наложить, их много разных есть. Края массива приглушить, там же обрывается синус. Может, в этом дело? Хотя, симметрия с зеркальным спектром должна сохраняться.

А откуда берутся float32_t данные от АЦП? Их же преобразовать надо, а не к типу привести.
Роман
Цитата(ViKo @ Aug 20 2018, 11:12) *
На входные данные еще нужно окно наложить, их много разных есть. Края массива приглушить, там же обрывается синус. Может, в этом дело? Хотя, симметрия с зеркальным спектром должна сохраняться.

А откуда берутся float32_t данные от АЦП? Их же преобразовать надо, а не к типу привести.

Нашел ошибку, не вписал часть равную 0 в массив fftInput
for(uint16_t i=0; i<(ADC_BUFF_SIZE/2); i++)
{
fftInput[i*2] = ((float32_t)(ADC_BUFF[(i*2)+ curr_adc_ch ])) / (float32_t)4096.0;
fftInput[(i*2)+1] = 0.0;
}
постоянная составляющая - 0 гармоника показывает величину смещения сигнала 1,5 вольт примерно.
Магнитуда синуса i-ой гармоники почему то показывает 0,8 в вместо 1,6 вольт - в 2 раза меньше. так и должно быть?
Роман
Теперь у меня слудующий вопрос. Запустил FFT с частотой дискр. АЦП 2048 Гц. Получаю 1024 выборки сигнала. Частотный диапазон сигнала на входе 500 - 1000 Гц. Получаю ряд амплитуд с частотами с шагом 2 Гц (511 точек) При отрисовке вижу, что если на вход ацп подать четное значение частоты, то амплитуда отрисовывается нормально, а если ytчетное, то амплитуда занижена на треть.
Роман
Цитата(ViKo @ Aug 24 2018, 11:48) *

Как с этим правильно бороться? Почему после преобразования амплитуды сигнала занижены в 2 раза, хотя DC составляющая показывается правильно7
ViKo
Там должно быть сказано. Нулями добивают массив и делают БПФ уже не 1024 выборки, а, к примеру, 4096.
Или интерполировать результаты БПФ.
Всегда советую книгу Р. Лайонс "Цийфровая обработка сигналов". Доступна как для скачивания, так и для понимания.
Lmx2315
Цитата(Роман @ Aug 28 2018, 09:52) *
Как с этим правильно бороться? Почему после преобразования амплитуды сигнала занижены в 2 раза, хотя DC составляющая показывается правильно7

по умолчанию применяется прямоугольное окно,
а надо наложить другое окно на входные данные БПФ, которое ограничит растекание спектра - треугольное как самое простое или другие, более расчётносложные.
Но придётся пожертовать разрешением по частоте.
ViKo
Цитата(Lmx2315 @ Aug 28 2018, 10:40) *
по умолчанию применяется прямоугольное окно,
а надо наложить другое окно на входные данные БПФ, которое ограничит растекание спектра - треугольное как самое простое или другие более расчётносложные.

Я окна заранее рассчитываю (в Матлабе), а потом в программу просто добавляю массив окна.

Цитата(Lmx2315 @ Aug 28 2018, 10:40) *
Но придётся пожертовать разрешением по частоте.

Разрешение по частоте определяется только количеством точек БПФ. upd. типа, предельное
Lmx2315
Цитата(ViKo @ Aug 28 2018, 10:45) *
Разрешение по частоте определяется только количеством точек БПФ.

..если у вас будет широкое окно , а две гармоники будут стоять рядом в пределах разрешения окна то вы их не отличите друг от друга, они сольются в одну гармонику.
Grizzzly
При использовании окна центральный лепесток будет расширяться, следовательно, разрешение должно ухудшаться.
ViKo
Ну, да, используя окно, хуже разрешение по частоте сделать можно, а лучше - уже нет. rolleyes.gif Вот амплитуду точнее померить окно поможет.
Роман
Цитата(ViKo @ Aug 28 2018, 10:38) *
Там должно быть сказано. Нулями добивают массив и делают БПФ уже не 1024 выборки, а, к примеру, 4096.
Или интерполировать результаты БПФ.
Всегда советую книгу Р. Лайонс "Цийфровая обработка сигналов". Доступна как для скачивания, так и для понимания.


Думал над этим, но у STM32 библиотека dsp fft может вычислить спектр до 1024 отсчетов максимум. Т.е. с ацп я максимум могу загрузить (2048 - половина из них комплексная часть - нули.) 1024 отсчетов.
Спасибо за книгу. Буду читать.

Цитата(ViKo @ Aug 28 2018, 10:45) *
Я окна заранее рассчитываю (в Матлабе), а потом в программу просто добавляю массив окна.

По расчетом окон где можно посмотреть, чтоб понятно было?
Aleksandr Baranov
Я бы на Вашем месте написал свою БПФ или воспользовался готовой из сети. Когда все теоретические вопросы будут решены, можно заняться оптимизациями с помощью библиотек.
https://www.dsprelated.com/freebooks/sasp/B...dow_Family.html
https://www.edn.com/electronics-news/438371...-Results-Part-I
Genadi Zawidowski
про то какие они бывают - с картинками в википедии, на dsplib - http://www.dsplib.ru/content/winex/winex.html

Простые примеры окон были в знаменитом примере FIRDsgn
V_G
Конкретно для измерения амплитуды используют flat top window. С другой стороны, обычное прямоугольное окно при ДПФ синусоидального сигнала порождает лес палок в районе основного тона, среднеквадратичная сумма которых и даст амплитуду
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.