|
FFT на STM32F407 |
|
|
|
Apr 17 2012, 05:15
|

Местный
  
Группа: Свой
Сообщений: 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); Вопрос к знающим. Правильно ли я делаю?
|
|
|
|
|
Apr 17 2012, 06:44
|
Гуру
     
Группа: Свой
Сообщений: 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 использовался потому, что так было удобнее при дальнейшей обработке, а времени на вычисления хватало.
|
|
|
|
|
Apr 17 2012, 08:37
|

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

|
Входной массив у вас задан как: Код float32_t f[2048] То есть данные приходящие из АЦП вы предварительно обрабатываете?
|
|
|
|
|
Apr 17 2012, 10:33
|
Гуру
     
Группа: Свой
Сообщений: 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) { ... } } Ну и так далее.
|
|
|
|
|
Apr 17 2012, 11:11
|

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

|
Именно так? Код arm_cmplx_mag_squared_f32(g, f, 2048); Судя по примерам там делается так: Код arm_cmplx_mag_squared_f32(f, g, 2048);
|
|
|
|
|
Apr 24 2012, 08:11
|

Местный
  
Группа: Свой
Сообщений: 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-ю. Как их найти?
|
|
|
|
|
Apr 24 2012, 09:59
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(011119xx @ Apr 24 2012, 13:43)  Думаю, что гармоники на известных частотах, но как пересчитать частоты в индексы массива Output[]? Почитайте про дискретное преобразование Фурье. Там шаг по частоте - это 1/T или что-то такое, где T - общее время оцифровки. Цитата(011119xx @ Apr 24 2012, 13:43)  И что делать если окажется, что гармоники на неизвестных частотах? Искать нужную частоту. Например, путём поиска в спектре компонент, превышающих заданный порог.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|