|
STM32 FFT (БПФ), Паление амплитуды сигнала |
|
|
|
Aug 18 2018, 11:08
|
Группа: Участник
Сообщений: 12
Регистрация: 14-08-11
Пользователь №: 66 719

|
Всем добрый день! Недавно начал знакомство с библиотекой fft для DSP ядра arm_cfft_radix4_f32 STM32F3 и его АЦП соответственно. Поглядел пример, решил запустить свою программку которая берет сигнал с АЦП и выдает график спектра сигнала. Сперва просто попробовал выдавать осциллограмму, с чем успешно справился, все правильно измеряет. Параметры для получения спектра следующие. На вход ацп подаю сигнал от 0 до 1000 Гц с цифрового генератора. Сигнал смещен в положительную сторону, изменяется от 0 до 3 вольта. Амплитуда сигнала постоянная. Вход АЦП пока напрямую подключен к выходу генератора витой парой. Частота выборки АЦП задается по таймеру - 2048 Гц далее через DMA все кладу в буфер. Получаю 2048 отсчетов на канал. Sample rate на канал АЦП - 7,5 циклов. Количество отсчетов БПФ - 1024 дискретность 1 герц Но графике (рис) разложения сигнала в спектр наблюдаю, что с ростом частоты (при постоянной амплитуде) сигнала на графике спектра амплитуда падает с некоторой зависимостью и после.  (С матаном и теорией по БПФ не дружу особо только поверхностно, заранее прошу прощения за что-то глупое.) В чем моя ошибка?
Сообщение отредактировал Роман - Aug 18 2018, 11:09
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 26)
|
Aug 18 2018, 15:42
|
Местный
  
Группа: Участник
Сообщений: 468
Регистрация: 4-03-05
Пользователь №: 3 066

|
Цитата(Lmx2315 @ Aug 18 2018, 17:04)  ..при оцифровке сигнал теряет амплитуду пропорционально графику sin(x)/x , чем ближе к fсэмпл тем меньше. Только не при оцифровке, а при обратном процессе, а так все верно  )) Цитата(V_G @ Aug 18 2018, 19:08)  С какого перепугу? Амплитуду теряют образы из высших зон при несоблюдении теоремы Котельникова. При частоте сигнала, меньшей половины частоты дискретизации, амплитуда меняться не должна. Искать глюк в программе Вот и мне интересно, с какого это перепугу теряется амплитуда образов из высших зон при несоблюдении теоремы Котельникова??? Мы все еще про АЦП говорим? Или Вы так образно назвали ослабление сигнала на пару дБ в пределах полосы пропускания АЦП, которая, к слову, обычно в разы больше максимальной частоты дискретизации? И вопрос для ТС: что из себя представляет Ваш "цифровой генератор"? Можете показать осциллограммы, соответствующие трем Вашим рисункам со спектром?
|
|
|
|
|
Aug 18 2018, 15:58
|
Группа: Участник
Сообщений: 12
Регистрация: 14-08-11
Пользователь №: 66 719

|
Цитата(Самурай @ Aug 18 2018, 19:42)  И вопрос для ТС: что из себя представляет Ваш "цифровой генератор"? Можете показать осциллограммы, соответствующие трем Вашим рисункам со спектром? Генератор такой, только модель немного другая Сейчас показать осциллограммы не могу. В ПН могу снять повторно, перепроверить. Но вчера, когда тестировал, снимал синус и выводил его на комп, амплитуда оставалась такой же, как задано на генераторе сигналов во всей полосе 0 - 1 кГц (АЦП вроде как боле 5 MSPS хватит за глаза для такой частоты). Падение амплитуды от частоты происходит после БПФ. еще я при получении данных с ацп сразу их нормализовывал и приводил к вольтам в тип float, после передавал в БПФ функцию. Но на выходе получаю какие то попугаи.
Сообщение отредактировал Роман - Aug 18 2018, 16:02
|
|
|
|
|
Aug 18 2018, 16:34
|
Группа: Участник
Сообщений: 12
Регистрация: 14-08-11
Пользователь №: 66 719

|
Цитата(Genadi Zawidowski @ Aug 18 2018, 20:17)  У Вас не синусоида подается а сигнал переменной скважности? синус подаю с генератора. АЦП оцифровывает правильно.
|
|
|
|
|
Aug 20 2018, 05:05
|
Группа: Участник
Сообщений: 12
Регистрация: 14-08-11
Пользователь №: 66 719

|
Цитата(Genadi Zawidowski @ Aug 18 2018, 20:04)  FFT "не в ту сторону" ? Подайте постоянный код вместо АЦП - должна появиться постоянная составляющая на нулевой частоте Пост сост-ая есть слева, но плохо отрисовывается, она 720 единиц (попугаев). Сегодня переделал немного, отображаю спектр с зеркальной частью от 0 до 512 Гц. Частоты 100, 300, 400 Гц. На 500 гц сходится в один спектр в зеркальной части получаю такую картину  Далее с графиком синус. сигнала, оцифрованный АЦП его гармоники. 10 Гц, 100 и 300 Гц. Амплитуда синусоиды постоянная, при переводе в вольты все точно получается.
Суммирование частот 10 и 200 гц
Сообщение отредактировал Роман - Aug 20 2018, 06:18
|
|
|
|
|
Aug 20 2018, 07:51
|
Группа: Участник
Сообщений: 12
Регистрация: 14-08-11
Пользователь №: 66 719

|
Цитата(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 что основная гармоника и ее зеркальное отображение имеют разные значения.
Сообщение отредактировал Роман - Aug 20 2018, 08:07
|
|
|
|
|
Aug 20 2018, 09:01
|
Группа: Участник
Сообщений: 12
Регистрация: 14-08-11
Пользователь №: 66 719

|
Цитата(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 раза меньше. так и должно быть?
Сообщение отредактировал Роман - Aug 20 2018, 10:12
|
|
|
|
|
Aug 24 2018, 07:52
|
Группа: Участник
Сообщений: 12
Регистрация: 14-08-11
Пользователь №: 66 719

|
Теперь у меня слудующий вопрос. Запустил FFT с частотой дискр. АЦП 2048 Гц. Получаю 1024 выборки сигнала. Частотный диапазон сигнала на входе 500 - 1000 Гц. Получаю ряд амплитуд с частотами с шагом 2 Гц (511 точек) При отрисовке вижу, что если на вход ацп подать четное значение частоты, то амплитуда отрисовывается нормально, а если ytчетное, то амплитуда занижена на треть.
Сообщение отредактировал Роман - Aug 24 2018, 08:05
|
|
|
|
|
Aug 28 2018, 06:52
|
Группа: Участник
Сообщений: 12
Регистрация: 14-08-11
Пользователь №: 66 719

|
Цитата(ViKo @ Aug 24 2018, 11:48)  Как с этим правильно бороться? Почему после преобразования амплитуды сигнала занижены в 2 раза, хотя DC составляющая показывается правильно7
|
|
|
|
|
Aug 28 2018, 07:40
|

отэц
    
Группа: Свой
Сообщений: 1 729
Регистрация: 18-09-05
Из: Москва
Пользователь №: 8 684

|
Цитата(Роман @ Aug 28 2018, 09:52)  Как с этим правильно бороться? Почему после преобразования амплитуды сигнала занижены в 2 раза, хотя DC составляющая показывается правильно7 по умолчанию применяется прямоугольное окно, а надо наложить другое окно на входные данные БПФ, которое ограничит растекание спектра - треугольное как самое простое или другие, более расчётносложные. Но придётся пожертовать разрешением по частоте.
--------------------
b4edbc0f854dda469460aa1aa a5ba2bd36cbe9d4bc8f92179f 8f3fec5d9da7f0 SHA-256
|
|
|
|
|
Aug 28 2018, 11:24
|
Группа: Участник
Сообщений: 12
Регистрация: 14-08-11
Пользователь №: 66 719

|
Цитата(ViKo @ Aug 28 2018, 10:38)  Там должно быть сказано. Нулями добивают массив и делают БПФ уже не 1024 выборки, а, к примеру, 4096. Или интерполировать результаты БПФ. Всегда советую книгу Р. Лайонс "Цийфровая обработка сигналов". Доступна как для скачивания, так и для понимания. Думал над этим, но у STM32 библиотека dsp fft может вычислить спектр до 1024 отсчетов максимум. Т.е. с ацп я максимум могу загрузить (2048 - половина из них комплексная часть - нули.) 1024 отсчетов. Спасибо за книгу. Буду читать. Цитата(ViKo @ Aug 28 2018, 10:45)  Я окна заранее рассчитываю (в Матлабе), а потом в программу просто добавляю массив окна. По расчетом окон где можно посмотреть, чтоб понятно было?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|