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

Ответить
tol123
Рядовой
Сообщения: 79
Зарегистрирован: 16 июл 2021, 11:34
Имя: Anatoly
Поблагодарили: 2 раза

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

Сообщение tol123 »

Описание: Алгоритм быстрого преобразования Фурье (FFT Fast Fourier Transform).
Библиотека: arduinoFFT
Назначение:Преобразует сигнал из временной области в частотную область.
Выявляет частоты, присутствующие в сигнале, и их амплитуды.

1. analogPin аналоговыйPin
Описание: Аналоговый вход микроконтроллера, с которого считываются данные.
Назначение: Считывает аналоговый сигнал (напряжение) с указанного пина и преобразует его в цифровое значение (ADC - Analog-to-Digital Converter).
Диапазон значений: Зависит от разрядности АЦП (в данном случае 12 бит для stm32f103c8t6, диапазон: 0–4095).
Пример:0 → 0 В, 2048 → 1.65 В (при опорном напряжении 3.3 В), 4095 → 3.3 В.

2. samples образцы
Описание: Количество отсчётов (выборок) сигнала, которые используются для анализа.
Использование в коде: 1024;
Назначение: Указывает, сколько точек будет использоваться для вычисления FFT (быстрого преобразования Фурье).
Влияние: Увеличение samples повышает точность спектрального анализа.
Большие значения требуют больше памяти и времени обработки.
Пример: 256, 512, 1024 – типичные значения.

3. SamplingFrequency
Описание: Частота дискретизации сигнала.
Назначение: Определяет, с какой частотой будут собираться отсчёты с аналогового входа.
Единица измерения: Гц (герцы).
Закон Найквиста: Частота дискретизации должна быть как минимум вдвое выше максимальной частоты исследуемого сигнала.
Пример:2048 Гц позволяет анализировать сигнал с максимальной частотой до 1024 Гц.

4. referenceVoltage
Описание: Опорное напряжение АЦП (Analog-to-Digital Converter).
Использование в коде: (3.3)
Назначение: Определяет максимальное значение входного аналогового сигнала, которое может быть измерено АЦП.
Пример:
Если опорное напряжение 3.3 В и разрядность АЦП 12 бит, то:
0 → 0 В
4095 → 3.3 В

5. Frequency Частота
Описание: Частота, соответствующая каждому измерению величин после выполнения БПФ.

6. Amplitude Амплитуда
Описание: Амплитуда сигнала для каждого такта после БПФ
Назначение: Показывает расширение на каждой частоте после преобразования Фурье.
Единица измерения: Напряжение (В).

7. RMS (Root Mean Square — Среднеквадратичное значение) RMS (среднеквадратичное значение):
Назначение: Показывает эффективное значение переменного сигнала.
Особенно полезно для измерения мощности синусоидального сигнала.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось tol123 07 янв 2025, 15:14, всего редактировалось 2 раза.
Аватара пользователя
rw6cm
Полковник
Сообщения: 2372
Зарегистрирован: 06 сен 2015, 20:25
Имя: Владимир
Поблагодарили: 41 раз

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

Сообщение rw6cm »

tol123 писал(а): 02 май 2024, 05:25 ArduinoFFT.h: No such file or directory
в чем проблема не пойму.
#include <arduinoFFT.h> - с маленькой буквы надо.
Но у вас там еще ошибки:
объявили выход кириллицей,
если версия либ 2x то клас тоже по другому надо.
В общем смотрите API
Win10-64, FLProg (portable)
tol123
Рядовой
Сообщения: 79
Зарегистрирован: 16 июл 2021, 11:34
Имя: Anatoly
Поблагодарили: 2 раза

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

Сообщение tol123 »

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

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

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

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

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

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

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

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

Уменьшение количества сэмплов ускоряет выполнение преобразования Фурье за счет снижения объема вычислений. Однако это может привести к потере точности анализа, поэтому при выборе количества сэмплов необходимо учитывать баланс между скоростью выполнения и точностью результатов в соответствии с требованиями конкретного приложения.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
aidar_i
Полковник
Сообщения: 3357
Зарегистрирован: 24 дек 2016, 16:55
Откуда: Уфа
Имя: Айдар
Благодарил (а): 12 раз
Поблагодарили: 100 раз
Контактная информация:

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

Сообщение aidar_i »

А где сам проект в FLProg?
tol123
Рядовой
Сообщения: 79
Зарегистрирован: 16 июл 2021, 11:34
Имя: Anatoly
Поблагодарили: 2 раза

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

Сообщение tol123 »

Здравствуйте. Для реализации моего проекта в FLProg мне потребуются знания о создании пользовательских блоков. Однако, материалов, по которым я мог бы изучить это мало. Скорее всего, не будет проекта в нем.
aidar_i
Полковник
Сообщения: 3357
Зарегистрирован: 24 дек 2016, 16:55
Откуда: Уфа
Имя: Айдар
Благодарил (а): 12 раз
Поблагодарили: 100 раз
Контактная информация:

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

Сообщение aidar_i »

У Вас скетч создан в стиле FLProg , я думал, что создавали на нем проект.
tol123
Рядовой
Сообщения: 79
Зарегистрирован: 16 июл 2021, 11:34
Имя: Anatoly
Поблагодарили: 2 раза

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

Сообщение tol123 »

Добавлю блок пользователя, не рабочий в случае того что кто-то заинтересуется им и подскажет что не так. Пока что не могу завершить блок пользователя из-за того что не получается выводить значения.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
rw6cm
Полковник
Сообщения: 2372
Зарегистрирован: 06 сен 2015, 20:25
Имя: Владимир
Поблагодарили: 41 раз

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

Сообщение rw6cm »

[ref]tol123[/ref],
tol123 писал(а): 12 май 2024, 05:04 Добавлю блок пользователя, не рабочий
В вашем проекте нет ПБ.
Делайте проекты в релизе (например флп 8.2.3)
Не все здесь бета-тестеры.
Win10-64, FLProg (portable)
tol123
Рядовой
Сообщения: 79
Зарегистрирован: 16 июл 2021, 11:34
Имя: Anatoly
Поблагодарили: 2 раза

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

Сообщение tol123 »

Исправил. Версия Flprog 9.0.0
У вас нет необходимых прав для просмотра вложений в этом сообщении.
tol123
Рядовой
Сообщения: 79
Зарегистрирован: 16 июл 2021, 11:34
Имя: Anatoly
Поблагодарили: 2 раза

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

Сообщение tol123 »

Поправил блок пользователя, пока что возможности проверить нету. Думаю должно работать проверю позже. Проверил не работает.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось tol123 18 май 2024, 05:42, всего редактировалось 1 раз.
tol123
Рядовой
Сообщения: 79
Зарегистрирован: 16 июл 2021, 11:34
Имя: Anatoly
Поблагодарили: 2 раза

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

Сообщение tol123 »

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

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

#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 а массив не выводит. цифры отдельные выводит неправильные.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
tol123
Рядовой
Сообщения: 79
Зарегистрирован: 16 июл 2021, 11:34
Имя: Anatoly
Поблагодарили: 2 раза

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

Сообщение tol123 »

Обновил в шапке FFT stm32.flp и Быстрое_преобразование_Фурье_(Code_-_Professional).ubi.
Работает для версии программы 9.0 для stm32а103c8t6. На ардуино не проверял.

Добавил:
8. Fundamental Frequency (основная частота):
Основная частота остается стабильной на уровне 50 Гц,
что соответствует частоте электросети. Если бы была значительная
гармоническая искаженность, частота могла бы изменяться.

Добавил:
9.FFT stm32 добавлен Index массива
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Ответить

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

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость