Plotting one cycle of a wave
11 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
[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 Kommentar
Antworten (2)
Omer Yasin Birey
am 18 Dez. 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 Kommentare
Omer Yasin Birey
am 18 Dez. 2018
Bearbeitet: Omer Yasin Birey
am 18 Dez. 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
am 20 Sep. 2020
Bearbeitet: Walter Roberson
am 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 Kommentar
Walter Roberson
am 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.
Siehe auch
Kategorien
Mehr zu Annotations finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!