FFT (Быстрое преобразование Фурье) на STM32F103C8T6

Проект Arduino, использующий алгоритм быстрого преобразования Фурье (FFT), предоставляет возможность анализировать аналоговые сигналы, определяя их частоты и амплитуды.

Ответить
tol123
Рядовой
Сообщения: 69
Зарегистрирован: 16.07.2021{, 11:34}
Репутация: 8
Имя: Anatoly

FFT (Быстрое преобразование Фурье) на STM32F103C8T6

#1

Сообщение tol123 » 02.05.2024{, 05:25}

Добавил библиотеку в пользовательский блок и в папки portable программы, librares, stm32 .. lib, вобщем везде, но пишет
ArduinoFFT.h: No such file or directory
в чем проблема не пойму. stm32 FFT.flp пример
Вложения
stm32 FFT.flp
(593.8 КБ) 6 скачиваний

Аватара пользователя
rw6cm
Полковник
Сообщения: 2297
Зарегистрирован: 06.09.2015{, 20:25}
Репутация: 342
Имя: Владимир

Тестирование версии 9.0.

#2

Сообщение rw6cm » 02.05.2024{, 07:54}

tol123 писал(а):
02.05.2024{, 05:25}
ArduinoFFT.h: No such file or directory
в чем проблема не пойму.
#include <arduinoFFT.h> - с маленькой буквы надо.
Но у вас там еще ошибки:
объявили выход кириллицей,
если версия либ 2x то клас тоже по другому надо.
В общем смотрите API
Win10-64, FLProg (portable)

tol123
Рядовой
Сообщения: 69
Зарегистрирован: 16.07.2021{, 11:34}
Репутация: 8
Имя: Anatoly

FFT (Быстрое преобразование Фурье) на STM32F103C8T6

#3

Сообщение tol123 » 08.05.2024{, 05:58}

Проект Arduino, использующий алгоритм быстрого преобразования Фурье (FFT), предоставляет возможность анализировать аналоговые сигналы, определяя их частоты и амплитуды.

FFT (Быстрое преобразование Фурье): Это алгоритм, который анализирует временные сигналы и разбивает их на составляющие частоты. Он широко применяется для анализа частотного содержания сигналов и находит применение в различных областях, включая обработку сигналов, аудиообработку, медицинскую диагностику и др.

Частота дискретизации (Sampling frequency): Это количество сэмплов сигнала, собранных за единицу времени. Она определяет частоту, с которой аналоговый сигнал преобразуется в цифровой формат. Чем выше частота дискретизации, тем более подробно и точно мы можем анализировать сигнал.

Сэмплы (Samples): Это отдельные значения аналогового сигнала, собранные в течение определенного временного интервала. Количество сэмплов определяет разрешение анализа сигнала: чем больше сэмплов, тем выше разрешение и точность анализа.

В данном проекте микроконтроллер STM32F103C8T6 снимает аналоговый сигнал с помощью аналогового входа A0. Затем алгоритм FFT используется для анализа этого сигнала. Частота дискретизации установлена на 400 Гц, что обеспечивает адекватное представление о частотном содержании сигнала.

Количество сэмплов установлено на 1024, обеспечивая высокое разрешение анализа. Это позволяет детально изучать частотный спектр сигнала с высокой точностью.

Результаты анализа, включая максимальную обнаруженную частоту и амплитуды на различных частотах, выводятся через UART на ножки A9 и A10 микроконтроллера. Это предоставляет пользователю данные для дальнейшего анализа или визуализации на внешних устройствах.

Для дополнительного функционала в проекте использовался датчик напряжения ZMPT, подключенный к сети 220 Вольт. Этот датчик позволяет анализировать частотное содержание напряжения в электрической сети и мониторить ее качество и стабильность.

Уменьшение количества сэмплов ускоряет выполнение преобразования Фурье за счет снижения объема вычислений. Однако это может привести к потере точности анализа, поэтому при выборе количества сэмплов необходимо учитывать баланс между скоростью выполнения и точностью результатов в соответствии с требованиями конкретного приложения.
Вложения
fft_stm32_f103c8t6.ino
(2.57 КБ) 19 скачиваний
fft stm32 f103c8t6.png

aidar_i
Полковник
Сообщения: 3157
Зарегистрирован: 24.12.2016{, 16:55}
Репутация: 689
Откуда: Уфа
Имя: Айдар
Контактная информация:

FFT (Быстрое преобразование Фурье) на STM32F103C8T6

#4

Сообщение aidar_i » 08.05.2024{, 07:14}

А где сам проект в FLProg?

tol123
Рядовой
Сообщения: 69
Зарегистрирован: 16.07.2021{, 11:34}
Репутация: 8
Имя: Anatoly

FFT (Быстрое преобразование Фурье) на STM32F103C8T6

#5

Сообщение tol123 » 08.05.2024{, 13:53}

Здравствуйте. Для реализации моего проекта в FLProg мне потребуются знания о создании пользовательских блоков. Однако, материалов, по которым я мог бы изучить это мало. Скорее всего, не будет проекта в нем.

aidar_i
Полковник
Сообщения: 3157
Зарегистрирован: 24.12.2016{, 16:55}
Репутация: 689
Откуда: Уфа
Имя: Айдар
Контактная информация:

FFT (Быстрое преобразование Фурье) на STM32F103C8T6

#6

Сообщение aidar_i » 08.05.2024{, 14:56}

У Вас скетч создан в стиле FLProg , я думал, что создавали на нем проект.

tol123
Рядовой
Сообщения: 69
Зарегистрирован: 16.07.2021{, 11:34}
Репутация: 8
Имя: Anatoly

FFT (Быстрое преобразование Фурье) на STM32F103C8T6

#7

Сообщение tol123 » 12.05.2024{, 05:04}

Добавлю блок пользователя, не рабочий в случае того что кто-то заинтересуется им и подскажет что не так. Пока что не могу завершить блок пользователя из-за того что не получается выводить значения.
Вложения
stm32 FFT.flp
Проект в стадии разработки
(131.92 КБ) 7 скачиваний
arduinoFFT-2.0.2.zip
Библиотека проекта
(35.55 КБ) 5 скачиваний

Аватара пользователя
rw6cm
Полковник
Сообщения: 2297
Зарегистрирован: 06.09.2015{, 20:25}
Репутация: 342
Имя: Владимир

FFT (Быстрое преобразование Фурье) на STM32F103C8T6

#8

Сообщение rw6cm » 12.05.2024{, 07:32}

tol123,
tol123 писал(а):
12.05.2024{, 05:04}
Добавлю блок пользователя, не рабочий
В вашем проекте нет ПБ.
Делайте проекты в релизе (например флп 8.2.3)
Не все здесь бета-тестеры.
Win10-64, FLProg (portable)

tol123
Рядовой
Сообщения: 69
Зарегистрирован: 16.07.2021{, 11:34}
Репутация: 8
Имя: Anatoly

FFT (Быстрое преобразование Фурье) на STM32F103C8T6

#9

Сообщение tol123 » 13.05.2024{, 14:57}

Исправил. Версия Flprog 9.0.0
Вложения
test fft.flp
(469.38 КБ) 4 скачивания
arduinoFFT_(Code_-_Professional).ubi
(239.68 КБ) 2 скачивания

tol123
Рядовой
Сообщения: 69
Зарегистрирован: 16.07.2021{, 11:34}
Репутация: 8
Имя: Anatoly

FFT (Быстрое преобразование Фурье) на STM32F103C8T6

#10

Сообщение tol123 » 17.05.2024{, 06:54}

Поправил блок пользователя, пока что возможности проверить нету. Думаю должно работать проверю позже. Проверил не работает.
Вложения
test fft 2_124646.flp
(464.12 КБ) 5 скачиваний
Последний раз редактировалось tol123 18.05.2024{, 05:42}, всего редактировалось 1 раз.

tol123
Рядовой
Сообщения: 69
Зарегистрирован: 16.07.2021{, 11:34}
Репутация: 8
Имя: Anatoly

FFT (Быстрое преобразование Фурье) на STM32F103C8T6

#11

Сообщение tol123 » 18.05.2024{, 05:41}

в этой версии majorPeak выводит, а другое нет.
это код рабочий и должен выводить что то типа:
СпойлерПоказать
488.28Hz 115.24
492.19Hz 272.67
496.09Hz 329.76
50.88

Код: Выделить всё

#include "flprogUtilites.h"
#include "arduinoFFT.h"
#include "flprogUart.h"

FlprogUartExecutor FLProgUart;
#define FLPROG_UART_EXECUTOR FLProgUart

String Out_117014878_222076267;
String Out_36260122_222076267;
float Out_51940551_222076267;
String _stou3;

const int samples_222076267 = 256;
const int samplingFrequency_222076267 = 1000UL;
unsigned int sampling_period_us_222076267;
unsigned long microseconds_222076267;

float vReal_222076267[samples_222076267];
float vImag_222076267[samples_222076267];

ArduinoFFT<float> FFT_222076267 = ArduinoFFT<float>(vReal_222076267, vImag_222076267, samples_222076267, samplingFrequency_222076267);

void setup() {
    FLProgUart.setSpeedUart(115200, 1);
    FLProgUart.setDataBitUart(8, 1);
    FLProgUart.setParityUart(0, 1);
    FLProgUart.setStopBitUart(1, 1);
    sampling_period_us_222076267 = round(1000000 * (1.0 / samplingFrequency_222076267));
}

void loop() {
    microseconds_222076267 = micros();
    for (uint16_t i = 0; i < samples_222076267; i++) {
        vReal_222076267[i] = analogRead(A0); // заменить A0 на нужный канал
        vImag_222076267[i] = 0;
        while (micros() - microseconds_222076267 < sampling_period_us_222076267) {
        }
        microseconds_222076267 += sampling_period_us_222076267;
    }

    FFT_222076267.compute(FFTDirection::Forward);
    FFT_222076267.complexToMagnitude();

    for (uint16_t i = 0; i < (samples_222076267 >> 1); i++) {
        Out_51940551_222076267 = ((i * 1.0 * samplingFrequency_222076267) / samples_222076267);
        FLProgUart.printUart(String(Out_51940551_222076267), 1);
        FLProgUart.printUart("Hz  ", 1);
        FLProgUart.printUart(String(vReal_222076267[i]), 1);
        FLProgUart.printUart("\r\n", 1);
    }

    Out_117014878_222076267 = String(FFT_222076267.majorPeak());
    FLProgUart.printUart(Out_117014878_222076267, 1);
    FLProgUart.printUart("\r\n", 1);
    delay(1000);

    if (Out_36260122_222076267 != _stou3) {
        FLProgUart.printUart(Out_36260122_222076267, 1);
        FLProgUart.printUart("\r\n", 1);
        _stou3 = Out_36260122_222076267;
    }
}
вот рабочий код. проблема может с тем как выводится массив и варианты его вывода в юарт. И как в блоке его оформить. пробовал выводить в конец секции loop - больше ошибок получается
мой блок дает только 50.88 а массив не выводит. цифры отдельные выводит неправильные.
Вложения
test fft 4.flp
(496.91 КБ) 2 скачивания

Ответить

Вернуться в «Проекты различных устройств на STM32»