# fasor_meten.py - amplitude en fase van 50 Hz uit bemonsterde spanning en stroom
import numpy as np

fs, f = 5000, 50.0                        # 5000 metingen per seconde, netfrequentie
t = np.arange(0, 0.2, 1 / fs)             # 0,2 s = precies tien periodes
w = 2 * np.pi * f
rng = np.random.default_rng(1)
u = 325.3 * np.cos(w * t) + rng.normal(0, 5.0, t.size)                    # spanning met ruis (V)
i = 5.70 * np.cos(w * t - np.radians(36)) + rng.normal(0, 0.1, t.size)    # stroom van de pomp (A)


def fasor(x):
    """Complexe amplitude: 2 * gemiddelde van x(t) * e^(-j w t) over hele periodes."""
    return 2 * np.mean(x * np.exp(-1j * w * t))


U, I = fasor(u), fasor(i)
for naam, X, eenheid in (("U", U, "V"), ("I", I, "A")):
    print("%s = %7.2f %s  hoek %6.2f graden" % (naam, abs(X), eenheid, np.degrees(np.angle(X))))
phi = np.angle(U) - np.angle(I)
print("faseverschil u - i: %.2f graden, cos phi = %.3f" % (np.degrees(phi), np.cos(phi)))
print("vermogen uit de fasoren  0,5 Re(U I*) = %.0f W" % (0.5 * (U * np.conj(I)).real))
print("vermogen uit de samples  gemiddelde(u i) = %.0f W" % np.mean(u * i))
