"""БПФ и ЭДС учебной последовательности.

Среда: встроенный MicroPython FEMM 5.
Аналитический учебный пример; полевой решатель не вызывается.
Параметры, единицы величин и порядок вывода пояснены по стадиям.
"""

import math
import numpy as np

# Равномерные отсчёты полного электрического периода без повторения конечной точки.
samples = 128
# Учебное потокосцепление, Вб: основная гармоника и пятая гармоника.
linkage = np.array(
    [
        0.08 * math.cos(2 * math.pi * k / samples)
        + 0.004 * math.cos(5 * 2 * math.pi * k / samples)
        for k in range(samples)
    ]
)
# Быстрое преобразование Фурье возвращает ненормированные комплексные коэффициенты.
coefficients = np.fft.fft(linkage)
# Нулевая гармоника делится на число отсчётов; положительные гармоники дополнительно умножаются на 2.
dc = coefficients[0].real / samples
amplitudes = [2 * abs(coefficients[h]) / samples for h in [1, 5]]
# Угловая частота основной гармоники, рад/с, при частоте 100 Гц.
omega = 2 * math.pi * 100
# Дифференцирование потокосцепления умножает гармонику на её порядок и угловую частоту.
# Деление на √2 преобразует амплитуду синусоидальной ЭДС в действующее значение.
emf_rms = [omega * h * amplitudes[j] / math.sqrt(2) for j, h in enumerate([1, 5])]
print("Среднее:", dc)
print("Амплитуды потокосцепления:", amplitudes)
print("Действующие ЭДС:", emf_rms)
# В эталоне единственная высшая гармоника — пятая; в реальных данных суммируют все учитываемые гармоники.
print("Коэффициент гармоник:", emf_rms[1] / emf_rms[0])
