From 9b99ac6ba842bd473dd3045427e70436dd7f488c Mon Sep 17 00:00:00 2001 From: Maximilian Eibl Date: Wed, 12 Nov 2025 17:11:10 +0100 Subject: [PATCH] first commit --- Matlab 1/script.m | 100 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 Matlab 1/script.m diff --git a/Matlab 1/script.m b/Matlab 1/script.m new file mode 100644 index 0000000..61624be --- /dev/null +++ b/Matlab 1/script.m @@ -0,0 +1,100 @@ +%% --- 1.1 Vorgegebene Parameter --- +f_grund = 50; % Grundfrequenz in Hz +T = 1 / f_grund; % Periodendauer in Sekunden (20 ms) +U_DC = 100; % DC-Versorgungsspannung in V +t_schaltpunkte = [0, 1.7e-3, 3.4e-3, 8.3e-3, 10.0e-3, 11.7e-3, 13.4e-3, 18.3e-3, T]; +U_out = [0, U_DC/2, U_DC, U_DC/2, 0, -U_DC/2, -U_DC, -U_DC/2]; + +%% --- 1.2 Periodisches Signal über 40 Perioden erstellen --- +% (Rationaler Ansatz: Vektorisierte Operation) +Anzahl_Perioden = 40; +T_total = Anzahl_Perioden * T; + +% Hohe Abtastfrequenz für genaue Auflösung der Schaltflanken +fs = 1e6; % 1 MHz Abtastfrequenz +ts = 1 / fs; +t = 0:ts:(T_total - ts); + +% Vektorisierte Signalerzeugung +t_mod = mod(t, T); +y = interp1(t_schaltpunkte(1:end-1), U_out, t_mod, 'previous', U_out(end)); + +% --- WICHTIG: DC-Anteil entfernen --- +% Der THD bezieht sich auf die AC-Komponenten. +% Ein DC-Anteil (bei 0 Hz) würde die FFT verfälschen. +y = y - mean(y); + +%% --- 2. THD-Berechnung (Standard-MATLAB via FFT) --- +% (Analytischer Ansatz) + +fprintf('Berechne THD manuell mittels FFT...\n'); + +% 2.1 FFT durchführen +L = length(y); % Länge des Signals (Anzahl Abtastpunkte) +Y = fft(y); % FFT des Signals berechnen + +% 2.2 Einseitiges Amplitudenspektrum berechnen +% Wir brauchen die Amplituden, nicht die komplexen FFT-Werte +P2 = abs(Y/L); % Zweitseitiges Spektrum (normiert auf Länge) +P1 = P2(1:floor(L/2)+1); % Einseitiges Spektrum +P1(2:end-1) = 2*P1(2:end-1); % Amplituden verdoppeln (außer DC und Nyquist) + +% 2.3 Frequenzvektor erstellen +f_vec = fs*(0:floor(L/2))/L; + +% 2.4 Frequenzauflösung (Delta-F) der FFT +% Da wir exakt 40 Perioden (0.8s) bei 1MHz Fs analysieren, ist L = 800000 +% delta_f = fs / L = 1e6 / 800000 = 1.25 Hz +delta_f = fs / L; + +% 2.5 Amplituden der Harmonischen extrahieren +% Wir definieren, wie viele Harmonische wir betrachten (z.B. N=50 -> 2.5 kHz) +N_Harmonische = 50; +V_amplituden = zeros(1, N_Harmonische); + +for k = 1:N_Harmonische + f_k = k * f_grund; % Frequenz der k-ten Harmonischen (50, 100, 150...) + + % Finde den exakten Index (Bin) im Frequenzvektor + % +1, da MATLAB 1-indiziert ist und f_vec(1) = 0 Hz (DC) + idx_k = round(f_k / delta_f) + 1; + + % Prüfen, ob der Index im Spektrum liegt (Schutz vor Nyquist-Grenze) + if idx_k <= length(P1) + V_amplituden(k) = P1(idx_k); + else + % Falls f_k > fs/2, brich ab + break; + end +end + +% 2.6 THD berechnen +V_grund = V_amplituden(1); % Amplitude der Grundschwingung (V1) + +% Summe der quadrierten Amplituden der Oberschwingungen (V2, V3, ...) +P_harm_sum = sum( V_amplituden(2:end).^2 ); + +% THD-Formel anwenden +V_harm_rms = sqrt(P_harm_sum); +thd_linear = V_harm_rms / V_grund; + +% Umrechnung in Prozent und dB +thd_prozent = thd_linear * 100; +thd_dB = 20 * log10(thd_linear); + +fprintf('----------------------------------------------\n'); +fprintf('MANUELLE BERECHNUNG (Standard-FFT):\n'); +fprintf('Grundschwingung (V1 bei %.1f Hz): %.2f V\n', f_grund, V_grund); +fprintf('RMS der Oberschwingungen (V2-V%d): %.2f V\n', N_Harmonische, V_harm_rms); +fprintf('Total Harmonic Distortion (THD) (in %%): %.2f %%\n', thd_prozent); +fprintf('Total Harmonic Distortion (THD) (in dB): %.2f dB\n', thd_dB); +fprintf('----------------------------------------------\n'); +THD=thd_prozent; +%% --- 3. Optionale Visualisierung (zur Überprüfung) --- +figure; +stem(f_vec(1:idx_k), P1(1:idx_k)); % Zeige Spektrum bis zur N-ten Harmonischen +title('Einseitiges Amplitudenspektrum (Standard-FFT)'); +xlabel('Frequenz (Hz)'); +ylabel('Spannung (V)'); +xlim([0, f_vec(idx_k) + f_grund]); % Etwas über die letzte Harmonische hinaus zoomen +grid on; \ No newline at end of file