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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> FFT на STM32F407
011119xx
сообщение Apr 17 2012, 05:15
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Перешел на STM32F407, соответственно хочу использовать функции FFT, которые идут с STM32F4xx_DSP_StdPeriph_Lib_V1.0.0. В качестве входных данных использую массив 16-ти битных данных, полученных с АЦП. Судя по всему лучше использовать Real FFT Functions http://tech.munts.com/MCU/Frameworks/AR ... f_f_t.html Но вот каким образом мне не совсем понятно. Смотрел пример, но там вариант для Complex FFT Functions. По подобию примера делаю так:
Код
int16_t analysis_arr[512];      //данные с АЦП
int16_t spec_ana_arr[1024];    

arm_status status;
arm_rfft_instance_q15 S;
arm_cfft_radix4_instance_q15 S_CFFT;
  
status = ARM_MATH_SUCCESS;

/* Initialize the RFFT/RIFFT module */
status = arm_rfft_init_q15(&S, &S_CFFT, 512, 0, 0);

/* Process the data through the RFFT/RIFFT module */
arm_rfft_q15(&S, analysis_arr, spec_ana_arr);

Вопрос к знающим. Правильно ли я делаю?
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 17 2012, 06:00
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Видимо да, правильно.
Вот реальный работающий пример:
Код
arm_rfft_instance_f32 rffti;
arm_cfft_radix4_instance_f32 cffti;
arm_rfft_init_f32(&rffti, &cffti, 2048, 0, 1);
arm_rfft_f32(&rffti, f, g);

Go to the top of the page
 
+Quote Post
011119xx
сообщение Apr 17 2012, 06:23
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Какого размера у вас массивы f и g? Для чего нужно чтобы bitReverseFlag = 1? Можете пояснить почему используется arm_rfft_f32, а не arm_rfft_q31, например?
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 17 2012, 06:44
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(011119xx @ Apr 17 2012, 10:23) *
Какого размера у вас массивы f и g? Для чего нужно чтобы bitReverseFlag = 1? Можете пояснить почему используется arm_rfft_f32, а не arm_rfft_q31, например?

Да забыл:
Код
float32_t f[2048], g[4096];

Про bit reversal немного поискал: по-видимому, на выходе FFT естественным образом получается результат, в котором биты идут в обратном порядке, а с флагом bitReverseFlag = 1 порядок битов снова становится нормальным. Могу и ошибаться, конечно, но работало только так (вывод спектра на график).
Ну а float использовался потому, что так было удобнее при дальнейшей обработке, а времени на вычисления хватало.
Go to the top of the page
 
+Quote Post
011119xx
сообщение Apr 17 2012, 06:51
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Спасибо.
Go to the top of the page
 
+Quote Post
011119xx
сообщение Apr 17 2012, 08:37
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Входной массив у вас задан как:
Код
float32_t f[2048]

То есть данные приходящие из АЦП вы предварительно обрабатываете?
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 17 2012, 08:50
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(011119xx @ Apr 17 2012, 12:37) *
То есть данные приходящие из АЦП вы предварительно обрабатываете?

Да.
Код
arm_q15_to_float(adc_data, f, 2048);

Go to the top of the page
 
+Quote Post
011119xx
сообщение Apr 17 2012, 09:31
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



После FFT надо полагать используете обратное преобразование arm_float_to_q15?
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 17 2012, 10:33
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(011119xx @ Apr 17 2012, 13:31) *
После FFT надо полагать используете обратное преобразование arm_float_to_q15?

Нет. Далее так:
Код
arm_cmplx_mag_squared_f32(g, f, 2048);

Это для получения спектра. Потом поиск пиков в спектре:
Код
for (i = 10; i < 500; i++)
{
        if (f[i] > 30.0f)
        {
                ...
        }
}

Ну и так далее.
Go to the top of the page
 
+Quote Post
011119xx
сообщение Apr 17 2012, 11:11
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Именно так?
Код
arm_cmplx_mag_squared_f32(g, f, 2048);

Судя по примерам там делается так:
Код
arm_cmplx_mag_squared_f32(f, g, 2048);
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 17 2012, 11:23
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Уже началось переливание из пустого в порожнее, как мне кажется.
Для справки я использую документацию (в формате HTML), которая шла вместе с CMSIS DSP Library, которая, в свою очередь, установилась при установке ЯРа. Там всё написано.
CMSIS можно скачать отдельно.
Go to the top of the page
 
+Quote Post
011119xx
сообщение Apr 24 2012, 08:11
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



В общем запутался в спектральном анализе. Собственно говоря, делаю так:
Код
float32_t analysis_arr[512];      //данные с АЦП
float32_t spec_ana_arr[1024];
float32_t Output[512];    

arm_status status;
arm_rfft_instance_f32 S;
arm_cfft_radix4_instance_f32 S_CFFT;
  
status = ARM_MATH_SUCCESS;

/* Initialize the RFFT/RIFFT module */
status = arm_rfft_init_f32(&S, &S_CFFT, 512, 0, 1);

/* Process the data through the RFFT/RIFFT module */
arm_rfft_f32(&S, analysis_arr, spec_ana_arr);

arm_cmplx_mag_f32(spec_ana_arr, Output, 512);

Правильно ли я понял, что массив Output содержит амплитуды гармоник? Мне нужно получить амплитуды гармоник с 1-й по 5-ю. Как их найти?
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 24 2012, 09:12
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(011119xx @ Apr 24 2012, 12:11) *
Правильно ли я понял, что массив Output содержит амплитуды гармоник? Мне нужно получить амплитуды гармоник с 1-й по 5-ю. Как их найти?

Похоже, что так.
Ну а гармоники находятся на известных частотах? Если так, то пересчитываем частоты в индексы массива Output[] и смотрим соответствующие элементы.
Для отладки необходимо выводить на график весь спектр, чтобы убедиться, что он выглядит как ожидается, и отловить все глупые ошибки.
Go to the top of the page
 
+Quote Post
011119xx
сообщение Apr 24 2012, 09:43
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Цитата(scifi @ Apr 24 2012, 14:12) *
Ну а гармоники находятся на известных частотах? Если так, то пересчитываем частоты в индексы массива Output[] и смотрим соответствующие элементы.

Думаю, что гармоники на известных частотах, но как пересчитать частоты в индексы массива Output[]? И что делать если окажется, что гармоники на неизвестных частотах?
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 24 2012, 09:59
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(011119xx @ Apr 24 2012, 13:43) *
Думаю, что гармоники на известных частотах, но как пересчитать частоты в индексы массива Output[]?

Почитайте про дискретное преобразование Фурье. Там шаг по частоте - это 1/T или что-то такое, где T - общее время оцифровки.

Цитата(011119xx @ Apr 24 2012, 13:43) *
И что делать если окажется, что гармоники на неизвестных частотах?

Искать нужную частоту. Например, путём поиска в спектре компонент, превышающих заданный порог.
Go to the top of the page
 
+Quote Post

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

 


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


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