How to plot the magnitude and phase of this Fourier Transform frequency response

조회 수: 4 (최근 30일)
Hello ,
I want to write code in MATLAB to get the same plot please. I've tried to learn how to get this plot but I didn't find anything.
I have 3 inductors 478 µH. but I couldn't get the plot looking same.
This is the code that I have created with some help of chat GPT :
%% 1) Define the frequency range for analysis
f = logspace(1, 5, 500); % Frequency in Hz
w = 2*pi*f; % Angular frequency
% Given Parameters
Lb = 478e-6; % Phase inductance in H (Lb1 = Lb2 = Lb3)
Cb = 880e-6; % Output capacitance in F
R = 0.1; % Example ESR or sense resistor
% Control Gains (Placeholder values, adjust for your system)
K_v_gain = 1; % Voltage gain
K_i_gain = 1; % Current gain
K_i_fltr = 1; % Current filter gain
G_d = 1; % Duty cycle transfer function
%% 2) Define s-domain variable and transfer functions
s = tf('s');
Zi = R + s*Lb; % Impedance of the inductor
% Corrected Current Loop Transfer Function (Hp-i)
Hp_i = 3 * (1 / K_v_gain) * K_i_gain * K_i_fltr * G_d * (1 / Zi);
%% 3) Bode plot of the modeled open-loop gain
figure('Name','Modeled Open Loop Gain','NumberTitle','off');
bode(Hp_i, {2*pi*10, 2*pi*1e5}); % Bode plot from 10 Hz to 100 kHz
grid on;
title('Current Open-Loop Gain (Modeled)');
%% 4) Compare with measured data (if available)
% Replace with actual measured data if available
freq_meas = [10, 100, 1e3, 10e3, 100e3]; % Hz (example)
mag_meas_dB = [-5, -2, 0, -3, -10]; % dB (example)
phase_meas_deg= [ 0, -30, -60, -90, -120]; % deg (example)
% Extract the model’s magnitude and phase at the same measured frequencies
[mag_model, phase_model] = bode(Hp_i, 2*pi*freq_meas);
% Convert the magnitude (which is dimensionless) to dB
mag_model_dB = 20*log10(squeeze(mag_model));
phase_model_deg = squeeze(phase_model);
%% 5) Plot measured vs. modeled (Magnitude & Phase)
figure('Name','Open Loop Gain Comparison','NumberTitle','off');
subplot(2,1,1); % Magnitude subplot
semilogx(freq_meas, mag_meas_dB, 'bo-', 'LineWidth',1.5, 'MarkerSize',6);
hold on;
semilogx(freq_meas, mag_model_dB, 'rx--', 'LineWidth',1.5, 'MarkerSize',6);
grid on; xlabel('Frequency (Hz)'); ylabel('Magnitude (dB)');
legend('Measured','Modeled','Location','Best');
title('Current Open-Loop Gain: Magnitude');
subplot(2,1,2); % Phase subplot
semilogx(freq_meas, phase_meas_deg, 'bo-', 'LineWidth',1.5, 'MarkerSize',6);
hold on;
semilogx(freq_meas, phase_model_deg, 'rx--', 'LineWidth',1.5, 'MarkerSize',6);
grid on; xlabel('Frequency (Hz)'); ylabel('Phase (deg)');
legend('Measured','Modeled','Location','Best');
title('Current Open-Loop Gain: Phase');
[EDIT] formatted code as code and ran it.

채택된 답변

Mathieu NOE
Mathieu NOE 2025년 2월 20일
hello
well the code seems to work and the model plot (in red) looks good / in match with your publication
maybe the K -gains) must be also adjusted
simply the experimental values used in the code are off - you may need to put he right data here
%% 1) Define the frequency range for analysis
f = logspace(1, 5, 500); % Frequency in Hz
w = 2*pi*f; % Angular frequency
% Given Parameters
Lb = 478e-6; % Phase inductance in H (Lb1 = Lb2 = Lb3)
Cb = 880e-6; % Output capacitance in F
R = 0.1; % Example ESR or sense resistor
% Control Gains (Placeholder values, adjust for your system)
K_v_gain = 1; % Voltage gain
K_i_gain = 1; % Current gain
K_i_fltr = 1; % Current filter gain
G_d = 1; % Duty cycle transfer function
%% 2) Define s-domain variable and transfer functions
s = tf('s');
Zi = R + s*Lb; % Impedance of the inductor
% Corrected Current Loop Transfer Function (Hp-i)
Hp_i = 3 * (1 / K_v_gain) * K_i_gain * K_i_fltr * G_d * (1 / Zi);
%% 3) Bode plot of the modeled open-loop gain
figure('Name','Modeled Open Loop Gain','NumberTitle','off');
bode(Hp_i, {2*pi*10, 2*pi*1e5}); % Bode plot from 10 Hz to 100 kHz
grid on;
title('Current Open-Loop Gain (Modeled)');
%% 4) Compare with measured data (if available)
% Replace with actual measured data if available
freq_meas = [10, 100, 1e3, 10e3, 100e3]; % Hz (example)
mag_meas_dB = [-5, -2, 0, -3, -10]; % dB (example)
phase_meas_deg= [ 0, -30, -60, -90, -120]; % deg (example)
% Extract the model’s magnitude and phase at the same measured frequencies
[mag_model, phase_model] = bode(Hp_i, 2*pi*freq_meas);
% Convert the magnitude (which is dimensionless) to dB
mag_model_dB = 20*log10(squeeze(mag_model));
phase_model_deg = squeeze(phase_model);
%% 5) Plot measured vs. modeled (Magnitude & Phase)
figure('Name','Open Loop Gain Comparison','NumberTitle','off');
subplot(2,1,1); % Magnitude subplot
semilogx(freq_meas, mag_meas_dB, 'bo-', 'LineWidth',1.5, 'MarkerSize',6);
hold on;
semilogx(freq_meas, mag_model_dB, 'rx--', 'LineWidth',1.5, 'MarkerSize',6);
grid on; xlabel('Frequency (Hz)'); ylabel('Magnitude (dB)');
legend('Measured','Modeled','Location','Best');
title('Current Open-Loop Gain: Magnitude');
subplot(2,1,2); % Phase subplot
semilogx(freq_meas, phase_meas_deg, 'bo-', 'LineWidth',1.5, 'MarkerSize',6);
hold on;
semilogx(freq_meas, phase_model_deg, 'rx--', 'LineWidth',1.5, 'MarkerSize',6);
grid on; xlabel('Frequency (Hz)'); ylabel('Phase (deg)');
legend('Measured','Modeled','Location','Best');
title('Current Open-Loop Gain: Phase');

추가 답변 (0개)

커뮤니티

더 많은 답변 보기:  Power Electronics Community

카테고리

Help CenterFile Exchange에서 Classical Control Design에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by