Doing THD calc
This commit is contained in:
111
fft_meas.py
111
fft_meas.py
@@ -5,7 +5,11 @@ import fft
|
||||
|
||||
class fft_meas(object):
|
||||
"""docstring for fft_meas"""
|
||||
# 61000-4-7 says 200ms
|
||||
# 10-cycles for 50Hz
|
||||
# 12-cycles for 60Hz
|
||||
def __init__(self, fs=50e3, tn=0.2):
|
||||
|
||||
self.fs = fs
|
||||
self.ts = 1/fs
|
||||
self.tn = tn
|
||||
@@ -19,25 +23,94 @@ class fft_meas(object):
|
||||
self.b = 0
|
||||
self.c = 0
|
||||
self.Y_C = 0
|
||||
|
||||
# 61000-4-7: 3.2.3
|
||||
# Upto the 40 Harmonic per 3.3.1 Note 2
|
||||
# Harmonic order
|
||||
self.Y_H = np.zeros(40)
|
||||
# 61000-4-7: 3.2.3
|
||||
# Upto the 40 Harmonic per 3.3.2 Note 2
|
||||
# Grouped Harmonic order
|
||||
self.Y_g = np.zeros(40)
|
||||
# 61000-4-7: 3.2.2
|
||||
self.h = np.zeros(40)
|
||||
|
||||
self.THD = 0
|
||||
self.THDG = 0
|
||||
|
||||
|
||||
self.phi = 0
|
||||
|
||||
def step(self, data, time, f_H1, unit):
|
||||
|
||||
if time - self.time > self.ts:
|
||||
self.time = time
|
||||
self.idx += 1
|
||||
|
||||
self.data[self.idx] = data
|
||||
|
||||
if self.idx == self.N-1:
|
||||
|
||||
|
||||
self.freq , self.a, self.b , self.c, self.Y_C, self.phi = fft.fft(x=self.data, fs=self.fs)
|
||||
|
||||
self.idx = -1
|
||||
self.base_freq = 0
|
||||
|
||||
|
||||
def step(self, y, base_freq, unit):
|
||||
|
||||
self.idx += 1
|
||||
|
||||
self.data[self.idx] = y
|
||||
|
||||
if self.idx == self.N-1:
|
||||
|
||||
self.freq , self.a, self.b , self.c, self.Y_C, self.phi = fft.fft(x=self.data, fs=self.fs)
|
||||
|
||||
self.calc_Y_H(base_freq)
|
||||
self.calc_THD()
|
||||
|
||||
self.calc_Y_g(base_freq)
|
||||
self.calc_THDG()
|
||||
|
||||
|
||||
|
||||
self.idx = -1
|
||||
|
||||
|
||||
def calc_Y_H(self, base_freq):
|
||||
# 61000-4-7: 3.2.3
|
||||
if np.abs(base_freq-50) < np.abs(base_freq-60):
|
||||
self.base_freq = 50
|
||||
else:
|
||||
self.base_freq = 60
|
||||
|
||||
if self.base_freq == 50:
|
||||
for k in range(len(self.Y_H)):
|
||||
self.Y_H[k] = self.Y_C[int(10*k)]
|
||||
self.h[k] = self.freq[int(10*k)]
|
||||
elif self.base_freq == 60:
|
||||
for k in range(len(self.Y_H)):
|
||||
self.Y_H[k] = self.Y_C[int(12*k)]
|
||||
self.h[k] = self.freq[int(12*k)]
|
||||
|
||||
def calc_THD(self):
|
||||
# 61000-4-7: 3.3.1
|
||||
self.THD = 0
|
||||
for k in range(2, len(self.Y_H)):
|
||||
self.THD += np.power(self.Y_H[k]/self.Y_H[1],2)
|
||||
self.THD = np.sqrt(self.THD)
|
||||
|
||||
def calc_Y_g(self, base_freq):
|
||||
# 61000-4-7: 3.2.4
|
||||
if np.abs(base_freq-50) < np.abs(base_freq-60):
|
||||
self.base_freq = 50
|
||||
else:
|
||||
self.base_freq = 60
|
||||
|
||||
if self.base_freq == 50:
|
||||
for k in range(len(self.Y_g)):
|
||||
self.Y_g[k] = self.Y_C[int(10*k)-1] + self.Y_C[int(10*k)] + self.Y_C[int(10*k)+1]
|
||||
self.h[k] = self.freq[int(10*k)]
|
||||
elif self.base_freq == 60:
|
||||
for k in range(len(self.Y_g)):
|
||||
self.Y_g[k] = self.Y_C[int(12*k)-1] + self.Y_C[int(12*k)] + self.Y_C[int(12*k)+1]
|
||||
self.h[k] = self.freq[int(12*k)]
|
||||
|
||||
def calc_THDG(self):
|
||||
# 61000-4-7: 3.3.1
|
||||
self.THDG = 0
|
||||
for k in range(2, len(self.Y_H)):
|
||||
self.THDG += np.power(self.Y_g[k]/self.Y_g[1],2)
|
||||
self.THDG = np.sqrt(self.THDG)
|
||||
print(self.THDG)
|
||||
|
||||
def plot(self):
|
||||
#fs, a, b, c, YC, phi = ftt.fft(Ph1, sample_freq)
|
||||
|
||||
@@ -47,3 +120,11 @@ class fft_meas(object):
|
||||
plt.title("Simple plot")
|
||||
plt.show()
|
||||
|
||||
def plot_Y_H(self):
|
||||
|
||||
plt.stem(self.h, self.Y_H, use_line_collection=True)
|
||||
plt.xlabel("Harmonic order h")
|
||||
plt.ylabel("RMS value Y_H,h")
|
||||
plt.title("Harmonic spectrum (IEC 61000-4-7: 3.2.3)")
|
||||
plt.grid(True)
|
||||
plt.show()
|
||||
Reference in New Issue
Block a user