Plotting one cycle of a wave
10 views (last 30 days)
Show older comments
[sig, fs] = audioread(x);
modfreq = 4;
depth = 100;
a = depth/200;
offset = 1 - a;
len = 1:length(sig);
phasor = a*sawtooth(2*pi*len*(modfreq/fs)) +offset;
I'm generating a wave for a tremolo. I know how to plot the entire wave(at the length of the input signal), however I would like to be able to plot just a single cycle.
I found an answer in a previous question:
fs = 512; % Sampling frequency (samples per second)
dt = 1/fs; % seconds per sample
StopTime = 0.25; % seconds
t = (0:dt:StopTime)'; % seconds
F = 60; % Sine wave frequency (hertz)
data = sin(2*pi*F*t);
plot(t,data)
%%For one cycle get time period
T = 1/F ;
% time step for one time period
tt = 0:dt:T+dt ;
d = sin(2*pi*F*tt) ;
plot(tt,d) ;
However, it generates a second wave at a shorter length. I would like to be able to plot just one cycle of the original wave without creating a second.
Does anyone know how to do this?
Thanks in advance.
1 Comment
Answers (2)
Omer Yasin Birey
on 18 Dec 2018
I believe axis() would work. I wrote an example code with a signal which has cycles.
x = 1:100;
signal = (1-cos(2*pi*0.01*x)).*sin(2*pi*0.15*x);%signal with cycles
plot(signal,'r-')
[peak,locs] = findpeaks(-signal); % Find Minimas
%you can use loop to plot every single cycle. it is just for the first one
firstInd = locs(1);%use a minima and the next one to find cycle limits
lastInd = locs(2);
%limit the plot with the start and end of the both x and y axes
axis([firstInd lastInd -peak(1) peak(2)])
2 Comments
Omer Yasin Birey
on 18 Dec 2018
Edited: Omer Yasin Birey
on 18 Dec 2018
I think length(tt) is the problem here. Because you start from 0 to length(tt), which means the whole range of signal and tt might have a very long sequence. Finding the 2 minimas, left and right, which are bounding a cycle still seems the possible solution to me.
T = 1/modfreq ;
dt = 1/fs;
tt = 0:dt:T+dt ;
[peak,locs] = findpeaks(-signal);
for i = 1:2:length(locs)-2
figure
firstInd = locs(i);
lastInd = locs(i+1);
plot(app.UIAxes, len, wave)
axis([firstInd lastInd -peak(i) peak(i+1)])
end
This code above should plot all the cycles seperately.
Rohan Basak
on 20 Sep 2020
Edited: Walter Roberson
on 20 Sep 2020
T = 1/modfreq ;
dt = 1/fs;
tt = 0:dt:T+dt ;
[peak,locs] = findpeaks(-signal);
for i = 1:2:length(locs)-2
figure
firstInd = locs(i);
lastInd = locs(i+1);
plot(app.UIAxes, len, wave)
axis([firstInd lastInd -peak(i) peak(i+1)])
end
1 Comment
Walter Roberson
on 20 Sep 2020
Rohan Basak:
Why are you create a new figure each time, even though you are plotting on a fixed axes?
Note also that the axis() command you are using is going to apply to the "current" axis, which is going to be a newly generated axes in the newly generated figure.
See Also
Categories
Find more on Annotations in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!