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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> STM32 FFT (БПФ), Паление амплитуды сигнала
Роман
сообщение Aug 18 2018, 11:08
Сообщение #1





Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Lmx2315
сообщение Aug 18 2018, 13:04
Сообщение #2


отэц
*****

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



..при оцифровке сигнал теряет амплитуду пропорционально графику sin(x)/x , чем ближе к fсэмпл тем меньше.


--------------------
b4edbc0f854dda469460aa1aa a5ba2bd36cbe9d4bc8f92179f 8f3fec5d9da7f0
SHA-256
Go to the top of the page
 
+Quote Post
V_G
сообщение Aug 18 2018, 15:08
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Цитата(Lmx2315 @ Aug 18 2018, 23:04) *
..при оцифровке сигнал теряет амплитуду пропорционально графику sin(x)/x , чем ближе к fсэмпл тем меньше.

С какого перепугу? Амплитуду теряют образы из высших зон Найквиста. При частоте сигнала, меньшей половины частоты дискретизации, амплитуда меняться не должна. Искать глюк в программе
Go to the top of the page
 
+Quote Post
Самурай
сообщение Aug 18 2018, 15:42
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 468
Регистрация: 4-03-05
Пользователь №: 3 066



Цитата(Lmx2315 @ Aug 18 2018, 17:04) *
..при оцифровке сигнал теряет амплитуду пропорционально графику sin(x)/x , чем ближе к fсэмпл тем меньше.


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

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


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

И вопрос для ТС: что из себя представляет Ваш "цифровой генератор"? Можете показать осциллограммы, соответствующие трем Вашим рисункам со спектром?
Go to the top of the page
 
+Quote Post
Роман
сообщение Aug 18 2018, 15:58
Сообщение #5





Группа: Участник
Сообщений: 12
Регистрация: 14-08-11
Пользователь №: 66 719



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



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


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

еще я при получении данных с ацп сразу их нормализовывал и приводил к вольтам в тип float, после передавал в БПФ функцию. Но на выходе получаю какие то попугаи.

Сообщение отредактировал Роман - Aug 18 2018, 16:02
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Aug 18 2018, 16:17
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



У Вас не синусоида подается а сигнал переменной скважности?
Go to the top of the page
 
+Quote Post
Роман
сообщение Aug 18 2018, 16:34
Сообщение #7





Группа: Участник
Сообщений: 12
Регистрация: 14-08-11
Пользователь №: 66 719



Цитата(Genadi Zawidowski @ Aug 18 2018, 20:17) *
У Вас не синусоида подается а сигнал переменной скважности?


синус подаю с генератора. АЦП оцифровывает правильно.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Aug 18 2018, 17:04
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



FFT "не в ту сторону" ?
Подайте постоянный код вместо АЦП - должна появиться постоянная составляющая на нулевой частоте

Сообщение отредактировал Genadi Zawidowski - Aug 18 2018, 17:05
Go to the top of the page
 
+Quote Post
Роман
сообщение Aug 20 2018, 05:05
Сообщение #9





Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
ViKo
сообщение Aug 20 2018, 07:24
Сообщение #10


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Значит, проблема в рисовании спектра. Палки должны быть одинаковые.
Я бы предположил, что амплитуда сигнала теряется из-за фильтра на входе АЦП, но, похоже, нет.
Go to the top of the page
 
+Quote Post
Роман
сообщение Aug 20 2018, 07:51
Сообщение #11





Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
ViKo
сообщение Aug 20 2018, 08:12
Сообщение #12


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



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

А откуда берутся float32_t данные от АЦП? Их же преобразовать надо, а не к типу привести.
Go to the top of the page
 
+Quote Post
Роман
сообщение Aug 20 2018, 09:01
Сообщение #13





Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Роман
сообщение Aug 24 2018, 07:52
Сообщение #14





Группа: Участник
Сообщений: 12
Регистрация: 14-08-11
Пользователь №: 66 719



Теперь у меня слудующий вопрос. Запустил FFT с частотой дискр. АЦП 2048 Гц. Получаю 1024 выборки сигнала. Частотный диапазон сигнала на входе 500 - 1000 Гц. Получаю ряд амплитуд с частотами с шагом 2 Гц (511 точек) При отрисовке вижу, что если на вход ацп подать четное значение частоты, то амплитуда отрисовывается нормально, а если ytчетное, то амплитуда занижена на треть.

Сообщение отредактировал Роман - Aug 24 2018, 08:05
Go to the top of the page
 
+Quote Post
ViKo
сообщение Aug 24 2018, 08:48
Сообщение #15


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



http://ru.dsplib.org/content/spectral_leak...al_leakage.html
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 15th June 2025 - 11:28
Рейтинг@Mail.ru


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