How can I disregard part of the signal when calculating midline of my data signal?

1 回表示 (過去 30 日間)
I have a waveforem that starts regular oscillations after like 2 seconds of running the program. How can I get midline of the remaining signal after T=2, so basically disreagrading the first 2 seconds of the output wave. Also, is there an easy way to find frequency of this signal(Again while disregarding the first 2 seconds of wave)?I have attached a sample wave for reference.
Currently I am just using:
lnsig=length(y);
midline = mean(y)*ones(1,lnsig)
Also, if there's a way that I can keep changing the time after which I calculate for midline that would be great!

採用された回答

Mathieu NOE
Mathieu NOE 2022 年 11 月 14 日
hello
see code below for midline and signal oscillation frequency computation (cycle to cycle "zero" crossing detection)
a PID tuning problem ?
data = extract_data_from_figures('2.fig');
VN = data.names;
data = data.Y;
% {'X' }
% {'midline'}
% {'target' }
% {'y vs x' }
x = data(:,1);
y_target = data(:,3);
y = data(:,4);
idx = (x>=1); % valid data for t > 1 s
midline = mean(y(idx));
%%find frequency of this signal
threshold = midline; %
t0_pos1 = find_zc(x,y,threshold);
period = diff(t0_pos1); % delta time of crossing points
freq = 1./period; % signal frequency
figure(1)
subplot(2,1,1),plot(x,y,'b',x,y_target,'g',x(idx),midline*ones(size(x(idx))),'k--',t0_pos1,midline*ones(size(t0_pos1)),'dr','Linewidth',2);
legend('signal','target','midline','crossing points');
xlabel('Time(s)')
subplot(2,1,2),plot(t0_pos1(2:end),freq,'b.-','linewidth',2,'markersize',12);grid on
xlim([min(x) max(x)]);
legend('signal rate (frequency)');
xlabel('Time(s)')
ylabel('Freq(Hz)')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [Zx] = find_zc(x,y,threshold)
% positive slope "zero" crossing detection, using linear interpolation
y = y - threshold;
zci = @(data) find(diff(sign(data))>0); %define function: returns indices of +ZCs
ix=zci(y); %find indices of + zero crossings of x
ZeroX = @(x0,y0,x1,y1) x0 - (y0.*(x0 - x1))./(y0 - y1); % Interpolated x value for Zero-Crossing
Zx = ZeroX(x(ix),y(ix),x(ix+1),y(ix+1));
end
function data = extract_data_from_figures(filename)
%%
%
% Input : File name <filename.fig>
% with multiple plots in a single file
% Output : struct data
% : data.names contains names of the display object Yvalues
% : data.Y contains the actual plot values withthe first column
% containing the x-values
%
% Written by Chetanya Puri, 2019
% Last Modified: Nov 6, 2019
%
fig = openfig(filename); % Open figure and assign it to fig object
dataObjs = findobj(fig,'-property','YData'); % Find all graphic objects with YData, in our case line values
xval = dataObjs(1).XData; % Find the X-axis value
Ymat = [xval(:)]; % Create a matrix with first column of x values
for i=1:length(dataObjs)
legend_name{i,1} = dataObjs(i).DisplayName;
yval = dataObjs(i).YData;
Ymat = [Ymat yval(:)]; % Keep appending column vectors
end
close(fig); % close the figure
data.names = ['X';legend_name];
data.Y = Ymat;
end
  4 件のコメント
Smriti Mohan Shetty
Smriti Mohan Shetty 2022 年 11 月 16 日
Can I also find time period of wave, after 1 second?
Mathieu NOE
Mathieu NOE 2022 年 11 月 16 日
yes this is done by the code above

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

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeScopes and Data Logging についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by