Plotting one cycle of a wave
    10 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
[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 comentario
Respuestas (2)
  Omer Yasin Birey
      
 el 18 de Dic. de 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 comentarios
  Omer Yasin Birey
      
 el 18 de Dic. de 2018
				
      Editada: Omer Yasin Birey
      
 el 18 de Dic. de 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
 el 20 de Sept. de 2020
        
      Editada: Walter Roberson
      
      
 el 20 de Sept. de 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 comentario
  Walter Roberson
      
      
 el 20 de Sept. de 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.
Ver también
Categorías
				Más información sobre Annotations en Help Center y File Exchange.
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!




