How to add a horizontal line in a plot that corresponds to a maximum?

6 次查看(过去 30 天)
movRMS = dsp.MovingRMS
% The Signal Codes (assume no noise)
t = (0:0.0001:1); % signal duration : 1s
a = 0.60; % the decrease of rms voltage range from 0.1 pu to 0.9 pu (10% to 90% decreased)
w = 100; % the phase angle jump ( ex. 50, 100, 170)
t = (0:0.0001:1); % signal duration : 1s
a = 0.60; % the decrease of rms voltage range from 0.1 pu to 0.9 pu (10% to 90% decreased)
f = 50; % frequency
ti = 0.10; % initiation
tr = 0.50; % recovery (duration: 0.4s)
y = (1 - a*(heaviside(t-ti) - heaviside (t-tr))).*(sin(2*pi*f*t+w)); % heaviside is the unit step
rmsval = 2*movRMS(y) % RMS detection code
% Plot Disturbance waveform
figure (1)
subplot(2,1,1)
plot (t,y)
xlabel('Time (s)')
ylabel('Amplitude (pu)')
title('Voltage Sag')
% Plot RMS waveform
subplot(2,1,2)
plot (t,rmsval)
xlabel('Time (s)')
ylabel('Magnitude (pu)')
title('RMS Detection')
Edit: I would like to add a horizontal line (blue horizontal line in figure 2) corresponding to the maximum value of the waveform which only change when the peak amplitude also changes as you can see in figure 2. I also attached my simulation result in figure 1. Thank you for your attention.
Figure 1 : My simulation
Figure 2 : Sag voltage with RMS Detection
  4 个评论

请先登录,再进行评论。

回答(2 个)

Sam Chak
Sam Chak 2022-6-11
No worries, I take your samples. Generally, you need to guess the function of a curve that might fit into the peaks:
% find peaks
[pks, locs] = findpeaks(y, t);
pks = [pks(1:25) pks(27:31)];
locs = [locs(1:25) locs(27:31)];
% curve fitting
fo = fitoptions('Method', 'NonlinearLeastSquares', ...
'Lower', [1e44, 0.2], ...
'Upper', [1e46, 0.4], ...
'StartPoint', [1.5e44 0.3]);
ft = fittype('1 - 0.6*exp(-b*(x - c)^64)', 'options', fo);
[curve, gof] = fit(locs', pks', ft)
% plotting
plot(t, y)
axis([0 0.6 -1.5 1.5])
hold on
plot(curve)
hold off

Star Strider
Star Strider 2022-6-11
Another option is the envelope function —
movRMS = dsp.MovingRMS;
% The Signal Codes (assume no noise)
t = (0:0.0001:1); % signal duration : 1s
a = 0.60; % the decrease of rms voltage range from 0.1 pu to 0.9 pu (10% to 90% decreased)
w = 100; % the phase angle jump ( ex. 50, 100, 170)
t = (0:0.0001:1); % signal duration : 1s
a = 0.60; % the decrease of rms voltage range from 0.1 pu to 0.9 pu (10% to 90% decreased)
f = 50; % frequency
ti = 0.10; % initiation
tr = 0.50; % recovery (duration: 0.4s)
y = (1 - a*(heaviside(t-ti) - heaviside (t-tr))).*(sin(2*pi*f*t+w)); % heaviside is the unit step
rmsval = 2*movRMS(y); % RMS detection code
yenv = envelope(y, 500, 'analytic');
rmsenv = envelope(rmsval, 85, 'peak');
% Plot Disturbance waveform
figure (1)
subplot(2,1,1)
plot (t,y)
hold on
plot(t, yenv, '-r', 'LineWidth',2)
hold off
xlabel('Time (s)')
ylabel('Amplitude (pu)')
title('Voltage Sag')
% Plot RMS waveform
subplot(2,1,2)
plot (t,rmsval)
hold on
plot(t, rmsenv, '-r', 'LineWidth',2)
hold off
xlabel('Time (s)')
ylabel('Magnitude (pu)')
title('RMS Detection')
.

产品


版本

R2021a

Community Treasure Hunt

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

Start Hunting!

Translated by