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

6 ビュー (過去 30 日間)
Irfanudin Nor Anwar
Irfanudin Nor Anwar 2022 年 6 月 11 日
回答済み: Star Strider 2022 年 6 月 11 日
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 件のコメント
Jeffrey Clark
Jeffrey Clark 2022 年 6 月 11 日
@Irfanudin Nor Anwar, use Find local maxima - MATLAB islocalmax (mathworks.com) and create the blue line plot from spline of the local maxima and ppval the spline to get the y values of the blue line.
Irfanudin Nor Anwar
Irfanudin Nor Anwar 2022 年 6 月 11 日
@Jeffrey Clark Thanks, I will read them and try it.

サインインしてコメントする。

回答 (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
  1 件のコメント
Irfanudin Nor Anwar
Irfanudin Nor Anwar 2022 年 6 月 11 日
@Sam Chak Thank you for the help, I will study your code and make some adjustment later.

サインインしてコメントする。


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')
.

カテゴリ

Help Center および File ExchangeDescriptive Statistics についてさらに検索

製品


リリース

R2021a

Community Treasure Hunt

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

Start Hunting!

Translated by