From d1b4e641c341be28b98f3f738c9875db84bde628 Mon Sep 17 00:00:00 2001 From: Michelle Date: Sun, 25 Jan 2026 17:48:45 +0100 Subject: [PATCH] Doing THD calc --- __pycache__/fft.cpython-312.pyc | Bin 2311 -> 2311 bytes __pycache__/fft_meas.cpython-312.pyc | Bin 2356 -> 7130 bytes .../fundamental_freq_meas.cpython-312.pyc | Bin 0 -> 2190 bytes __pycache__/measurements.cpython-312.pyc | Bin 0 -> 2253 bytes __pycache__/zerocross_meas.cpython-312.pyc | Bin 2151 -> 1109 bytes fft_meas.py | 111 +++++++++++++++--- fundamental_freq_meas.py | 51 ++++++++ main.py | 26 ++-- measurements.py | 58 +++++++++ zerocross_meas.py | 36 ++---- 10 files changed, 233 insertions(+), 49 deletions(-) create mode 100644 __pycache__/fundamental_freq_meas.cpython-312.pyc create mode 100644 __pycache__/measurements.cpython-312.pyc create mode 100644 fundamental_freq_meas.py create mode 100644 measurements.py diff --git a/__pycache__/fft.cpython-312.pyc b/__pycache__/fft.cpython-312.pyc index 7352838d2c23d12f212937f4062ba033ab148756..457f2263c42d99fd66ce10d3536de6581d0b4e24 100644 GIT binary patch delta 20 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 diff --git a/__pycache__/fundamental_freq_meas.cpython-312.pyc b/__pycache__/fundamental_freq_meas.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..129b1d46692cbddd8c0c2dfe0902cd453f71be5d GIT binary patch literal 2190 zcmb7F%}*Ow5P$pOj~HWYz?iQPt1_aSgDq9G2sJ{DY88=6T!<9KsxgH( zWk%qy5Ul4qTb-Hhg7zFN8bo$LlYS^Mcoo=1Z!SEy}8qRm41% zcg3Qd)hiQ{meUPdP&eawjmGnN!`aVujXNgL5aRatj-e`3C8EQ?NdmOxqW+>XL<$5xRjC6;Dl*k_RMT}arI+tI_)t3DJlZ^3>%h)#Xata8jf8>RwPKUC z#05KUMJJGsT2s?VCoV(C7A{fvKxl(n@=h_}<(y*p1;W~Z6o1VONSZat=IV`oO{NOUY!4J?~#S?>kgwm^k z8*djVNV;X#_fTTD-v`ekz;z3>&xP}D5j#;Dq=D;3#J&HGx?Bq&(Kq6*U^nCfcd`8i z`1dXF2HEBv?kaGD?g4iJyAY%6V>=D{k~iq%Fk}Bm8_IXvgzMk6R)DR>jUu)h@vS)A zSa|~?QHfovJk;f8ADV?{eY1C4r(sYubcGVaEeZujD7F@gp`sC-MsR|9CKSy%FQ0~C zC3xs45SuC6p?=@UE7?ukBgv{(#O{&J>3A*Z67e`4Lvda=%@P5$<8{G=6|X_QaOwe$r)4hOw~XOF*m{5;WEI9WLNOj+JQ z%R6m)r<>Vx@15_`t;C|4Sp3OoEv=bLYv+kIaHbWRHzV_>j2RJ5rB-sqOs@Pq-nzeG z!Y{dDh97o)nwhOFUT`sMat3MCnwUa5W+eslu$>L~E$fB6wvps652<@CzckD z0iZqEl54+Rr5+KgO F{{Rmav-AJ} literal 0 HcmV?d00001 diff --git a/__pycache__/measurements.cpython-312.pyc b/__pycache__/measurements.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f94a016b3414e8e6d20781e31cda89ea028955d1 GIT binary patch literal 2253 zcma)7O>7%Q6rLH|>#Y;J#IBQ8O;W3*O_wTm+7#3SN)aH1NR zQW=>c23sbE$2_*}al@qoHL7{{QAlQ7l}lM$XuSr^Ix$7A6faQu9>hu@Qv{mJ1(Ja~4!k|&kST@g<=4071k7cvAj`oaN{VLh!min$i) zBGFMVh5=Gu3Ww%}K0;s}c(}usJ4Et|)OF|HF%0&=v)!%)VqqO(*bv(td2u3Aa_8-~ z2p*kG_Hnr;ACg>meo1!vzqb6>&`EUjf$MMTGtxxJKContvp`OhZY?C`7$P)6U|mjMjAnoF6dcq-fpkBnYK(JJE{bO;{gsz^IB#hD@w5NP-3wcQ;A#U zqM1nBg|wA;x16a8P$gz^c4CI-jCab0X(bNhEncZPs;=isIa}8kqDM?p9fa7{=RoS@ zX@96bwmkl{KX}hronM(>nMLtHC6SS4_+le`ant_c&eokDr*^{Ez%p^rPfna|MkX7P z$;Xk)pozoU6IwGe-H1#-9Q%3vr}0PWoyeT9gh*(x860f{N538We*C-f&CE^^e7?NU zg52at2OxGu2V8MGpeN$lq(Ay;m(gI?A9An7qR%0hD`^4xQDg78M02H98Mg*u1~q zf@cnHnG#%Yy6yyYy;wG?1?2m6{dP57Xj}Zc4$q&i^C58KXOZBBaRkg35m5!gxEHlZ z@Zqse0a+%$(~%ZC#ipKLJ;p9SKS|k0OQCGg^}@AUpW`c4i*VzyQpFi4rfvMQLhdG9 zg2*{ad-hZcHpeF9_)75sB>2WSO8I6Un?j_IqZ)xFN_wHb>HgF-$FsyEw_XME%tI;N fCE-8GnLRSFN20rAc$XYMP~voO?Tx<)Od`lXj}y1B literal 0 HcmV?d00001 diff --git a/__pycache__/zerocross_meas.cpython-312.pyc b/__pycache__/zerocross_meas.cpython-312.pyc index 46bbb66d9d152643e6f7b7a650f87ae3c151ae25..1b548f42e684f640daa514619b61fb9a247e1e3c 100644 GIT binary patch delta 642 zcmZutziSjh6rP#go87xycJG%M3zJi>nJWT9nn+MY5rS}q$Q4`U5^v_@;wG!Jm%zmX zS2mOhj2qcR|y0jsOjg{~1ajAST-@JMA-uJ%u&I`x3^J{uKN5I}J zZFj%ZJtw$B@d-A%4X{rX@u(yolhiXL8xqfy24F^-fV`g(eD8-?nG|6mgJZxMRRQ*i zqyy3dZ)}pm>ngiXgwfDg@K~@U({Ba7Ow5kI_TrExW~ls5h`I45TfJWaCn6V|6pB%8 zSO>?gM70lMgv4#+nAnwoCPXFz;-7przA&t}`2m&m(Cwy9P%t}o$I^;EmJb8ScIpsj;2Y;CBuaDE&vK}uK$h{&06T#zq7KF@vh z-g&#X-me_cg9l$TCvG`f7%rZ<1sJQY^YJ(Sq$X$sH}gt&H+!%dtzK&z*-+=Ww=Twx zbz^Q8qfXl6H?uyOU$URG$E>9D5NZf3Zd&sXr@+@PLJ{DQq@U>k+QcXVP8#B_hvbyr zykwkJE=x8mj%Fw;gQz3x?n07VUVhr@bp4*v2@jsH!{}p%>qvtwQ`W!s(ncV+e05J( S<3)SUouTF3<{tuAn)DAq3WS;f literal 2151 zcmZuy&2Jk;6rb5$uRr1>j-8LDBB=`@)NNX;B2a-)sf4A(QW7da9IQ$!*SijO{gv5` z8e2KIm7~Tdrza;|0ul$JAaUW)KLLpgDWIB750wy7bBk)=&=c>?de=?rk^JU;&U^Fb z_twAk_xlK}|E5vxP)2w;*#A#%TqpKbDxkrwq%5CE<0><-Mx2}s`!Jn z->C{Jf|{*WCK1=t5f;zTdh|1ph+qn79e$~ZpJ7&0FhDd4retLDnkl83wqm-GDqx^x z(^XcAIn@+1>YC|`$3IijnVg|9a{&3P%BM`#n6hxw^eo)8ED_O^bS;@+$*KB=~0wSA!8^?W$cvE zHh3{h5=fP_`~%gg+B+?O|EAhlt}oZ)mS|}Q20@CnI@?eXq?uNqAGYb%U;ws@t$y^p z@HF_wli;O;;HB@4AMftnee~|{!H=s`8<*RVgq%PYUXCN{J7{&2AVzv(2__9J4tnq$ zYu$;#3;o2gWvkHB!IGmSSqC*;-8$Xx;1k~7iGg^?cY3Mx4&-N3V094J^#LnZGO|wA zXx87=+ng#?`r+<^;vkvdb-=cF_lkAbKv!dPJi`p+?{Pk8dqi|*5MP)t-Y2IIIJvLX z)AL^7;Y?zgz*LA!d>|O!BjRIN3d3$O96125p_SMm%2*B?LV}m%SZ2@yIDw78X3{kt zY~!1aqSsjT6* zi%I5+^XL?kjJ-UyK_5pkL9;of#Ig-p=Wz`_u9_2gTR~BSS{WPjls5nh>z7UaA>3{ zKa{Jp8y_A|5IM}wK$WQutbip1c@A>C9e}(i#6Kr{bSXl4i}omQk&c03t1;NQ*BXOg zng|$ldq04gIpOt^={mM20al0Rq|ADZ%Pes-TOzU!lj6?3>HGN&u>_O^5FNXkj!g}V)_&% zUsP9f$omy#Wi^@WSlo&N|5}Q|#vqns#;Pg|;vV6bx4I^w9SLGy$M)CApLC)v_=Fqu z#hHLG_TmB+LTwp{6^70cujwkR=HcTh6iVh$K53M4MI)EF4c}AbOu4g*rJP}k@R!Mg z5N687+gUAT@PzDb&~z(#>G{aI%XM}c4A?mx+j=ZgN)Ji!Z*uOC_zua?KhiV}ZGHJK IfsKd%4;w3=ApigX diff --git a/fft_meas.py b/fft_meas.py index 3bf0318..49f5cc6 100644 --- a/fft_meas.py +++ b/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() \ No newline at end of file diff --git a/fundamental_freq_meas.py b/fundamental_freq_meas.py new file mode 100644 index 0000000..e39a88a --- /dev/null +++ b/fundamental_freq_meas.py @@ -0,0 +1,51 @@ +import numpy as np +import matplotlib.pyplot as plt + + +class fundamental_freq_meas(object): + """docstring for fft_meas""" + def __init__(self, fs=50e3, tn=10): + self.fs = fs + self.ts = 1/self.fs + self.tn = tn + self.time = 0 + self.y_old = 0 + self.tn_start_time = 0 + self.tn_end_time = 0 + self.zerocross_count = 0 + # Calculated Frequency + self.freq = 50 + + self.t_zc = 0 + + def step(self, y, zerocross_flag): + + # Integrate time + self.time += self.ts + + if zerocross_flag: + denom = (y - self.y_old) + if denom != 0.0: # avoid divide-by-zero + # linear interpolation to find zero-crossing time + frac = -self.y_old / denom + self.t_zc = (self.time - self.ts) + frac * self.ts + + # store first crossing time + if self.zerocross_count == 0: + self.tn_start_time = self.t_zc + + self.zerocross_count += 1 + self.tn_end_time = self.t_zc # always keep last crossing time in this window + + # window finished (independent of whether a crossing happened exactly here) + if self.time >= self.tn: + if self.zerocross_count >= 2 and self.tn_end_time > self.tn_start_time: + self.freq = (self.zerocross_count - 1) / (self.tn_end_time - self.tn_start_time) + + # reset window state + self.zerocross_count = 0 + self.tn_start_time = 0.0 + self.tn_end_time = 0.0 + self.time -= self.tn # avoids drift vs. self.time = 0 + + self.y_old = y diff --git a/main.py b/main.py index baac427..03b4774 100644 --- a/main.py +++ b/main.py @@ -1,7 +1,6 @@ import numpy as np -import fft_meas -import zerocross_meas +import measurements # to do @@ -12,33 +11,38 @@ import zerocross_meas def main(): time = 0 delta_t = 1e-6 - t_stop = 1.1 + t_stop = 1.2 + + ADC_sample_frequency = 50e3 + ADC_sample_period = 1/ADC_sample_frequency + ADC_timer = 0 amplitude = 1 - base_freq = 50 + base_freq = 60 + Meas_ADC = measurements.measurements(fs=ADC_sample_frequency) - fft_measurements = fft_meas.fft_meas(fs=50e3, tn=0.2) - zerocross = zerocross_meas.zerocross_meas(fs=50e3, tn=1) for i in range(0, int(t_stop/delta_t)+1): + + Ph1 = np.sin(2*np.pi*time*base_freq) - zerocross.step(x=Ph1, time=time) + if time - ADC_timer >= ADC_sample_period: + ADC_timer += ADC_sample_period - fft_measurements.step(data=Ph1, time=time, f_H1=zerocross.freq, unit="I") + Meas_ADC.Interupt(Ph1) time += delta_t + Meas_ADC.print() + Meas_ADC.plot() - zerocross.print() - #fft_measurements.plot() - diff --git a/measurements.py b/measurements.py new file mode 100644 index 0000000..2b0652e --- /dev/null +++ b/measurements.py @@ -0,0 +1,58 @@ +import numpy as np +import matplotlib.pyplot as plt + +import IIR_filter + +import zerocross_meas +import fundamental_freq_meas +import fft_meas + + +class measurements(object): + """docstring for fft_meas""" + def __init__(self, fs=50e3): + # Sample Frequency + self.fs = fs + # Sample Period + self.ts = 1/self.fs + + # Low Pass Filter + # fs = Sample Frequency, fc = LP Cutoff Frequency + self.LPfilter = IIR_filter.IIR_1_Order_LP(fs=self.fs, fc=200) + + + + # Zero Crossing Algorithem + # fs = Sample Frequency, fc = LP Cutoff Frequency + self.zerocross = zerocross_meas.zerocross_meas() + + # Fundamental Frequency Algorithem + # fs = Sample Frequency, tn = Time Period for calculations + self.base_freq = fundamental_freq_meas.fundamental_freq_meas(fs=self.fs, tn=1) + + # FFT Algorithem + # fs = Sample Frequency, tn = Time Period for calculations + # 61000-4-7 says 200ms + # 10-cycles for 50Hz + # 12-cycles for 60Hz + self.fft = fft_meas.fft_meas(fs=self.fs, tn=0.2) + + + def Interupt(self, y): + + # Filter Input + y_hat = self.LPfilter.step(y) + # Zerocross detection (self.zerocross.flag) + self.zerocross.detect(y_hat) + # Calculate the Fundamental frequency (self.base_freq.freq) + self.base_freq.step(y_hat, self.zerocross.flag) + # Calculate the FFT of the signal + self.fft.step(y, self.base_freq.freq, unit="I") + + + def print(self): + print(self.base_freq.freq) + + def plot(self): + self.fft.plot_Y_H() + diff --git a/zerocross_meas.py b/zerocross_meas.py index 9c8e432..924696d 100644 --- a/zerocross_meas.py +++ b/zerocross_meas.py @@ -6,35 +6,25 @@ import IIR_filter class zerocross_meas(object): """docstring for fft_meas""" - def __init__(self, fs=50e3, tn=1): - self.fs = fs - self.ts = 1/self.fs - self.tn = tn - self.time = 0 - self.freq = 0 - self.freq_ts = 0 - self.y = 0 + def __init__(self): + + # Old value self.y_old = 0 - self.idx = 0 - self.LPfilter = IIR_filter.IIR_1_Order_LP(fs=self.fs, fc=200) - def step(self, x, time): - - if time - self.time > self.ts: - self.time = time - self.y = self.LPfilter.step(x) - - if self.y_old < 0 and self.y > 0: - self.idx += 1 + # Zerocross flag + self.flag = False - if time - self.freq_ts > self.tn: - self.freq = self.idx / self.tn - self.freq_ts = time - self.idx = 0 + def detect(self, y): + self.flag = 0 + + # If positive zerocross is detected + if self.y_old < 0 and y > 0: + self.flag = True + + self.y_old = y - self.y_old = self.y def print(self):